Обнаружение приложения разбилось во время загрузки/в последний раз, когда он был запущен?

Я хотел бы, чтобы мое приложение было 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:... или через [Ткань с:...]. Невыполнение приводят к отсутствию любых обратных вызовов делегатов, которые происходят синхронно во время запуска.