Auf Fehler vom Handy reagieren

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

  • Auf Fehler vom Handy reagieren

    Wie kann ich auf einen Fehler im IOS System reagieren. Manchmal geht Etwas bei einem Handy und bei einem anderen nicht. In Xcode zeigt mir der debugger bei manchen IOS Versionen und Handys Fehler an und andermal nicht. Ich möchte nun darauf reagieren können, wenn es auf einem Handy einen Fehler gibt, um dann bei diesem Handy etwas anderes zu machen.

    Dazu muss ich aber wissen, dass es ein Fehler gab AUF DEM HANDY, NACH der Ausführung meines Codes.

    Ich möchte in viewWillAppear das Handy fragen, ob es einen Fehler gegeben hat in der Zwischenzeit (z. B. weil das speichern nicht möglich war). Den Fehler muss ich gar nicht wissen oder kann ich den auch abfragen?


    Bisher habe ich unterschiedlichen Code je nach Version

    Java-Quellcode

    1. if #available(iOS 12.0, *) {
    2. let activityViewController = UIActivityViewController(activityItems: [pdfData], applicationActivities: nil)
    3. activityViewController.popoverPresentationController?.sourceView = self.view // für IPAD nötig
    4. self.present(activityViewController, animated: true, completion: nil)
    5. } else {
    6. let dateiName = "Vitalstoffwerte " + heuteString
    7. let fileUrl = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(dateiName).pdf")
    8. do {
    9. try pdfData.write(to: fileUrl, options: .atomic)
    10. } catch {
    11. print(error,"file not save")
    12. }
    13. let activityViewController = UIActivityViewController(activityItems: [fileUrl], applicationActivities: nil)
    14. activityViewController.popoverPresentationController?.sourceView = self.view // für IPAD nötig
    15. self.present(activityViewController, animated: true, completion: nil)
    16. }
    Alles anzeigen
    Ich möchte aber lieber zuerst versuchen meine bevorzugten Code auszuführen und wenn dieser einen Fehler im Handy ergibt, etwas anderes.

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

  • Auch auf die Gefahr hin, nun mit Binsenweisheiten zu antworten:

    Du solltest Dir sehr genau klar werden, was für Dich ein "Fehler" zur Laufzeit ist. Prinzipiell sehe ich da drei unterschiedliche Situationen:
    1. Dein Code ist buggy, sprich Du verwendest z. B. Methoden, die für die iOS-Version des Gerätes nicht verfügbar sind (entweder, weil sie zu neu oder nicht nur "deprecated" sondern echt entfallen sind). Diese Fälle kannst und sollst Du im Vornherein berücksichtigen, z. B. wie in Deinem Code oben mit Abfrage der iOS-Version. Besser ist es, die Verfügbarkeit einer Klasse oder eines Selectors direkt abzufragen. Andere Fehlertypen wie Indexüberläufe, nicht initialisierte Variablen, ... sind ebenfalls durch robusten Code und gutes Testen auszuräumen. Wenn alles nichts hilft, siehe (3).
    2. Du rufst Methoden auf, die in eine Fehlersituation laufen: Server Time-Outs, Datei nicht mehr vorhanden, File-Coordination fehlgeschlagen, was auch immer: Im Regelfall bieten derartige Methoden einen Rückgabewert, häufig sogar ein detailliertes NSError-Objekt. Wann immer Du derartige Informationen bekommst, nutze sie für ein kontrolliertes Reagieren auf den konkreten Fehlerfall.
    3. Möchtest Du erkennen, ob Deine App aus irgendeinem Grund abnormal beendet wurde? Dann könntest Du z. B. bei Start ein Flag in den UserDefaults setzen, dass beim Ende (auch bei "normaler" Terminierung über das Betriebssystem) wieder entfernt wird. Beim nächsten Start würdest Du dann ein "abnormal ending" erkennen ... wofür auch immer das gut sein kann.
    Ergo: Wenn etwas "auf einem Handy geht und auf einem anderen nicht", gibt es dafür in der Regel einen Grund, meist aus der Kategorie (1). Mach' Deinen Code robust und Du schläfst besser... :)

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Zuerst mal danke für deine Tips.

    Ich gebe den Benutzer die Möglichkeit eine gespeicherte Liste zu drucken als pdf zu öffnen und zu speichern oder direkt als pdf File zu speichern (was letztlich aufs gleiche drauf ankommt). Beide Codevarianten sind dazu möglich. Bei der ersten wird der Dateiname aber vom iOS selber bestimmt und bekommt das aktuelle Datum. Bei der zweiten Variante kann ich selber bestimmen. Die zweite Variante funktioniert aber nicht bei IOS 12 (vielleicht ändert sich das ja noch).

    Bei der ersten Variante zeigt mir der Simulator von XCODE bei IOS12 folgende Fehlermeldung:

    Vitalstoffcontroller[920:10806] [default] [ERROR] Failed to determine whether URL /Users/lukashedinger/Library/Developer/CoreSimulator/Devices/45A185C5-6DEA-4A52-B415-939758FB7F7E/data/Containers/Data/Application/A0BD2CC0-14A0-4BF1-AF8D-E1C429DE7774/tmp/Vitalstoffwerte 17102018-17102018.pdf (n) is managed by a file provider
    2018-10-18 10:58:52.325725+0200 Vitalstoffcontroller[920:10806] [ShareSheet] cancelled request - error: The operation couldn’t be completed. Invalid argument

    Sobald sich meine App wider aktiviert hat, möchte ich herausfinden, ob es einen Fehler gab und darauf reagieren können. Am besten wäre natürlich, wenn ich herausfinden könnte, ob es den obigen Fehler gab.

    Alternativ würde es auch genügen, wenn ich verhindern könnte, dass der Benutzer versucht, die Daten als Datei zu speichern. Drucken und PDF funktioniert nämlich bei IOS 12 auch mit der ersten Variante. Ich habe aber in den Foren gelesen, die Option die Daten als Datei zu speichern könne man beim anzeigen des UIActivityViewController nicht verhindern.