2016-05-13 13 views
3

Ich habe gesucht, habe aber noch keine Antwort gefunden, die mich nicht zu einem 3rd Party Service führt. Ich brauche nichts Kompliziertes, nur um einen Wert in NSUserDefaults zu speichern. Wenn die App als nächstes geöffnet wird, kann ich eine Warnung anzeigen, die besagt, dass die App abgestürzt ist.Swift: Nativ erkennen, ob App abgestürzt ist

Danke.

+0

Werfen Sie einen Blick auf: htt p: //stackoverflow.com/questions/10885313/detect-app-crashed-during-load-last-time-it-was-run –

Antwort

9

Dank eine wenig Hilfe von @RyanCollins zu bedienen, ich war in der Lage, das Problem selbst zu lösen. Die Funktion applicationWillTerminate im App-Delegaten wird nur ausgeführt, wenn die App ordnungsgemäß geschlossen wird. Der Code zum nativen Erkennen eines App-Absturzes sieht folgendermaßen aus.

global definierte Variablen

let crashedNotificationKey = "com.stackoverflow.crashNotificationKey" 
var crashedLastTime : Bool! = true 

App Delegierter

func applicationWillTerminate(application: UIApplication) { 
    crashedLastTime = false 
    prefs.setBool(crashedLastTime, forKey: "crash") 
} 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    crashedLastTime = prefs.boolForKey("crash") 
    if crashedLastTime == true { 

     crashedLastTime = false 
     prefs.setBool(crashedLastTime, forKey: "crash") 
     NSNotificationCenter.defaultCenter().postNotificationName(crashedNotificationKey, object: self) 

    } else { 

     crashedLastTime = true 
     prefs.setBool(crashedLastTime, forKey: "crash") 

    } 

    return true 
} 

Root-View-Controller-

override func awakeFromNib() { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "crashedAlert", name: crashedNotificationKey, object: nil) 
} 

func crashedAlert() { 
    let alert = UIAlertController(title: "The app has crashed!", message: "Sorry about that! I am just a 17 year old highschooler making my first game!", preferredStyle: UIAlertControllerStyle.Alert) 
    alert.addAction(UIAlertAction(title: "It's cool bro.", style: UIAlertActionStyle.Default, handler: nil)) 
    self.presentViewController(alert, animated: true, completion: nil) 
} 
+0

Sehr gute Antwort! – Leyton

+0

Froh, dass Sie etwas gefunden haben, das für Sie arbeitet! –

+0

Habe nicht getestet, aber ich denke, hier ist ein Fehler. Nachdem Sie den Wert von crashedLastTime in der Funktion didFinishLaunchingWithOptions der Anwendung überprüft haben, setzen Sie den gespeicherten Booleschen Wert immer auf 'true'. ZB: prefs.setBool (true, forKey: "crash") – Awesomeness

1

Das Problem ist, wenn die App abgestürzt ist, kann es nicht Code zum Schreiben auf NSUserDefaults ausführen.

Die beste Lösung, die ich kenne, ist PLCrashReporter (https://plcrashreporter.org)

+0

Gibt es eine Funktion oder irgendetwas, das ausgeführt wird, wenn die App ordnungsgemäß geschlossen wird? Zum Beispiel "applicationWillResignAktiv", aber dies wird auch ausgeführt, wenn die App abstürzt. –

+0

Ja, in Ihrem App-Delegaten gibt es Funktionen wie 'applicationWillTerminate' und' applicationDidEnterBackground', die genau das tun. –

+0

Ich werde das untersuchen und zu dir zurückkommen. –