使用 NSSetUncaughtExceptionHandler 方法,将异常信息写入日志文件。
首先新加一个类 CatchCrash ,定义方法:
void uncaughtExceptionHandler(NSException * exception);
在 didFinishLaunchingWithOptions 中设置该方法:
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
方法的具体内容如下:
void uncaughtExceptionHandler(NSException * exception){
//获取系统当前时间,(注:用[NSDate date]直接获取的是格林尼治时间,有时差)
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];
//出现异常的原因
NSString *reason = [exception reason];
//异常名称
NSString *name = [exception name];
//拼接错误信息
NSString *exceptionInfo = [NSString stringWithFormat:@"CrashTime: %@\nException reason: %@\nException name: %@\nException call stack:%@\n", crashTime, name, reason, stackArray];
//把错误信息保存到本地文件,设置errorLogPath路径下
//并且经试验,此方法写入本地文件有效。
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);
}
}
获取系统时间,拼接异常信息,按日期创建文件夹,写入文件。
结果如下:
每次程序崩溃,都会调用此方法将信息写入log文件。