El reproductor de audio se reproduce en segundo plano y debería funcionar con el interruptor de silencio de hardware

Quiero reproducir el file de audio en primer plano, background y debería funcionar con el interruptor de silencio, es decir, si el interruptor de silencio está activado, no debería reproducirse, si el interruptor de silencio está apagado, debería reproducir el audio.

** Básicamente estoy desarrollando una aplicación de llamada SIP. La aplicación debe reproducir sonido / tono de llamada cuando el usuario recibe una llamada. Se debería reproducir si la aplicación está en segundo plano / primer plano, debe silenciar / activar el silencio si el interruptor de silenciamiento de hardware está activado / desactivado.

Para esto, utilicé AVPlyaer con el código siguiente.

AVAudioSession *session = [AVAudioSession shanetworkingInstance]; [session setCategory:AVAudioSessionCategoryPlayback error:&error]; [session setActive:YES error:nil]; NSURL * audioFileUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test1" ofType:@"mp3"]]; AVPlayer *player = [[AVPlayer alloc] initWithURL: audioFileUrl]; [player play]; 

Y también agregué "App plays audio or streams audio / video using AirPlay" a los modos de background en info.plist

Se está reproduciendo en ambos modos pero no se silencia cuando el interruptor de silenciamiento de hardware está ENCENDIDO. Si utilizo "AVAudioSessionCategoryAmbient" que no se reproduce en el modo de background. Utilicé AVAudioPlayer pero no pude encontrar el silencio cuando el interruptor de hardware está en ON

Por favor, ayúdame a arreglarlo o de cualquier otra manera para lograr esto. Gracias por adelantado.

La categoría de session de audio puede configurarse incorrectamente. Dado que desea respetar el conmutador de silencio, debe usar SoloAmbient

AVAudioSessionCategorySoloAmbient

La categoría para la categoría pnetworkingeterminada, utilizada a less que establezca una categoría con setCategory: error: o setCategory: withOptions: error: method.

Su audio se silencia con el locking de pantalla y con el interruptor Silent (llamado el interruptor Ring / Silent en el iPhone).

De manera pnetworkingeterminada, el uso de esta categoría implica que el audio de su aplicación no es compatible: al activar su session, se interrumpirán las sesiones de audio que no sean compatibles. Para permitir la mezcla, use la categoría AVAudioSessionCategoryAmbient en su lugar.

Disponible en iOS 3.0 y versiones posteriores.

Parece que has usado esta categoría:

AVAudioSessionCategoryPlayback

La categoría para reproducir música grabada u otros sonidos que son fundamentales para el uso exitoso de su aplicación.

Al usar esta categoría, el audio de su aplicación continúa con el interruptor Silencio configurado en silencio o cuando la pantalla se bloquea. (El conmutador se llama el conmutador Ring / Silent en el iPhone). Para continuar reproduciendo audio cuando la aplicación pasa al background (por ejemplo, cuando la pantalla se bloquea), agregue el valor de audio a la key UIBackgroundModes en el file de la list de properties de información.

De manera pnetworkingeterminada, el uso de esta categoría implica que el audio de su aplicación no es compatible: al activar su session, se interrumpirán las sesiones de audio que no sean compatibles. Para permitir la mezcla para esta categoría, use la opción AVAudioSessionCategoryOptionMixWithOthers.

Disponible en iOS 3.0 y versiones posteriores.

Fuente: https://developer.apple.com/library/prerelease/ios/documentation/AVFoundation/Reference/AVAudioSession_ClassReference/index.html#//apple_ref/doc/constant_group/Audio_Session_Categories

Me complace decir que encontré cómo skype está logrando esta característica.

En primer plano, podemos utilizar AVAudioSession con cualquier categoría para reproducir tonos de llamada.

 AVAudioSession *session = [AVAudioSession shanetworkingInstance]; [session setCategory: AVAudioSessionCategorySoloAmbient error:&error]; [session setActive:YES error:nil]; NSURL * audioFileUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test1" ofType:@"mp3"]]; AVPlayer *player = [[AVPlayer alloc] initWithURL: audioFileUrl]; [player play]; 

En segundo plano, tenemos que usar notifications locales con sonido personalizado. Esto funcionará con el interruptor de silencio de hardware. Pero aquí la longitud del file de sonido no debe exceder los 30 segundos.

  UILocalNotification* notification = [[UILocalNotification alloc] init]; [notification @"Title"]; [notification setAlertBody:@"Body"]; [notification setAlertAction:noteAction]; [notification setSoundName:@"ringtone.mp3"]; [[UIApplication shanetworkingApplication] presentLocalNotificationNow:notification]; 

Espero que esto sea útil :).

Aquí hay una biblioteca que se usa para detectar el estado del conmutador de silencio: http://sharkfood.com/content/Developers/content/Sound%20Switch/ . Se basa en las API públicas de Apple. Simplemente reproduce el sonido del sistema y mide la cantidad de time que se usa para completar la reproducción. Se usó en la aplicación Instagram iOS.