【发布时间】:2012-06-04 17:15:14
【问题描述】:
如果我的应用在启动期间崩溃,我希望它重置为标准设置。 最好在上次运行时崩溃。
编辑:Crittercism 有一个crittercismDidCrashOnLastLoad 方法,但它只处理加载期间崩溃的情况。它在我使用的库版本中无法正常工作,但已经修复。
建议?
【问题讨论】:
标签: ios xcode crittercism
如果我的应用在启动期间崩溃,我希望它重置为标准设置。 最好在上次运行时崩溃。
编辑:Crittercism 有一个crittercismDidCrashOnLastLoad 方法,但它只处理加载期间崩溃的情况。它在我使用的库版本中无法正常工作,但已经修复。
建议?
【问题讨论】:
标签: ios xcode crittercism
在您的 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);
【讨论】:
SIGABRT、SIGKILL 和SIGBUS,为什么NSSetUncaughtExceptionHandler 不够用?
然后,您可以使用 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:…]。不做遗嘱 导致丢失任何同步发生的委托回调 开始时。
【讨论】: