AVplayer reanuda después de la llamada entrante

Estoy usando AVPlayer para la reproducción de música. Mi problema es que después de una llamada entrante, el jugador no se reanudará. ¿Cómo manejo esto cuando llega una llamada entrante?

A partir de iOS 6, debe manejar AVAudioSessionInterruptionNotification y AVAudioSessionMediaServicesWereResetNotification , antes de esto, tuvo que usar methods de delegado.

Primero debe llamar al singleton de AVAudioSession y configurarlo para el uso que desee.

Por ejemplo:

 AVAudioSession *aSession = [AVAudioSession shanetworkingInstance]; [aSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error]; [aSession setMode:AVAudioSessionModeDefault error:&error]; [aSession setActive: YES error: &error]; 

Luego debe implementar dos methods, para las notifications a las que llamaría AVAudioSession:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAudioSessionInterruption:) name:AVAudioSessionInterruptionNotification object:aSession]; 

La primera es para cualquier interrupción que se llamaría debido a una llamada entrante, despertador, etc.

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMediaServicesReset) name:AVAudioSessionMediaServicesWereResetNotification object:aSession]; 

La segunda, si el server de medios se reinicia por alguna razón, debe manejar esta notificación para reconfigurar el audio o realizar tareas de mantenimiento. Por cierto, el dictionary de notifications no contendrá ningún object.

Aquí hay un ejemplo para manejar la interrupción de la reproducción:

 - (void)handleAudioSessionInterruption:(NSNotification*)notification { NSNumber *interruptionType = [[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey]; NSNumber *interruptionOption = [[notification userInfo] objectForKey:AVAudioSessionInterruptionOptionKey]; switch (interruptionType.unsignedIntegerValue) { case AVAudioSessionInterruptionTypeBegan:{ // • Audio has stopped, already inactive // • Change state of UI, etc., to reflect non-playing state } break; case AVAudioSessionInterruptionTypeEnded:{ // • Make session active // • Update user interface // • AVAudioSessionInterruptionOptionShouldResume option if (interruptionOption.unsignedIntegerValue == AVAudioSessionInterruptionOptionShouldResume) { // Here you should continue playback. [player play]; } } break; default: break; } } 

Tenga en count que debe reanudar la reproducción cuando el valor opcional es AVAudioSessionInterruptionOptionShouldResume

Y para la otra notificación, debe ocuparse de lo siguiente:

 - (void)handleMediaServicesReset { // • No userInfo dictionary for this notification // • Audio streaming objects are invalidated (zombies) // • Handle this notification by fully reconfiguring audio } 

Saludos.

AVAudioSession enviará una notificación cuando comience y finalice una interrupción. Ver Manejo de interrupciones de audio

 - (id)init { if (self = [super init]) { [[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(audioSessionInterrupted:) name:AVAudioSessionInterruptionNotification object:nil]; } } - (void)audioSessionInterrupted:(NSNotification *)notification { int interruptionType = [notification.userInfo[AVAudioSessionInterruptionTypeKey] intValue]; if (interruptionType == AVAudioSessionInterruptionTypeBegan) { if (_state == GBPlayerStateBuffering || _state == GBPlayerStatePlaying) { NSLog(@"Pausing for audio session interruption"); pausedForAudioSessionInterruption = YES; [self pause]; } } else if (interruptionType == AVAudioSessionInterruptionTypeEnded) { if ([notification.userInfo[AVAudioSessionInterruptionOptionKey] intValue] == AVAudioSessionInterruptionOptionShouldResume) { if (pausedForAudioSessionInterruption) { NSLog(@"Resuming after audio session interruption"); [self play]; } } pausedForAudioSessionInterruption = NO; } } 

En algunos casos, mi AVPlayer no reanuda la reproducción aunque llame a play() . Solo el jugador de recarga me ayuda a resolver el problema:

  func interruptionNotification(_ notification: Notification) { guard let type = notification.userInfo?[AVAudioSessionInterruptionTypeKey] as? UInt, let interruption = AVAudioSessionInterruptionType(rawValue: type) else { return } if interruption == .ended && playerWasPlayingBeforeInterruption { player.replaceCurrentItem(with: AVPlayerItem(url: radioStation.url)) play() } }