4

我有一个播放音乐的应用程序。

我正在使用以下代码来收听 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 开发者论坛https ://devforums.apple.com/thread/158426

4

2 回答 2

0

我认为这是这里报告的相同错误:

在 ios 5 中的 MP 音乐播放器控制器中出现错误的播放状态

我针对该问题中的错误发布了解决方法。

于 2012-11-18T20:41:00.513 回答
0

您可以使用 currentPlaybackRate 属性检查实际播放状态。MPMusicPlaybackStatePaused 必须匹配速率 0.0。下面显示了一个如何实现的示例...

- (void)musicPlayerControllerPlaybackStateDidChangeNotification:(NSNotification *)notification {
    float playbackRate = [((MPMusicPlayerController *)notification.object) currentPlaybackRate];
    MPMusicPlaybackState playbackState = (MPMusicPlaybackState)[notification.userInfo[@"MPMusicPlayerControllerPlaybackStateKey"] integerValue];
    switch (playbackState) {
        case MPMusicPlaybackStatePaused:
            if (playbackRate <= .0f) {
                self.playbackState = playbackState;
            }
            break;
        default:
            self.playbackState = playbackState;
            break;
    }
}

因此可以切断错误的暂停通知。

于 2015-01-20T17:26:09.017 回答