Не могу начатьПринимать RemoteControlEvents в iOS

В моем приложении я хочу позволить пользователю контролировать воспроизведение звука в фоновом режиме. Я установил режимы backGround в.plist и в играх в bg, как я и хотел. Но я не могу получить ответ от прикосновения к кнопкам управления.

Я установил AudioSession как это

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance]setActive:YES error:nil];

Затем в viewContoller, где находится мой плеер, я beginReceivingRemoteControlEvents как это

 if ([[UIApplication sharedApplication] respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
    [self becomeFirstResponder];
    NSLog(@"Responds!");
}

И это печатает Responds!

Но проблема в том, что этот метод никогда не вызывается

    - (void)remoteControlReceivedWithEvent:(UIEvent *)event
{
    NSLog(@"Where is my event?");
    if(event.type == UIEventTypeRemoteControl)
    {
        switch (event.subtype) {
            case UIEventSubtypeRemoteControlTogglePlayPause:
                NSLog(@"Pause");
                [self playWords:playButton];
                break;
            case UIEventSubtypeRemoteControlNextTrack:
                NSLog(@"Next");
                [self next];
                break;
            case UIEventSubtypeRemoteControlPreviousTrack:
                NSLog(@"Prev");
                [self prev];
                break;

        }
    }

Я даже пытался написать категорию на UIApplication позволить ему стать первым респондентом, но это не помогает

@implementation UIApplication (RemoteEvents)
-(BOOL)canBecomeFirstResponder
{
    return YES;
}
@end

Почему это может случиться?

РЕШЕНИЕ Вот что решило мою проблему. Вход в iOS4 для воспроизведения звука.

4 ответа

Решение

Я сделал ту же работу в моем проекте, он работает нормально. Пожалуйста, следуйте этому, возможно, это поможет вам. Изменить имя события и т. Д. В моем коде _audio является объектом AVAudioPlayer.

- (void)viewDidLoad {
    NSError *setCategoryErr = nil;
    NSError *activationErr  = nil;
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryErr];
    [[AVAudioSession sharedInstance] setActive: YES error: &activationErr];
}

- (void)viewWillAppear {

      [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];
}


- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
    switch (event.subtype) {
        case UIEventSubtypeRemoteControlPlay:
            [_audio play];
            break;
        case UIEventSubtypeRemoteControlPause:
            [_audio pause];
            break;
        default:
            break;
    }
}

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

    MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter];

    [commandCenter.togglePlayPauseCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {
        NSLog(@"toggle button pressed");
        return MPRemoteCommandHandlerStatusSuccess;
    }];

или, если вы предпочитаете использовать метод вместо блока:

    [commandCenter.togglePlayPauseCommand addTarget:self action:@selector(toggleButtonAction)];

Прекратить:

    [commandCenter.togglePlayPauseCommand removeTarget:self];

или же:

    [commandCenter.togglePlayPauseCommand removeTarget:self action:@selector(toggleButtonAction)];

Вам нужно добавить это в область включений вашего файла:

@import MediaPlayer;

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

Просмотрите этот пример кода от Apple для примера использования. Вероятно, ваш основной контроллер представления на самом деле не становится первым респондентом. Альтернативное использование - поместить этот код в делегат приложения (который всегда будет первым респондентом) и отвечать на эти события до того, как у них появится возможность распространиться и, возможно, будут использоваться другими респондентами.

У тебя есть

respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){

но в подписи метода у вас есть

- (void)remoteControlReceivedWithEvent:(UIEvent *)event

Место, где вы регистрируете подпись, неверно. Просто замените его на

respondsToSelector:@selector(beginReceivingRemoteControlEvents:)]){

Вы пропускаете: что заставляет приложение отправлять даже несуществующий метод, который я предполагаю. Я удивлен, что ваше приложение не падает.

Другие вопросы по тегам