2012-06-04 38 views
16

我想我的應用程序重置爲標準設置,如果它在啓動過程中崩潰。如果它最後一次運行,它最好也崩潰。檢測應用程序在加載/上次運行時崩潰了嗎?

編輯:Crittercism有一個crittercismDidCrashOnLastLoad方法,但它只處理加載期間崩潰的情況。它在我使用的庫的版本中沒有正常工作,但是此後已被修復。

建議?

回答

27

製作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

嗯,看起來很有用。它會與Crittercism嚴重相互作用嗎? –

+2

好的,我測試過了,它實際上會禁用Crittercism。我想我會試着說服他們在他們的產品中添加這個功能。感謝您的建議,這是最有幫助的。 –

+0

很高興知道,我沒有使用'Crittercism',但可能他們用類似的方式處理它,這也是'TestFlight'處理錯誤記錄的方式。你實際上可以問他們如何使用未捕獲的異常處理程序和你的一起... – graver

4

使用Crashlytics你那麼可以設置CrashlyticsDelegate來檢測斯威夫特或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:...]設置代理。如果不成功, 會導致在啓動過程中丟失同步發生的任何代理回調 。

相關問題