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 状态不正确的主要内容,如果未能解决你的问题,请参考以下文章