MPMusicPlayerController не публикует уведомления?
Я пытаюсь использовать MPMusicPlayerController
играть музыку, а я тоже хочу получать уведомления MPMusicPlayerControllerPlaybackStateDidChange
, Я настроил свой плеер и регистрацию уведомлений почти так же, как пример (который работает, кстати, он получает уведомления правильно):
- (id) initWithPlaylist:(MPMediaPlaylist*)list {
if (self = [super init]) {
player = [MPMusicPlayerController applicationMusicPlayer];
[player retain];
NSLog(@"setting up player");
[plaayer setQueueWithItemCollection:list];
[player setShuffleMode:MPMusicShuffleModeOff];
[player setRepeatMode:MPMusicRepeatModeNone];
NSLog(@"registering MPMusicPlayerController Notifications");
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handle_itemChanged:)
name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handle_stateChanged:)
name:MPMusicPlayerControllerPlaybackStateDidChangeNotification
object:nil];
NSLog(@"turning on player notifications");
[player beginGeneratingPlaybackNotifications];
}
}
Я получаю много бупки. Методы handle_itemChanged:
а также handle_stateChanged:
просто пусты, за исключением NSLog
заявление, чтобы показать, что они были поражены, и никогда не кажется, что они получили удар. NSLog
заявления в initWithPlaylist:
печатаются в журнал, как ожидалось. Выше это просто бизнес-объект в моем приложении. Это не просмотр или просмотр контроллера.
Есть идеи? Странно то, что AddMusic
образец прекрасно работает для меня, и я не могу сказать, что я делаю что-то по-другому в отношении MPMusicPlayerController
и его уведомления.
Обновление: я добавил эту строку в моем делегате приложения, чтобы увидеть полный поток уведомлений:
[[NSNotificationCenter defaultCenter] addObserverForName:nil object:nil queue:nil usingBlock:^(NSNotification *n) { NSLog(@"notification: %@", n); }];
Я вижу все виды уведомлений, выводимых на консоль, но ни одного из контроллера медиаплеера.
2 ответа
Наконец, я разобрался с ответом: игроку необходимо отправлять сообщения в основной ветке. Это имеет некоторый смысл в ретроспективе, но это было совершенно неочевидно, пока меня не осенило. Я изменил ошибку, которую открыл, чтобы быть ошибкой в документации, потому что я никогда не обнаруживал, где они упоминали, что игрок должен работать в главном потоке.
Вы должны добавить еще одну строку над этими строками:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handle_itemChanged:)
name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object:nil];
то есть:
[myPlayer beginGeneratingPlaybackNotifications];
это сработало для меня.