Objective-C自建崩潰捕獲和上傳

蘋果雖然帶了崩潰日志的功能,但是估計沒幾個人會開啟允許,普通用戶根本就不知道所謂的開發(fā)者對自己有什么作用,還會擔心安全問題.所有我們還必須對程序進行一些處理,以獲取崩潰日志.本篇文章僅獲取了系統(tǒng)崩潰日志的打印,沒有對內(nèi)存方面進行進一步分析.


SDK提供了NSSetUncaughtExceptionHandler類,用來獲取系統(tǒng)的崩潰日志.我們通過捕獲崩潰日志并上傳到服務(wù)器,可以發(fā)現(xiàn)常見的的崩潰問題,特別是在項目緊張,缺少測試時間的時候可以提供很大的幫助.
通過定義UncaughtExceptionHandler類來捕獲并記錄崩潰日志.

#import "UncaughtExceptionHandler.h"

NSString *applicationDocumentsDirectory() {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

void UncaughtExceptionHandler(NSException *exception) {
    NSArray *arr = [exception callStackSymbols];
    NSString *reason = [exception reason];
    NSString *name = [exception name];
    NSString *baseMessage = [NSString stringWithFormat:@"IDENTIFIER_NUMBER:  %@\n OSVERSION:     %@\n PHONE_TYPE:   %@\n APP_VERSION:  %@", IDENTIFIER_NUMBER, PHONE_VERSION, PHONE_TYPE, APP_VERSION];
    NSString *url = [NSString stringWithFormat:@"=============Crash Log=============\n%@\nname:\n%@\nreason:\n%@\ncallStackSymbols:\n%@", baseMessage,
                     name,reason,[arr componentsJoinedByString:@"\n"]];
    NSString *path = [applicationDocumentsDirectory() stringByAppendingPathComponent:@"Exception.txt"];
    [url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
}

@implementation BPBUncaughtExceptionHandler

- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

+ (void)setDefaultHandler {
    NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);
}
@end

然后我們需要再定義一個CrashHandler類來將捕獲的崩潰日志上傳到后臺的服務(wù)器.上傳完成之后再刪除文件.

#import "CrashHandler.h"
@implementation BPBCrashHandler

+ (void)uploadCrashLog {
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"Exception.txt"];
    NSString *str = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    if (str) {  
        [ServerReqestUtils uploadCrashLogWithContent:str callBack:^(id obj) {
            float code = [obj[@"code"] floatValue];
            if (code == 1000) {  
                NSLog(@"上傳成功!");
                [fileManager removeItemAtPath:filePath error:nil];
            }
        }];
    }
}
@end

最后只需要在didFinishLaunchingWithOptions方法內(nèi)執(zhí)行這兩個方法就可以捕獲崩潰日志了.

 [UncaughtExceptionHandler setDefaultHandler];  
 [CrashHandler uploadCrashLog];  

文章整理參考網(wǎng)絡(luò)文章,如有錯誤,歡迎討論指出。

最后編輯于
?著作權(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)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,979評論 25 709
  • 10.5 啊澤 看到讀者里的一篇文章,覺得這一段太有意思了:看到一本好書固然覺得幸運,遇到爛書也并不排斥。況且爛...
    方方不方呀閱讀 140評論 0 0
  • 我以為對待生活我很平靜,當聽到現(xiàn)實的一些事還是覺得自己什么都不懂。尤其是在人情世故方面,人畢竟是社會的人,要學會適...
    闌十三閱讀 253評論 0 11
  • 如果有一天你的媽媽告訴你:“寶貝,我之前對你的教育有些錯誤”,你會作何感想?媽8年前的這句話是我生命中一個很重...
    斜杠佳人閱讀 299評論 1 2

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