2016-09-17 3 views
15

У меня есть приложение с очень простым аудиокомпонентом: набор фоновых композиций, воспроизводимых с помощью AVAudioPlayer (имена файлов песен, хранящихся в виде массива). Все работает отлично в течение нескольких месяцев, но iOS 10 рушится для значительного числа моих пользователей (тысячи в день).Авария воспроизведения AVFAudio на iOS 10

Проблема в том, что я не могу понять, что изменилось в iOS 10. Кажется, что это происходит каждый раз, когда пользователь блокирует свое устройство, и в особенности это происходит в тот момент, когда музыка заканчивается, исчезает (это не делает фоны аудио, поэтому приложение автоматически гасит музыку).

В тот момент, я получаю это каждый раз:

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 

Вот трассировки стека:

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:] 

И вот мой код. Это единственная часть моего кода, которая каким-либо образом обрабатывает аудио.

-(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; 
    } 
} 

Я вижу эту аварию на iPhone'ов, IPADS и IPod прикасается, но исключительно на IOS 10.0.0 и 10.0.1. Я искал те «[aurioc]» звонки часами, но я не могу найти ничего полезного, и он написан на жаргоне, который я не могу разобрать.

Может ли кто-нибудь показать мне, что я могу делать неправильно, или помочь указать мне в сторону того, что могло измениться с помощью AVAudioPlayer в iOS 10?

ответ

7

Это ошибка Apple, которая имеет 2 обходные пути, пока мы ждем исправления в прошивкой 10.2:

(1) (хуже) включить фоновый звук

(2) (лучше) см Apple, ниже сообщение

сообщение от Apple: Это известная проблема, которая будет исправлена ​​в 10.2. В то же время должно работать другое упрощенное обходное решение: сначала запустите создание звукового движка перед входом в фоновый режим (например, при настройке). Вы можете вызвать это просто, получив звуковой движок из SCNView:

scnView.audioEngine;

+2

Спасибо !!! Apple отклонила обновление, когда пыталась включить фоновый звук, потому что я его фактически не использовал, но просто вызываю '[_sceneView audioEngine];' похоже, исправил его. Еще раз спасибо! – Nerrolken

+0

Вариант 2, как представляется, останавливает (и предотвращает) фоновое воспроизведение звука другими приложениями, когда приложение SceneKit запущено, - попробовал, казалось, исправить проблему, но я начал получать жалобы от пользователей. Вариант 1, кажется, работает и не останавливает другой фоновый звук (из моего тестирования до сих пор) – StephenT

+0

Я не получил scnView.audioEngine, что это значит? – OtakuFitness

8

Это исключение с кодом 561015905 - связанное с AVAudioSessionErrorCodeCannotStartPlaying. Этот тип ошибки может возникнуть, если список свойств информации приложения не позволяет использовать аудио, или если приложение находится в фоновом режиме и использует категорию, которая не позволяет использовать фоновый звук.

Пожалуйста, ознакомьтесь с документацией до AVAudioSessionErrorCodeCannotStartPlaying. Надеюсь, эта помощь.

+0

Bizarre. По-видимому, добавление возможности «Фонового звука» для моего приложения устраняло крах, хотя я не был и до сих пор не воспроизвожу аудио в фоновом режиме. Не уверен, что вызвало этот крах для запуска на iOS 10, но, по крайней мере, у меня есть решение. Благодаря! – Nerrolken