Приложение больше не получает события управления с экрана блокировки после переключения музыкальных приложений - PullRequest
0 голосов
/ 27 июня 2018

Я создаю приложение, которое использует AVPlayer и настроено на работу с элементами управления экрана блокировки, когда приложение находится в фоновом режиме. Я соответственно реализовал следующее:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

[[AVAudioSession sharedInstance] setActive: YES error: &error];

и у меня MPNowPlayingInfoCenter правильно настроен.

Одна ошибка, с которой я столкнулся, заключается в том, что элементы управления экрана блокировки не работают, когда я хочу возобновить воспроизведение после воспроизведения музыки из другого приложения (например, Spotify). Чтобы воспроизвести эту ошибку, я начинаю воспроизводить звук из моего приложения, где при воспроизведении моего AVPlayer вызывается setActive. Затем я переключаюсь на Spotify и играю песню, где мой звук отключается и приостанавливается. Через несколько секунд я снова переключаюсь на свое приложение и возобновляю звук. Когда я блокирую свое устройство и нажимаю кнопки на экране блокировки, я вижу информацию о моем аудио на экране, но ни один из моих элементов управления не работает так, как должен.

beginReceivingRemoteControlEvents вызывается при запуске в моем appDelegate's applicationDidBecomeActive

У меня есть endReceivingRemoteControlEvents в методе dealloc из моего appDelegate (это унаследованный код), но в этом сценарии он не вызывается.

РЕДАКТИРОВАТЬ: я забыл отметить, я тестирую на iPad под управлением iOS11.4

РЕДАКТИРОВАТЬ 2: Извините, я не упомянул, что это работало нормально до обновления до iOS11.4

РЕДАКТИРОВАТЬ 3: Я обнаружил проблему, это был логический флаг, скрытый в нашем устаревшем коде, который не был сброшен

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Spotify прерывает ваш аудио сеанс, поэтому он больше не активен, поэтому ваше приложение больше не является приложением Now Playing и больше не получает события удаленного управления.

Вам нужно позвонить

if (![[AVAudioSession sharedInstance] setActive:YES error:&error]) {
    // do something about error
}

снова в какой-то момент, когда ваше приложение возвращается на передний план или когда прерывание заканчивается (наблюдая уведомление AVAudioSessionInterruptionNotification, это важно, если вы хотите восстановиться после телефонных звонков и других прерывающих событий). Дополнительная информация доступна в документе Ответ на прерывания аудио сеанса .

0 голосов
/ 28 июня 2018

У нас в магазине есть музыкальный проигрыватель, поэтому я хотел бы попробовать ваш вопрос.

После попытки определения маршрута MyApp> Spotify> MyApp, который вы определили, я не смог воспроизвести ошибку. Кнопки информационного центра работают правильно.

Мы звоним beginReceivingRemoteControlEvents на applicationDidEnterBackground. Мы также звоним addTargetWithHandler в этот момент. И endReceivingRemoteControlEvents на applicationDidBecomeActive. Примерно так:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
  [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

  MPRemoteCommandCenter *remoteCommandCenter = [MPRemoteCommandCenter sharedCommandCenter];

  [remoteCommandCenter.playCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus (MPRemoteCommandEvent *event) {
    //....
  }];
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
  [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
}

Природа MPRemoteCommandCenter используется, когда ваше приложение работает в фоновом режиме.

Проблема может быть в порядке вещей.

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