molestar modo ios avfoundation interrupt avaudiorecorder avaudiosession

modo - La notificación de interrupción de AVAudioSession de iOS no funciona como se esperaba



modo no molestar iphone (3)

Quiero saber cuándo mi AVAudioRecorder es inaccesible (por ejemplo, cuando la música comienza a reproducirse).

Como audioRecorderEndInterruption quedará en desuso con iOS 9, me estoy enfocando en la notificación de interrupción de AVAudioSession (pero ninguna funciona como se esperaba).

El problema es que nunca se llama a la notificación de interrupción si la aplicación estaba y permanece en primer plano cuando se produce la interrupción.

Ej .: El usuario inicia y detiene la reproducción de música sin mover la aplicación al fondo.

Para detectar cualquier interrupción estoy usando:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasInterrupted:) name:AVAudioSessionInterruptionNotification object:nil]; ... - (void)audioSessionWasInterrupted:(NSNotification *)notification { if ([notification.name isEqualToString:AVAudioSessionInterruptionNotification]) { NSLog(@"Interruption notification"); if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeBegan]]) { NSLog(@"InterruptionTypeBegan"); } else { NSLog(@"InterruptionTypeEnded"); } } }

Obtengo InterruptionTypeBegan como se esperaba, pero no se llama a InterruptionTypeEnded si la aplicación aún está en primer plano (lo que significa que no se llamará hasta que la aplicación se coloque en segundo plano y vuelva a estar en primer plano).

¿Cómo puedo recibir la notificación InterruptionTypeEnded cuando se produce la interrupción mientras la aplicación está en primer plano?


Este es un problema generalizado que afecta a cualquier aplicación que use componentes de AV framework (lo mismo ocurre con las aplicaciones iOS nativas).

Como se explica en la documentación de  sobre el tema de las interrupciones de audio, InterruptionTypeEnded debería aplicarse en el escenario mencionado:

Si el usuario descarta la interrupción ... el sistema invoca su método de devolución de llamada, lo que indica que la interrupción ha finalizado.

Sin embargo, también indica que InterruptionTypeEnded no se puede llamar en absoluto:

No hay garantía de que una interrupción de inicio tenga una interrupción de finalización.

Por lo tanto, se necesita un enfoque diferente en el escenario mencionado.

Cuando se trata de manejar las interrupciones de la música, el problema no será por mucho tiempo. iOS 9 impide efectivamente que se utilicen fuentes de audio externas mientras se invoca el controlador de audio de la aplicación.

Una forma de manejar el problema exacto de la interrupción de los medios podría ser escuchar el MPMusicPlayerController de playbackState MPMusicPlayerController , como se muestra en esta pregunta sobre el MPMusicPlayerController de MPMusicPlayerController : ¿ Detectar si hay música en reproducción? .

Una forma más directa de manejar el problema de las interrupciones sería:

Bloquee las interrupciones de audio externas completamente al invocar su componente de audio en el momento de InterruptionTypeBegan .

O al dar una indicación de UI de que una fuente de medios externa ha interrumpido la sesión de audio (por ejemplo, muestra un micrófono inactivo).

Esperemos que encuentre una mejor solución al problema, pero mientras tanto, esto le dará algunas opciones para resolver el problema de la interrupción.


Intento esto y encuentro que InterruptionTypeEnded puede llamarse después de la pausa de la música en algunas aplicaciones, pero no se llama cuando se pausa.

Mi solución es actualizar la interfaz de usuario para que el usuario sepa que el registro se ha detenido y hacer algún trabajo relacionado, como la operación de archivos. Cuando finaliza la interrupción, AVAudioSession activa, si no tiene error , inicia un nuevo registro.

Si desea unirse al archivo antes y después de la interrupción, la respuesta a esta pregunta: AVAudioRecorder graba solo el audio después de la interrupción puede ser útil para usted.


Si aún no lo ha hecho, intente configurar la AVCaptureSession su AVCaptureSession usesApplicationAudioSession en NO .

This pregunta y respuesta puede ser una buena referencia si está buscando más detalles.