8

音楽プレーヤーを備えた iOS7 アプリケーションがあります。次のコードを使用して、MPMusicPlayerController からの再生状態の変化を確認し、UI を更新しています。より正確には、再生ボタンの外観を再生と一時停止の間で切り替えます。

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

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

[self.musicPlayer beginGeneratingPlaybackNotifications];

iPad または iPhone の iOS7 でアプリを実行すると、単一のコールバックではなく、次のシーケンスが返されます。

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

PlaybackState 2 は MPMusicPlaybackStatePaused を意味し、曲が実際に再生されている間、アプリケーションが UI で間違った状態を表示する原因となります。コールバックが交互の値で 4 回呼び出されるのは意味がありません。

これは、キューのみを変更した場合に発生します。システムがキューを適切にクリアしていないようです。

これを解決する方法についてのアイデアはありますか?

4

4 に答える 4

4

私も同じ問題を抱えていました。この回避策を見つけました。playbackState を使用してオーディオが再生されているかどうかを確認する代わりに、次の条件を使用しました。

if([[AVAudioSession sharedInstance] isOtherAudioPlaying])

于 2014-02-18T18:42:17.027 に答える
4

iOS 7 のリリース以来、私は同じ問題を経験してきました。これは間違いなく iOS の問題です。誤った再生状態を報告するだけでなく、再生状態変更通知の受信に失敗する場合もあります ( MPMusicPlayerControllerPlaybackStateDidChangeNotification)

私はこのバグを Apple に報告しました。同じことを行うことをお勧めします ( Apple Bug Reporter ) 。

于 2013-09-20T11:13:45.990 に答える
2

回避策は、コールバックの実装によって異なります。私がしたことは次のとおりです。

(1)キュー変更中のコールバックを抑制します。したがって、私は BOOL ivar を持っていdoNotNoteNowPlayingItemます。コールバックの例は、次のように始まります。

    if (self.doNotNoteNowPlayingItem) // flag to prevent
        return;

したがって、キューを変更しようとすると、フラグを上げてこの ivar を YES に設定し、設定しようnowPlayingItemとして再びコールバックの準備ができたら、フラグを下げます。他のコールバックも同様に機能します。

(2)playbackState再生中か一時停止中かのテストとして使用しないでください。止まっていれば答えは正解ですが、遊んでいると答えが一時停止と報告されることがあります。再生中と一時停止中を区別するには、currentPlaybackRate; 1 に近い場合は再生中ですが、0 に近い場合は一時停止しています。

于 2014-05-21T02:12:47.353 に答える