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
.
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!
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!):
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.
Tags und Links ios swift avaudiosession avaudioengine