ios objective-c avfoundation avaudioplayer ios10

La reproducción de AVFAudio se bloquea en iOS 10



objective-c avfoundation (2)

Tengo una aplicación con un componente de audio muy básico: un conjunto de canciones de fondo reproducidas en bucle con un AVAudioPlayer (nombres de archivos de canciones almacenados como una matriz). Todo ha funcionado bien durante meses, pero iOS 10 está fallando para un número significativo de mis usuarios (miles por día).

El problema es que no puedo entender qué ha cambiado en iOS 10. Parece que sucede cada vez que el usuario bloquea su dispositivo, y específicamente sucede en el instante en que la música se desvanece (no emite audio de fondo, por lo que se deja la aplicación se desvanece automáticamente la música).

En ese momento, recibo esto cada vez:

2016-09-22 17:06:39.439979 TerraGenesis[8533:2459778] [aurioc] 889: failed: ''!pla'' (enable 2, outf< 2 ch, 0 Hz, Float32, non-inter> inf< 2 ch, 0 Hz, Float32, non-inter>) 2016-09-22 17:06:39.443348 TerraGenesis[8533:2459778] [aurioc] 889: failed: ''!pla'' (enable 2, outf< 2 ch, 44100 Hz, Float32, non-inter> inf< 2 ch, 0 Hz, Float32, non-inter>) 2016-09-22 17:06:39.445339 TerraGenesis[8533:2459778] [central] 54: ERROR: [0x1b50d6c40] >avae> AVAudioEngineGraph.mm:2515: PerformCommand: error 561015905 2016-09-22 17:06:39.446646 TerraGenesis[8533:2459778] *** Terminating app due to uncaught exception ''com.apple.coreaudio.avfaudio'', reason: ''error 561015905'' *** First throw call stack: (0x1904781c0 0x18eeb055c 0x190478094 0x1a99d978c 0x1a99ed170 0x1a99ede58 0x1a9a5b3a0 0x1a9a5a6b0 0x1a9a5a640 0x1a0228580 0x1a020cff8 0x19041222c 0x190411930 0x1904116ac 0x190480b9c 0x190353bf4 0x190e5a6bc 0x1963284a0 0x19654df40 0x19655c3ec 0x196547ae8 0x19654776c 0x196879034 0x191febbd4 0x192019904 0x192019770 0x192019b18 0x190426278 0x190425bc0 0x1904237c0 0x190352048 0x191dd5198 0x19632b818 0x196326550 0x1001c1428 0x18f3345b8) libc++abi.dylib: terminating with uncaught exception of type NSException

Aquí está la traza de la pila:

Fatal Exception: com.apple.coreaudio.avfaudio 0 CoreFoundation 0x18d45c1c0 __exceptionPreprocess 1 libobjc.A.dylib 0x18be9455c objc_exception_throw 2 CoreFoundation 0x18d45c094 +[NSException raise:format:] 3 AVFAudio 0x1a6a7578c AVAE_RaiseException(NSString*, ...) 4 AVFAudio 0x1a6a89170 AVAudioEngineGraph::PerformCommand(AUGraphNode&, AVAudioEngineGraph::ENodeCommand, void*, unsigned int) const 5 AVFAudio 0x1a6a89e58 AVAudioEngineGraph::Initialize() 6 AVFAudio 0x1a6af73a0 AVAudioEngineImpl::Initialize() 7 AVFAudio 0x1a6af66b0 AVAudioEngineImpl::Start(NSError**) 8 AVFAudio 0x1a6af6640 -[AVAudioEngine startAndReturnError:] 9 SceneKit 0x19d20c580 CPP3DAudioEngine::GetAVEngine() 10 SceneKit 0x19d1f0ff8 -[SCNView _enterBackground:]

Y aquí está mi código. Esta es la única parte de mi código que maneja el audio de cualquier manera.

-(void)playNextSong { int musicPlaybackIndex = [[[NSUserDefaults standardUserDefaults] objectForKey:@"musicPlaybackIndex"] intValue]; NSURL *soundFileURL = [NSURL fileURLWithPath:[_musicPlaylist objectAtIndex:musicPlaybackIndex]]; _musicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil]; _musicPlayer.volume = 0.15; _musicPlayer.delegate = self; [_musicPlayer prepareToPlay]; [_musicPlayer play]; if(musicPlaybackIndex+1 < [_musicPlaylist count]) { musicPlaybackIndex++; } else { musicPlaybackIndex = 0; } }

Estoy viendo este bloqueo en iPhones, iPads y iPod touch, pero exclusivamente en iOS 10.0.0 y 10.0.1. He estado buscando esas llamadas "[aurioc]" durante horas, pero no encuentro nada útil, y está escrito en una jerga que no puedo analizar.

¿Alguien puede mostrarme lo que podría estar haciendo mal o ayudarme a señalar qué podría haber cambiado con AVAudioPlayer en iOS 10?


Esta excepción con el código 561015905 está relacionada con AVAudioSessionErrorCodeCannotStartPlaying . Este tipo de error puede ocurrir si la lista de propiedades de información de la aplicación no permite el uso de audio, o si la aplicación está en segundo plano y utiliza una categoría que no permite audio de fondo.

Por favor, eche un vistazo a la documentación de AVAudioSessionErrorCodeCannotStartPlaying . Espero que esto ayude.


Este es un error de Apple que tiene 2 soluciones mientras esperamos la solución en iOS 10.2:

(1) (peor) habilitar audio de fondo

(2) (mejor) ver mensaje de Apple a continuación

mensaje de Apple: este es un problema conocido que se solucionará en 10.2. Mientras tanto, otra solución más simple debería funcionar: Active la creación del motor de audio antes de ingresar el fondo (por ejemplo, en la configuración). Puede desencadenar esto simplemente obteniendo el motor de audio de SCNView:

scnView.audioEngine;