iOS 使用NSSetUncaughtExceptionHandler收集Crash

在iOS程序崩潰時,一般我們是用Bugtags、Bugly、友盟等第三方收集崩潰,其實官方提供的NSUncaughtExceptionHandler來收集crash信息。實現(xiàn)方式如下:
自定義一個UncaughtExceptionHandler類,在.h中:

@interface CustomUncaughtExceptionHandler : NSObject

+ (void)setDefaultHandler;
+ (NSUncaughtExceptionHandler *)getHandler;

@end

在.m中實現(xiàn):

#import "CustomUncaughtExceptionHandler.h"

// 沙盒的地址
NSString * applicationDocumentsDirectory() {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
 

// 崩潰時的回調(diào)函數(shù)
void UncaughtExceptionHandler(NSException * exception) {
    NSArray * arr = [exception callStackSymbols];
    NSString * reason = [exception reason]; // // 崩潰的原因  可以有崩潰的原因(數(shù)組越界,字典nil,調(diào)用未知方法...) 崩潰的控制器以及方法
    NSString * name = [exception name];
    NSString * url = [NSString stringWithFormat:@"crash報告\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[arr componentsJoinedByString:@"\n"]];
    NSString * path = [applicationDocumentsDirectory() stringByAppendingPathComponent:@"crash.txt"];
    // 將一個txt文件寫入沙盒
    [url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
 }

@implementation CustomUncaughtExceptionHandler
    
 + (void)setDefaultHandler {
    NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
}
 
+ (NSUncaughtExceptionHandler *)getHandler {
    return NSGetUncaughtExceptionHandler();
}

@end

這樣我們就實現(xiàn)好了一個自定義UncaughtExceptionHandler類,接下來只需要在合適的地方獲取crash文件以及傳到服務(wù)器上去即可,如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    //崩潰日志
    [CustomUncaughtExceptionHandler setDefaultHandler];
    //獲取崩潰日志,然后發(fā)送
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *dataPath = [path stringByAppendingPathComponent:@"crash.txt"];
    NSData *data = [NSData dataWithContentsOfFile:dataPath];
    if (data != nil) {
         //發(fā)送崩潰日志
        NSLog(@"crash了:%@",data);
    }
 }

推薦閱讀:

iOS面試匯總含面經(jīng),面試講解面試題等欄目持續(xù)更新

作者:溫潤如玉盧三哥
鏈接:https://juejin.cn/post/6953142642746064910

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在iOS程序崩潰時,一般我們是用Bugtags、Bugly、友盟等第三方收集崩潰,其實官方提供的NSUncaugh...
    盧叁閱讀 1,780評論 2 1
  • 一、關(guān)于線程和調(diào)度的一些基本概念 1.1 什么是線程 線程是操作系統(tǒng)能夠進(jìn)行運算調(diào)度的基本單位。它被包含在進(jìn)程之中...
    ac41d8480d04閱讀 1,097評論 0 2
  • 這篇文章其實想探討一下 crash 都有哪些種類,以及如何解決醬紫,感覺自己之前好像有淺談過log(https:/...
    木小易Ying閱讀 1,376評論 1 8
  • 為了更好的維護(hù)iOSApp,處理程序崩潰是必需要做的,那么如何收集用戶使用時出現(xiàn)的崩潰呢? 1.應(yīng)用崩潰收集方法:...
    白如晝閱讀 2,552評論 0 1
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,896評論 28 54

友情鏈接更多精彩內(nèi)容