使用 NSSetUncaughtExceptionHandler 方法,將異常信息寫入日志文件挫酿。
首先新加一個(gè)類 CatchCrash 构眯,定義方法:
void uncaughtExceptionHandler(NSException * exception);
在 didFinishLaunchingWithOptions 中設(shè)置該方法:
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
方法的具體內(nèi)容如下:
void uncaughtExceptionHandler(NSException * exception){
//獲取系統(tǒng)當(dāng)前時(shí)間,(注:用[NSDate date]直接獲取的是格林尼治時(shí)間早龟,有時(shí)差)
NSDateFormatter *formatter =[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *crashTime = [formatter stringFromDate:[NSDate date]];
[formatter setDateFormat:@"HH-mm-ss"];
NSString *crashTimeStr = [formatter stringFromDate:[NSDate date]];
[formatter setDateFormat:@"yyyyMMdd"];
NSString *crashDate = [formatter stringFromDate:[NSDate date]];
//異常的堆棧信息
NSArray *stackArray = [exception callStackSymbols];
//出現(xiàn)異常的原因
NSString *reason = [exception reason];
//異常名稱
NSString *name = [exception name];
//拼接錯(cuò)誤信息
NSString *exceptionInfo = [NSString stringWithFormat:@"CrashTime: %@\nException reason: %@\nException name: %@\nException call stack:%@\n", crashTime, name, reason, stackArray];
//把錯(cuò)誤信息保存到本地文件惫霸,設(shè)置errorLogPath路徑下
//并且經(jīng)試驗(yàn),此方法寫入本地文件有效葱弟。
NSString *errorLogPath = [NSString stringWithFormat:@"%@/CrashLogs/%@/", NSDocumentsDirectory(), crashDate];
NSFileManager *manager = [NSFileManager defaultManager];
if (![manager fileExistsAtPath:errorLogPath]) {
[manager createDirectoryAtPath:errorLogPath withIntermediateDirectories:true attributes:nil error:nil];
}
errorLogPath = [errorLogPath stringByAppendingFormat:@"%@.log",crashTimeStr];
NSError *error = nil;
NSLog(@"%@", errorLogPath);
BOOL isSuccess = [exceptionInfo writeToFile:errorLogPath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (!isSuccess) {
NSLog(@"將crash信息保存到本地失敗: %@", error.userInfo);
}
}
獲取系統(tǒng)時(shí)間壹店,拼接異常信息,按日期創(chuàng)建文件夾芝加,寫入文件硅卢。
結(jié)果如下:
每次程序崩潰,都會(huì)調(diào)用此方法將信息寫入log文件。