iOS NSSetUncaughtExceptionHandler 方法

使用 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);
    }
}

获取系统时间,拼接异常信息,按日期创建文件夹,写入文件。
结果如下:

截屏2020-06-09 下午4.40.38.png

每次程序崩溃,都会调用此方法将信息写入log文件。

你可能感兴趣的:(iOS NSSetUncaughtExceptionHandler 方法)