【问题标题】:Detect app crashed during load / last time it was run?检测应用程序在加载期间/上次运行时崩溃?
【发布时间】:2012-06-04 17:15:14
【问题描述】:

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

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

建议?

【问题讨论】:

    标签: ios xcode crittercism


    【解决方案1】:

    在您的 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);
    

    【讨论】:

    • 嗯,看起来很有用。它会与 Crittercism 产生不良反应吗?
    • 好的,我已经测试过了,它实际上会禁用 Crittercism。我想我会尝试说服他们将这个功能添加到他们的产品中。谢谢你的建议,很有帮助。
    • 好吧,我给他们写了一个很好的说明。当/如果我收到他们的消息时,将在此处更新 cmets。
    • 我刚试过这个,我想知道为什么 HandleSignal() 没有被调用?
    • 如果没有SIGABRTSIGKILLSIGBUS,为什么NSSetUncaughtExceptionHandler 不够用?
    【解决方案2】:

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

    在启动 Crashlytics 之前确保已设置委托 使用 startWithAPIKey:… 或通过 [Fabric with:…]。不做遗嘱 导致丢失任何同步发生的委托回调 开始时。

    【讨论】:

    • 以下两行的顺序很重要。如果您切换顺序,它将不起作用。 Crashlytics.sharedInstance().delegate = self Fabric.with([Crashlytics.self])
    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多