2012-06-04 2 views
16

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

EDIT: Crittercism имеет метод crittercismDidCrashOnLastLoad, но он обрабатывает только случай сбоя во время загрузки. Он не работал должным образом в версии библиотеки, которую я использовал, но с тех пор она исправлена.

Предложения?

ответ

27

Make 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

Хм, выглядит полезно. Будет ли это плохо взаимодействовать с Критерий? –

+2

Хорошо, я протестировал это, и это фактически отключит Crittercism. Я думаю, что я попытаюсь убедить их добавить эту функцию в свой продукт. Спасибо за ваш совет, это было очень полезно. –

+0

Полезно знать, я не использовал «Crittercism», но, вероятно, они обрабатывают его аналогичным образом, это также способ «TestFlight» обрабатывать журнал ошибок. Вы действительно можете спросить их, как использовать свой обработчик исключенных исключений вместе с вашими ... – graver

4

Использование 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, но не нужно делать это синхронно, или даже в главном потоке. Вызов completeHandler с NO приведет к тому, что обнаруженный отчет будет удален и не отправлен в Crashlytics. Это полезно для реализации приглашений на разрешение или других более сложных форм логики около , представляющих сбои.

Убедитесь, что делегат настроен перед запуском Crashlytics с помощью startWithAPIKey: ... или через [Ткань с: ...]. В противном случае приведет к отсутствию любых обратных вызовов делегатов, которые происходят синхронно во время запуска.

Смежные вопросы