Can not beginReceivingRemoteControlEvents en iOS

En mi aplicación, quiero que el usuario controle la reproducción de audio en segundo plano. Puse los modos backGround en .plist, y en reproducciones en bg como lo quería. Pero no puedo get ninguna respuesta al tocar los botones de control.

Configuré la AudioSession como esta

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

Entonces, en viewController donde se coloca mi reproductor, beginReceivingRemoteControlEvents como este

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

¡Y imprime Responds!

Pero el problema es que este método nunca se llama

  - (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; } } 

Incluso traté de escribir una categoría en UIApplication para que se convierta en la primera respuesta, pero no ayuda

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

¿Por qué puede suceder esto?

SOLUCIÓN Esto es lo que resolvió mi problema Ingreso de background en iOS4 para reproducir audio

He hecho el mismo trabajo en mi proyecto, está funcionando bien. Por favor, siga esto, tal vez lo ayudará. Cambie el nombre del evento, etc. En mi código _audio es el object de AVAudioPlayer.

 - (void)viewDidLoad { NSError *setCategoryErr = nil; NSError *activationErr = nil; [[AVAudioSession shanetworkingInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryErr]; [[AVAudioSession shanetworkingInstance] setActive: YES error: &activationErr]; } - (void)viewWillAppear { [[UIApplication shanetworkingApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; } - (void)remoteControlReceivedWithEvent:(UIEvent *)event { switch (event.subtype) { case UIEventSubtypeRemoteControlPlay: [_audio play]; break; case UIEventSubtypeRemoteControlPause: [_audio pause]; break; default: break; } } 

Existe un mecanismo más nuevo para escuchar events de control remoto. Por ejemplo, para ejecutar un bloque cuando se pulsa el button de reproducción / pausa de los auriculares:

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

o, si prefiere usar un método en lugar de un bloque:

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

Para detener:

  [commandCenter.togglePlayPauseCommand removeTarget:self]; 

o:

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

Deberá agregar esto al área incluida de su file:

 @import MediaPlayer; 

Para que funcione en segundo plano, debe tener el modo de audio de background agregado a las capacidades de su aplicación.

Revise este código de muestra de Apple para ver un ejemplo de uso. Probablemente su controller de vista primaria no se convierta en el primer respondedor. Un uso alternativo es colocar este código en el Delegado de la aplicación (que siempre será el primer respondedor) y responder a estos events antes de que hayan tenido la oportunidad de propagarse y potencialmente ser consumidos por otros respondedores.

Tienes

 respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){ 

pero en la firma del método que tienes

 - (void)remoteControlReceivedWithEvent:(UIEvent *)event 

El lugar donde está registrando la firma es incorrecto. Solo reemplácelo por

 respondsToSelector:@selector(beginReceivingRemoteControlEvents:)]){ 

Te estás perdiendo: lo que está haciendo que la aplicación envíe el par a un método no existente que estoy asumiendo. Me sorprende que su aplicación no se cuelgue.