4

音楽を再生するアプリケーションがあります。

次のコードを使用して、MPMusicPlayerController からの再生状態の変化をリッスンし、UI を更新しています。より正確には、再生ボタンの外観を再生と一時停止の間で切り替えます。

NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

[notificationCenter addObserver: self
                       selector: @selector (handle_NowPlayingItemChanged:)
                           name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification
                         object: self.musicPlayer];

[notificationCenter addObserver: self
                       selector: @selector (handle_PlaybackStateChanged:)
                           name: MPMusicPlayerControllerPlaybackStateDidChangeNotification
                         object: self.musicPlayer];

[self.musicPlayer beginGeneratingPlaybackNotifications];

これは、iPod Touch (iOS 5)およびiPhone 3GS (iOS 5)でうまく機能します。再生状態が変化するたびに、次のコールバックを取得します。

[JBMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1

ここで、1 は を意味しMPMusicPlaybackStatePlayingます。

ただし、iPad 1 (iOS 5)iPad 2 (iOS 5)、またはiPad 3 (iOS 6)で同じものを実行すると、単一のコールバックではなく、次のシーケンスが得られます。

-[JBMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1
-[JBMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 2
-[JBMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1
-[JBMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 2

ここで 2 はMPMusicPlaybackStatePaused、曲が実際に再生されているため、アプリケーションが UI に間違った状態を表示することを意味し、原因となります。

面白いのは、たまにシーケンスが

-[JBMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1
-[JBMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 2
-[JBMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1
-[JBMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 2
-[JBMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1

これは 1 で正しく終了しMPMusicPlaybackStatePlayingますが、コールバックが交互の値で 5 回呼び出されることはまだ意味がありません。

これを解決する方法についてのアイデアや、問題を絞り込むために他にテストできることを提案してください。


これまでのところ回答を受け取っていないため、質問をApple Developer Forumにもクロスポストしました: https://devforums.apple.com/thread/158426

4

2 に答える 2

0

I think this is the same bug reported here:

Getting wrong playback state in MP Music Player Controller in ios 5

I posted a workaround for the bug in that question.

于 2012-11-18T20:41:00.513 に答える
0

currentPlaybackRate プロパティを使用して、実際の再生状態を確認できます。MPMusicPlaybackStatePaused はレート 0.0 に一致する必要があります。実装方法の例を以下に示します...

- (void)musicPlayerControllerPlaybackStateDidChangeNotification:(NSNotification *)notification {
    float playbackRate = [((MPMusicPlayerController *)notification.object) currentPlaybackRate];
    MPMusicPlaybackState playbackState = (MPMusicPlaybackState)[notification.userInfo[@"MPMusicPlayerControllerPlaybackStateKey"] integerValue];
    switch (playbackState) {
        case MPMusicPlaybackStatePaused:
            if (playbackRate <= .0f) {
                self.playbackState = playbackState;
            }
            break;
        default:
            self.playbackState = playbackState;
            break;
    }
}

したがって、誤った一時停止通知を遮断することができます。

于 2015-01-20T17:26:09.017 に答える