检测应用程序在加载/上次运行时崩溃了吗?

我想我的应用程序重置为标准设置,如果它在启动过程中崩溃。 最好也是如果它最后一次运行崩溃。

编辑:Crittercism有一个crittercismDidCrashOnLastLoad方法,但它只处理在加载过程中崩溃的情况。 它在我使用的库的版本中没有正常工作,但是这个问题已经被修复了。

build议?

在你的AppDelegate.m文件中做两个函数:

 void HandleException(NSException *exception) { NSLog(@"App crashing with exception: %@", exception); //Save somewhere that your app has crashed. } void HandleSignal(int signal) { NSLog(@"We received a signal: %d", signal); //Save somewhere that your app has crashed. } 

然后在你的-(BOOL)application:didFinishLaunchingWithOptions之前放置任何东西:

 NSSetUncaughtExceptionHandler(&HandleException); struct sigaction signalAction; memset(&signalAction, 0, sizeof(signalAction)); signalAction.sa_handler = &HandleSignal; sigaction(SIGABRT, &signalAction, NULL); sigaction(SIGILL, &signalAction, NULL); sigaction(SIGBUS, &signalAction, NULL); 

使用Crashlytics你可以设置CrashlyticsDelegate检测Swift或ObjC代码的崩溃。

 import Fabric import Crashlytics func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { Crashlytics.sharedInstance().delegate = self Fabric.with([Crashlytics.self]) return true } //MARK: - CrashlyticsDelegate func crashlyticsDidDetectReport(forLastExecution report: CLSReport, completionHandler: @escaping (Bool) -> Void) { completionHandler(true) } 

从Crashlytics文档

您的委托必须调用completionHandler,但不需要同步,甚至在主线程上。 用NO调用completionHandler将导致检测到的报告被删除,不会提交给Crashlytics。 这对于实现权限提示或其他更复杂的提交崩溃逻辑forms很有用。

确保在启动Crashlytics之前使用startWithAPIKey:…或通过[Fabric with:…]来设置代理。 如果不执行,则会导致在启动过程中丢失同步发生的任何代理callback。

Interesting Posts