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

And*_*sen 23 xcode ios crittercism

我希望我的应用程序重置为标准设置,如果它在启动过程中崩溃.优选地,如果它在上次运行时崩溃了.

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

建议?

gra*_*ver 36

在您的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.
}
Run Code Online (Sandbox Code Playgroud)

然后在你-(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);
Run Code Online (Sandbox Code Playgroud)

  • 嗯,看起来很有用.它会与Crittercism相互影响吗? (2认同)
  • 好的,我已经测试了这个,它实际上会禁用Crittercism.我想我会试着说服他们将这个功能添加到他们的产品中.谢谢你的建议,这是最有帮助的. (2认同)
  • 我刚试了这个,我想知道为什么HandleSignal()没有被调用? (2认同)
  • 为什么不是`NSSetUncaughtExceptionHandler`,没有`SIGABRT`,`SIGKILL`和`SIGBUS`? (2认同)

Igo*_*gor 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)
}
Run Code Online (Sandbox Code Playgroud)

来自Crashlytics的文档

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

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