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

时间:2012-06-04 17:15:15

标签: ios xcode crittercism

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

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

建议?

2 个答案:

答案 0 :(得分:33)

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);

答案 1 :(得分:6)

使用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 docs

  

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

     

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