2016-09-17 19 views
15

Mam aplikację z bardzo podstawowym komponentem audio: zestaw pętli podkładów tła odtwarzanych z AVAudioPlayer (nazwy plików utworów przechowywane jako tablica). Wszystko działa dobrze od miesięcy, ale iOS 10 zawiesza się dla znacznej liczby moich użytkowników (tysiące dziennie).Awaria odtwarzania AVFAudio na iOS 10

Problem polega na tym, że nie mogę określić, co zmieniło się w iOS 10. Wydaje się, że za każdym razem, gdy użytkownik blokuje swoje urządzenie, a konkretnie zdarza się, gdy muzyka kończy się zanika (nie robi tła audio, więc pozostawiając aplikacji automatycznie zanika muzyka).

W tym momencie, mam to za każdym razem:

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 

Oto ślad stosu:

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

I tu jest mój kod. Jest to jedyna część mojego kodu, która w jakikolwiek sposób obsługuje dźwięk.

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

widzę tę katastrofę na iPhone'ach, iPadach i iPodach touch, ale wyłącznie na iOS 10.0.0 i 10.0.1. Szukałem tych "[aurioc]" godzin, ale nie mogę znaleźć niczego użytecznego, i jest napisane w żargonie, którego nie potrafię parsować.

Czy ktoś może mi pokazać, co robię źle, lub pomóc mi wskazać kierunek, który mógł ulec zmianie w AVAudioPlayer w iOS 10?

Odpowiedz

7

Jest to bug jabłko, które ma 2 obejścia podczas gdy czekamy na poprawki w iOS 10.2:

(1) (gorzej) umożliwiają dźwięku tła

(2) (lepiej) patrz komunikat firmy Apple poniżej

wiadomość od Apple: Jest to znany problem, który zostanie rozwiązany w wersji 10.2. W międzyczasie powinno działać jeszcze jedno prostsze obejście: Wyzwalaj tworzenie silnika audio przed wejściem do tła (na przykład podczas instalacji). Możesz to uruchomić, pobierając silnik audio z SCNView:

scnView.audioEngine;

+2

Dziękujemy! Apple odrzucił aktualizację, w której próbowałem włączyć dźwięk w tle, ponieważ tak naprawdę go nie używałem, ale po prostu wywołanie '[_sceneView audioEngine];' wydaje się naprawić. Dzięki jeszcze raz! – Nerrolken

+0

Opcja 2 wydaje się zatrzymywać (i zapobiegać) odtwarzaniu dźwięku w tle przez inne aplikacje, gdy aplikacja SceneKit jest uruchomiona - próbowała, wydawało się, że rozwiązała problem, ale zacząłem otrzymywać skargi od użytkowników. Opcja 1 wydaje się działać i nie zatrzymuje innego dźwięku w tle (z moich dotychczasowych testów) – StephenT

+0

Nie dostałem scnView.audioEngine, co to znaczy? – OtakuFitness

8

Ten wyjątek z kodem 561015905 - powiązany z AVAudioSessionErrorCodeCannotStartPlaying. Ten typ błędu może wystąpić, jeśli lista właściwości Informacje aplikacji nie zezwala na użycie dźwięku lub aplikacja jest w tle i używa kategorii, która nie pozwala na dźwięk w tle.

Proszę spojrzeć na dokumentację do AVAudioSessionErrorCodeCannotStartPlaying. Mam nadzieję, że to pomoże.

+0

Dziwaczne. Najwyraźniej dodanie możliwości "dźwięku w tle" do mojej aplikacji naprawiło awarię, mimo że nie byłem i nadal nie odtwarzam dźwięku w tle. Nie jestem pewien, co spowodowało uruchomienie się awarii w systemie iOS 10, ale przynajmniej mam rozwiązanie. Dzięki! – Nerrolken

Powiązane problemy