App Crash wenn der Apple Timer auslöst.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bei mir läuft in der App ein Metronom und sobald der Timer ausgelöst wird, also zu Ende ist und iOS die Notification anzeigt, stürzt die App ab wenn das Metronom läuft. Wenn das Metronom nicht läuft stürzt auch nichts ab. Ich benutze DispatchQueue damit das Metronom stabil läuft. Ich denke daran liegt es möglicherweise...
    Wenn ich jetzt das Metronom beenden könnte bevor die Notifikation angezeigt wird wäre das Problem gelöst.

    Mit den oben genannten "laufenden Prozesse" sind von mir programmierter Code gemeint (das Metronom und andere Berechnungen die währenddessen am arbeiten sind). Kein iOS Feature...

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von lololarumpel ()

  • Ohne Code wird das schwierig.
    Ich verstehe nicht, warum Du mit Ende des Timers nicht einfach das Metronom beendest und dann die Notification anzeigst.
    Allerdings ist auch nicht ganz klar, was jetzt mit Timer gemeint ist.

    Generell riecht das nach Problemen durch Multithreading.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Okay ich merke, dass meine Erklärung nicht verständlich genug ist. Ich versuche es noch einmal.

    Man stellt also mit der Apple Uhren App einen Timer oder einen Wecker. Dann geht man in meine App und startet das Metronom. Wenn jetzt der Timer der Uhren App beendet ist oder die Weckzeit erreicht ist dann stürzt die App ab. Man sieht eine Notification der Uhren App dass eben der Timer beendet ist und es bimmelt ... das kennt man ja.

    Den Absturz würde ich gerne unterbinden indem ich das Metronom zu Beginn der Notification (der Uhren App) oder eben kurz davor stoppe. Die App stürzt ja nur wegen dem Metronom ab, wenn es nicht läuft ist alles gut und nichts stürzt ab.
    Doch leider weiß ich nicht wie meine App in Erfahrung bringen kann dass der Timer gleich beendet ist.

    Ursprünglich dachte ich ich könnte mich mit dem NotificationCenter über den Erhalt von Benachrichtigungen, die von bestimmten Apps kommen, informieren lassen. So wie man sich zum Beispiel mit "didBecomeActiveNotification" über das erneute Aktivieren der App oder mit "routeChangeNotification" über denWechsel der Audio Ausgabe benachrichtigen lassen kann.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von lololarumpel ()

  • Ohne Code wird das schwierig.
    Da Audio-Apps jedweder Art (Musik, Podcast, YouTube…) sich langsam leise faden, damit die Notification spielen kann, macht Dein Metronom irgendwas Eigenes und fällt dabei hin, wenn ihm die Notification den Zugriff auf die Audioausgabe blockiert.

    Statt zu versuchen Annahmen über Timer zu machen (die spätestens bei Anruf hinfällig sein dürften) solltest Du eher versuchen, die Audioausgabe des Metronom so zu gestalten, dass sie sich in das Betriebssystem einfügt.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Klar, wäre es ebenfalls eine Möglichkeit die Audioausgabe des Metronom so zu gestalten, dass die App dann nicht abstürzt. Man sollte jetzt ja auch denken, wie du auch angedeutet hast, dass die App auch bei einem Anruf abstürzt - doch das passiert nicht, die App stürzt dann nicht ab.

    Meine Frage war aber ja eigentlich ob es die Möglichkeit gibt die "Uhren App Notification wenn der Timer zu Ende ist" abfangen kann.
  • Hier ist die Ausgabe aus der Konsole:

    2020-09-01 11:44:04.951165+0200 [2304:1616515] [avae] AVAEInternal.h:70:_AVAE_Check: required condition is false: [AVAudioPlayerNode.mm:536:StartImpl: (_engine->IsRunning())]
    2020-09-01 11:44:04.967909+0200 [2304:1616515] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: _engine->IsRunning()'
    *** First throw call stack:
    (0x18b682180 0x18a85a9f8 0x18b59b88c 0x1914f7244 0x1914f687c 0x19159ad1c 0x191599ed4 0x10114f8d4 0x10129d69c 0x10129db38 0x101298780 0x101245764 0x101245788 0x101c78c78 0x101c875e8 0x101c78c78 0x101c866fc 0x18b613b20 0x18b60ea58 0x18b60dfb4 0x18d80f79c 0x1b78ebc38 0x1010de618 0x18b0d18e0)
    libc++abi.dylib: terminating with uncaught exception of type NSException
    (lldb)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von lololarumpel ()

  • Das Metronom ist nur Teil der Ausgabe. Die eigentliche Audio Ausgabe sind Akkorde, die lange klingen.
    Ich habe verschiede Notifications im Programm, die mir mitteilen ob das Gerät gedreht wird oder in den Hintergrund geht usw. Immer dann wird die Ausgabe gestoppt. So würde ich es eigentlich auch gerne in diesem Fall tun.
    Eine andere App macht dies auch. Wenn eine "normale" Notification reinkommt läuft die Wiedergabe weiter aber wenn die Notification der Uhren App das Ende des Timers oder Weckers anzeigt stoppt die Wiedergabe. Irgendwie scheint man diese Information bekommen zu können.
  • UIApplication.willResignActiveNotification habe ich bereits implementiert wird aber leider bei der Anzeige einer Notification einer anderen App nicht aufgerufen.
    Meine App supportet noch iOS 12 , deswegen sollte "sceneWillResignActive" ausfallen.

    NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: OperationQueue.main) { (notification) in
    self.stopAll()
    self.stopArpeggio()
    self.dismissPopups()
    self.hideSavedChords()
    self.resetDisplayForStart()
    print("Did enter background")
    }
  • lololarumpel schrieb:

    Meine Frage war aber ja eigentlich ob es die Möglichkeit gibt die "Uhren App Notification wenn der Timer zu Ende ist" abfangen kann.
    Ist nicht möglich.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Über das AVAudioPlayerDelegate Protocol solltest Du mit audioPlayerBeginInterruption erfahren können, wenn die Audio Wiedergabe vom AVAudioPlayer unterbrochen wird.

    Mit den verschiedene audioPlayerEndInterruptionXXX Methoden, wann Du die Audio Wiedergabe wieder starten/fortsetzen kannst.

    Die Methoden zum Handling von Audio Interruptions sind zwar Deprecated, funktionieren allerdings noch. Alternativen dazu scheint es bisher noch nicht zu geben. Zumindest wird in der Doku leider nichts dazu erwähnt. :(
  • Ich habe es wie es aussieht. Mit dem oben genannten Tip.

    NotificationCenter.default.addObserver(forName: AVAudioSession.interruptionNotification, object: nil, queue: OperationQueue.main) { (notification) in
    self.stopAll()
    print("INTERRUPTED")
    }

    audioPlayerEndInterruptionXXX ist deprecated aber "AVAudioSession.interruptionNotification" sollte die neue Lösung dafür sein!

    DANKE für den Tip!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von lololarumpel ()