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
В этом вопросе я опубликовал обходной путь для ошибки.