iOS7 MPMusicLayerController状态不正确

iOS7 MPMusicLayerController状态不正确,ios7,mpmusicplayercontroller,Ios7,Mpmusicplayercontroller,我有一个带音乐播放器的iOS7应用程序。 我使用以下代码检查MPMusicLayerController中的播放状态更改,以更新UI。 更准确地说,我在播放和暂停之间切换播放按钮的外观 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (handle_NowPlayingItemChanged:) name: M

我有一个带音乐播放器的iOS7应用程序。 我使用以下代码检查MPMusicLayerController中的播放状态更改,以更新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表示MPMusicLaybackState暂停,并导致我的应用程序在UI中显示错误的状态,而歌曲实际上正在播放。 调用回调函数4次(使用交替值)是没有意义的

这只在更改队列时发生。 看起来系统没有正确清除队列


关于如何解决这个问题有什么想法吗?

自从iOS 7发布以来,我一直遇到同样的问题。这显然是iOS的问题;它不仅报告不正确的播放状态,有时还无法接收播放状态更改通知(
MPMusicPlayerControllerPlaybackStateDidChangeNotification


我已经向苹果公司报告了这个错误,我建议你做同样的事情()

我也有同样的问题。我找到了这个解决方法,没有使用playbackState检查音频是否正在播放,而是使用了以下条件:


如果([[AVAudioSession sharedInstance]isOtherAudioPlaying])

另一个解决方法是检查:

    if([[MPMusicPlayerController iPodMusicPlayer] currentPlaybackRate] == 0)

解决方法取决于回调的实现。我所做的如下:

(1)在队列更改期间抑制回调。因此,我有一个BOOL ivar
doNotNoteNowPlayingItem
。一个回调示例如下所示:

    if (self.doNotNoteNowPlayingItem) // flag to prevent
        return;
因此,当我准备更改队列时,我会升起该标志,将该ivar设置为“是”,然后在我准备设置
nowPlayingItem
并准备再次回调时再次降低该标志。其他回调也会起到类似的作用


(2)不要使用
playbackState
来测试我们是在玩还是暂停。如果我们停下来,答案是正确的,但是如果我们正在玩,答案可能会被报告为暂停。要区分播放和暂停,请检查
currentPlaybackRate
;如果接近1,我们将播放,但如果接近0,我们将暂停。

@user1763004没有解决方法。如果您有时被赋予错误的播放状态,那么在任何给定的时间内都无法确定它是对还是错。我想唯一的选择是同时有播放和暂停按钮,但我猜这不是你想要的。我在音乐播放器上也有这个问题。到目前为止还没有办法解决这个问题。这是iOS7上的一个严重问题。我也提交了一个雷达。希望这有助于解决这个问题。目前,iOS 7.0.3I也出现了同样的问题。我的难题是在收到MPMusicLayBackstatePlaying指示后,将计时器设置为1秒。然后,我使用AudioSessionGetProperty(kAudioSessionProperty_OtherAudioISPlay,&size,&AudioISPlay)测试音乐是否正在播放。如果没有播放,我会重置音响系统,然后将音乐播放器恢复到播放状态。我发现检查
currentPlaybackRate
可以解决我遇到的问题。但是,永远不要使用相等来比较浮点!