iOS7 MPMusicPlayerController 状态不正确

Posted

技术标签:

【中文标题】iOS7 MPMusicPlayerController 状态不正确【英文标题】:iOS7 MPMusicPlayerController states incorrect 【发布时间】:2013-09-20 06:26:46 【问题描述】:

我有一个带有音乐播放器的 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 次,使用交替值是没有意义的。

这仅在更改队列时发生。 系统似乎没有正确清除队列。

关于如何解决这个问题的任何想法?

【问题讨论】:

【参考方案1】:

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

我已经向 Apple 报告了这个错误,我建议你做同样的事情 (Apple Bug Reporter)

【讨论】:

@user1763004 没有解决方法。如果您有时会收到错误的播放状态,则无法确定在任何给定时间它是对还是错。我想唯一的其他选择是同时拥有播放和暂停按钮,但我猜这不是你想要的。 我在音乐播放器上也遇到了这个问题。到目前为止还没有办法摆脱它。这是 iOS7 上的一个严重问题。 我也提交了雷达。希望这有助于解决这个问题。目前 iOS 7.0.3 也是如此 我也遇到了同样的问题。我解决这个问题的方法是在收到 MPMusicPlaybackStatePlaying 的指示后将计时器设置为 1 秒。然后,我使用 AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &size, &audioIsPlaying) 进行测试以确定音乐是否正在播放。如果它没有播放,我重置音频系统,然后将音乐播放器恢复到播放状态。【参考方案2】:

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

if([[AVAudioSession sharedInstance] isOtherAudioPlaying])

【讨论】:

【参考方案3】:

另一种解决方法是检查:

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

【讨论】:

我发现检查currentPlaybackRate 解决了我遇到的问题。但是,您永远不应该使用相等来比较浮点数!【参考方案4】:

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

(1) 在队列更改期间抑制回调。因此,我有一个 BOOL ivar doNotNoteNowPlayingItem。一个示例回调是这样开始的:

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

因此,当我要更改队列时,我升起标志,将此 ivar 设置为 YES,并在我即将设置 nowPlayingItem 并再次准备好回调时再次降低它。其他回调也可以类似地工作。

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

【讨论】:

以上是关于iOS7 MPMusicPlayerController 状态不正确的主要内容,如果未能解决你的问题,请参考以下文章

iOS7 的视图大小和位置

iOS7 和 Apple Watch

ios7之后的一些更改

iOS7隐藏状态栏

在ios7中绘图时出现延迟

iOS7 后台获取