iOS: MPMusicPlayerControllerPlaybackStateDidChangeNotification вызывается несколько раз на определенных устройствах

У меня есть приложение, которое воспроизводит музыку.

Я использую следующий код для прослушивания изменений состояния воспроизведения из MPMusicPlayerController для обновления пользовательского интерфейса. Точнее я переключаю внешний вид кнопки воспроизведения между игрой и паузой.

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 и заставляет мое приложение отображать неправильное состояние в пользовательском интерфейсе, потому что песня фактически воспроизводится.

Самое смешное, что время от времени последовательность

-[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

2 ответа

Вы можете проверить реальное состояние воспроизведения, используя свойство 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;
    }
}

Таким образом можно отключить уведомление о ложной паузе.

Я думаю, что это та же ошибка, о которой сообщалось здесь:

Неправильное состояние воспроизведения в MP Music Player Controller в ios 5

В этом вопросе я опубликовал обходной путь для ошибки.

Другие вопросы по тегам