今天弄了一个之前没有弄过的功能,捕获app的异常,虽然不难,但还是想记录一下。
第一步、在哪里捕获
当然是在你出错的控制器里捕获,如果你想全局捕获,那你就把捕获方法写在你的根控制器里,比如BaseViewController.m里面
第二步、如何捕获
两段代码,代码量很少哒
第一处:写在ViewDidLoad里面
NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);
刚刚那句的意思就是添加一个捕获异常的监控的东西
第二处:写在外面,就是实现刚刚那个括号里的方法
void UncaughtExceptionHandler(NSException *exception) {
NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息
NSString *reason = [exception reason];//非常重要,就是崩溃的原因
NSString *name = [exception name];//异常类型
NSLog(@"exception type : %@ \n crash reason : %@ \n call stack info : %@", name, reason, arr);
NSString *errorinfo = [NSString stringWithFormat:@"异常类型: %@ 闪退原因 : %@ 闪退进程: %@", name, reason, arr ];
NSUserDefaults *accountDefaults = [NSUserDefaults standardUserDefaults];
[accountDefaults removeObjectForKey:KAppErrorInfo];
[accountDefaults setObject:errorinfo forKey:KAppErrorInfo];
}
上面就是如果你程序崩了的时候会调用的方法,里面可以捕获到异常最主要的信息了。
注意
你如果捕获到异常,想要把错误信息传给服务器,那是不可能的,因为你调不能接口的,所以,你只能等下次程序启动的时候再把上次崩掉的报错日志上传给服务器,So,你一定要在捕获崩溃的方法里把上次的错误信息保存为全局的,就是用NSUserDefaults这货来保存。
蓝后:
你可以在AppDelegate.m里面加上如下代码:
NSUserDefaults *accountDefaults = [NSUserDefaults standardUserDefaults];
NSString *errorinfo = [accountDefaults objectForKey:KAppErrorInfo];
if(!(errorinfo==nil)){
[AccountModel UploadErrorInfo:errorinfo type:@"03"];
}
酱紫,你就可以在启动的时候获取到上次你程序crash的错误日志啦。
吼吼吼,今天枫子酱就哆嗦这么多啦,纯属自个儿记录哒。