Absturz in AVAudioEngine.start (), obwohl es in do / catch eingebunden ist

9

Ich habe den folgenden Code, um AVAudioEngine mit AVAudioEngineConfigurationChangeNotification : (/) neu zu starten %Vor%

self.engine ist definiert als

%Vor%

Allerdings erhalte ich häufig Absturzberichte über Crashlytics, die sagen

  

Schwerwiegende Ausnahme: com.apple.coreaudio.avfaudio Fehler 561015905

in der Zeile mit try self.engine.start() .

561015905 ist AVAudioSessionErrorCodeCannotStartPlaying und von was ich verstehe, sollte dies ein NSError Fehlercode sein, keine Ausnahme, die von meinem Leerzeichen catch im obigen Code abgefangen werden sollte. Dennoch scheint die App an diesem Punkt einfach abzustürzen. Was vermisse ich?

Ich weiß, dass es Situationen gibt, in denen die App im Hintergrund aufwacht, wo dieser Fehler auftreten kann, und ich würde damit einverstanden sein, solange ich es irgendwie verstehen kann, wie ich dachte, ich könnte mit do/catch .

    
Mike 14.12.2015, 13:16
quelle

2 Antworten

2

Ich habe den gleichen Fehler bei der Verarbeitung von AVAudioSessionInterruption notification festgestellt.
In meinem Fall trat der Fehler auf, als ich nach dem Ende der Unterbrechung AVAudioEngine starten wollte.
Nach einem ausführlichen Test und Debugging für eine Weile, bemerkte ich, dass die App nicht abstürzte, wenn ich ein debugger breakpoint vor audioEngine.prepare() oder audioEngine.start() einführte.
Also habe ich sleep(1) vor audioEngine.start() hinzugefügt und meine App stürzte ab!

Ich weiß, es ist keine sehr elegante Lösung, aber hoffe immer noch, dass dies jemand anderem helfen kann!

    
S1LENT WARRIOR 08.10.2016 20:06
quelle
1

Xcode Version 9.2 (9C40b) + Swift 4: Ich weiß, dass diese Frage ein wenig alt ist, aber ich hatte die gleichen Absturzprobleme mit audioEngine.start() , obwohl in einem do / try / catch und erhalten auch die folgenden von Crashalytics:

  

Schwerwiegende Ausnahme: com.apple.coreaudio.avfaudio Fehler 561015905

S1LENT WARRIOR Schlaf (1) "Hack" funktionierte in einigen Fällen, aber nicht alle (speziell mit AVAudioEngineConfigurationChangeNotification Selektor).

Schließlich habe ich Obj-C Exception Handling verwendet, um den Fehler wirklich zu fangen, so dass kein Absturz auftritt, von diesem sehr nützlichen Beitrag von freytag (großer Dank!):

Catching NSException in Swift

Nach der Implementierung der ObjC-Dateien .h und .m und des Bridging-Headers mache ich jetzt:

%Vor%

Sie können dies testen, indem Sie die Motorinitialisierung verschrauben (z. B. nicht .anfügen oder verbinden.) und keinen Absturz ... nur:

  

2018-01-06 10: 01: 48.890801 + 0700 XXXXXX [16389: 3367770] [avae] AVAEInternal.h: 70: _AVAE_Check: erforderliche Bedingung ist falsch: [AVAudioEngineGraph.mm:1209:Initialize: (inputNode! = nullptr || ausgabeNode! = nullptr)]   Ein Fehler ist aufgetreten: Fehler Domain = com.apple.coreaudio.avfaudio Code = 0 "(null)"

Stellen Sie sicher, dass Sie die audioEngine vor der Verwendung überprüfen, etwa wie folgt:

%Vor%

OK, Sie erhalten also keinen Ton, aber es ist ein "graziöser Fehler".

Scheint lächerlich zu sein, dass man in Swift eine Ausnahme nicht richtig abfangen kann, und ok, wenn man einige Ausnahmen nicht abfangen kann, dann gibt es zumindest eine Methode zum Testen, etwas wie audioEngine.areYouConfiguredProperly() . Oh, Moment mal, es gibt diese Methode (in Obj-C) [AVAudioEngine startAndReturnError:] , aber jemand hat beschlossen, sie mit der Funktion startEngine() zu umbrechen und alle nützlichen Funktionen zu entfernen ... doh.

    
Christian Cerri 06.01.2018 03:10
quelle