Обнаружение приложения разбилось во время загрузки/в последний раз, когда он был запущен?
Я хотел бы, чтобы мое приложение было reset для стандартных параметров, если оно разбилось во время запуска. Также предпочтительно, если он потерпел крах в последний раз, он был запущен.
EDIT: Crittercism имеет метод crittercismDidCrashOnLastLoad, но он обрабатывает только случай сбоя во время загрузки. Он не работал должным образом в версии библиотеки, которую я использовал, но с тех пор она исправлена.
Предложения?
Ответы
Ответ 1
Сделайте 2 функции в вашем файле AppDelegate.m
:
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);
Ответ 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 docs
Ваш делегат должен ссылаться на completeHandler, но не нужно делать это синхронно или даже по основному потоку. Вызов completeHandler с NO приведет к удалению обнаруженного отчета и не представлены Crashlytics. Это полезно для реализации подсказки разрешения или другие более сложные формы логики вокруг подача сбоев.
Убедитесь, что делегат настроен перед запуском Crashlytics с startWithAPIKey:... или через [Ткань с:...]. Невыполнение приводят к отсутствию любых обратных вызовов делегатов, которые происходят синхронно во время запуска.