iOS — события UIEventTypeRemoteControl не получены

У меня есть это в AppDelegate (didFinishLaunching):

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

Я пытался обрабатывать события в соответствующих контроллерах представлений, но это было неточно (некоторые контроллеры представлений получали события, а другие — нет, даже если они были первыми ответчиками). Я попытался создать подкласс UIApplication. Это не сработало. Теперь я пытаюсь создать подкласс UIWindow и сделать это (см. комментарии):

- (void)sendEvent:(UIEvent *)event {
if (event.type == UIEventTypeRemoteControl) {
    NSLog(@"I wish this happened"); //this never happens
}
else
{
    NSLog(@"some other event"); //this does happen on any other interaction
    [super sendEvent:event];
}
}

- (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {

if (receivedEvent.type == UIEventTypeRemoteControl) {
    NSLog(@"got remote event"); // this never happens either
    switch (receivedEvent.subtype) {

        case UIEventSubtypeRemoteControlTogglePlayPause:
        {
            NSLog(@"handle play/pause");
            break;
        }


        default:
            break;
    }
}
}

Я пробовал как с этим, так и без него в информационном списке:

<key>UIBackgroundModes</key>
<array>
        <string>audio</string>
</array>

Не имеет значения. Как указано в документах Apple, вы можете имитировать события дистанционного управления с помощью элементов управления звуком (двойное нажатие кнопки «Домой» и прокрутка до них внизу). Когда я нажимаю кнопку воспроизведения или паузы, он просто воспроизводит звук из моей медиатеки iTunes. Я также пробовал кнопки на наушниках Apple. Ничего такого.

Все, что я хочу сделать, это обнаружить кнопку воспроизведения/паузы на пульте дистанционного управления и обработать событие. Что еще мне нужно сделать, чтобы поймать эти события?


person soleil    schedule 23.08.2012    source источник


Ответы (1)


хорошо, еще несколько часов моей жизни в черную дыру Apple. Оказывается, вы можете захватывать события удаленного управления только после того, как воспроизвели какой-либо звук с помощью AVAudioPlayer, или если вы воспроизвели видеофайл со звуком. Это нигде не задокументировано здесь .

Поэтому в моем случае я должен сначала воспроизвести фиктивный беззвучный аудиофайл, прежде чем пытаться зафиксировать события удаленного управления. Надеюсь, это поможет кому-то в будущем.

(Обновление) Обратите внимание, что файл обновленная документация теперь гласит следующее:

Чтобы получать события удаленного управления, ваше приложение должно делать три вещи:

  • Отвечать первым. Представление или контроллер представления, в котором представлен мультимедийный контент, должны отвечать первым.
  • Включите доставку событий удаленного управления. Ваше приложение должно явным образом запрашивать получение событий удаленного управления.
  • Начните воспроизводить звук. Ваше приложение должно быть приложением "Сейчас исполняется". Другими словами, даже если ваше приложение отвечает первым и вы включили доставку событий, ваше приложение не будет получать события удаленного управления, пока оно не начнет воспроизводить звук.
person soleil    schedule 23.08.2012
comment
Это была именно моя проблема. Большое спасибо... потребовалась бы целая вечность, чтобы понять. - person Tom Quinn; 28.10.2012
comment
Не работает в iOS 6+. Я вижу информацию о воспроизведении моего приложения на экране блокировки, но, тем не менее, никаких событий для нажатия паузы/воспроизведения. - person openfrog; 24.07.2013
comment
И это не имеет смысла: если вы используете AVAudioPlayer, его не представляет контроллер представления. это класс, который воспроизводит звук и не имеет супервизора. - person openfrog; 24.07.2013
comment
Звучит интересно, и я решил свою проблему на iOS 7. Спасибо :) - person Shahab; 03.06.2014
comment
@soleil Эй, похоже, ссылки больше не существует. Как мне сделать приложение «Сейчас играет»? Нужно ли мне добавить какую-то конфигурацию? - person Astha Gupta; 15.05.2017