MPMusicPlayerController не публикует уведомления? - PullRequest
2 голосов
/ 11 октября 2010

Я пытаюсь использовать 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 ]

7 голосов
/ 23 июня 2011

Вы должны добавить еще одну строку над этими строками:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(handle_itemChanged:)
                                             name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification
                                           object:nil];

, то есть:

[myPlayer beginGeneratingPlaybackNotifications];

это сработало для меня.

2 голосов
/ 12 октября 2010

Наконец-то я разобрался с ответом: игроку необходимо отправлять сообщения в основной ветке.Это имеет некоторый смысл в ретроспективе, но это было совершенно неочевидно, пока меня не осенило.Я изменил ошибку, которую открыл, чтобы быть ошибкой в ​​документации, потому что я никогда не обнаруживал, где они упоминали, что игрок должен работать в основном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...