音楽を再生するアプリケーションがあります。
次のコードを使用して、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