Avfaudio playback crash sur iOS 10
j'ai une application avec un composant audio très basique: une boucle de chansons d'arrière-plan jouées avec un AVAudioPlayer (noms de fichiers de chanson stockés sous forme de tableau). Tout fonctionne bien depuis des mois, mais iOS 10 s'effondre pour un nombre significatif de mes utilisateurs (des milliers par jour).
le problème est, Je ne peux pas comprendre ce qui a changé dans iOS 10. Il semble se produire à chaque fois que l'utilisateur verrouille leur appareil, et spécifiquement il se produit à l'instant où la musique finit de s'évanouir (il ne fait pas l'audio de fond, donc en laissant l'application disparaît automatiquement la musique).
À ce moment, je reçois ce à chaque fois:
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
Voici la trace de la pile:
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:]
Et voici mon code. C'est la seule partie de mon code qui gère l'audio en aucune façon.
-(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;
}
}
je vois ce crash sur iPhones, iPads, et iPod touches, mais exclusivement sur iOS 10.0.0 et 10.0.1. J'ai cherché ces appels "[aurioc]" pendant des heures maintenant mais je Je ne trouve rien d'utile, et c'est écrit dans un jargon que je n'arrive pas à déchiffrer.
est-ce que quelqu'un peut me montrer ce que je fais mal, ou m'aider à m'orienter dans la direction de ce qui aurait pu changer avec AVAudioPlayer dans iOS 10?
2 réponses
il s'agit d'un bogue Apple qui a 2 solutions de rechange pendant que nous attendons le correctif dans iOS 10.2:
(1) (pis) activer l'audio d'arrière-plan
(2) (mieux) voir Apple message ci-dessous
message de Apple: c'est un problème connu qui sera corrigé en 10.2. En attendant, une autre solution plus simple devrait fonctionner: déclencher vous-même la création du moteur audio avant d'entrer l'arrière-plan (par exemple lors de la configuration). Vous pouvez déclencher cela simplement en obtenant le moteur audio à partir de la SCNView:
scnView.audioEngine;
Cette exception avec le code 561015905 liés à AVAudioSessionErrorCodeCannotStartplaying. Ce type d'erreur peut se produire si la liste de propriétés D'information de l'application ne permet pas l'utilisation audio, ou si l'application est dans l'arrière-plan et en utilisant une catégorie qui ne permet pas l'audio d'arrière-plan.
s'il vous Plaît jeter un oeil à la documentation de AVAudioSessionErrorCodeCannotStartplaying. Espérons que cette aide.