23

如果我的应用在启动期间崩溃,我希望它重置为标准设置。如果它在上次运行时崩溃,最好也是如此

编辑:Crittercism有一个crittercismDidCrashOnLastLoad方法,但它只处理加载期间崩溃的情况。它在我使用的库版本中无法正常工作,但这已得到修复。

建议?

4

2 回答 2

39

AppDelegate.m在您的文件中创建 2 个函数:

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);
于 2012-06-04T18:12:03.230 回答
7

然后,您可以使用 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。这对于实现权限提示或其他更复杂的提交崩溃的逻辑形式很有用。

在使用 startWithAPIKey:... 或通过 [Fabric with:...] 启动 Crashlytics 之前,请确保已设置委托。不这样做将导致丢失在启动期间同步发生的任何委托回调。

于 2017-01-30T05:58:46.307 回答