- App 启动时创建一个捕获异常的单例
CrashHandler
- 通过单例创建捕获崩溃,使用的是
NSSetUncaughtExceptionHandler(NSUncaughtExceptionHandler * _Nullable)
方法 - 持有异常回调的方法,根据捕获到的异常(分为NSException、Signal 两种),分析捕获的堆栈信息
- 友好弹出崩溃提示(文案可以定义)
- 获取当前崩溃堆栈的runloop,本根据它获取所有的runloop,强制运行所有runloop,起到App保活效果
捕获方法目前只可以执行一次,下次触发崩溃后,会跳过捕获方法,直接崩溃。
-
将
CrashHandler
的.h .m 文件拖入你的仓库 -
程序启动时,配置handler ,我是在Appdelegate进行。参考如下代码
[CrashHandler sharedInstance]; __weak typeof(self) weakSelf = self; [[CrashHandler sharedInstance] crash:^{ [weakSelf showFriendlyTips]; }];
-
在捕获到崩溃后
showFriendlyTips
方法里,你可以自行提示弹窗 -
执行重置App 的启动页方法
resetApp
,来跳过崩溃的页面,你也可以自行修改。参考如下:// 重置App 的根控制器(可以改成你需要的) - (void)resetApp{ NSLog(@"起死回生"); UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; UINavigationController *navi = [storyBoard instantiateInitialViewController]; [self keyWindow].rootViewController = navi;
-
PS. 你甚至可以在
handleException
方法中,根据获取的崩溃文件,上传到服务器,供后续自行分析方法调用堆栈,创建你自己的异常分析系统。具体代码为:
- (void)handleException:(NSException *)exception { NSString *message = [NSString stringWithFormat:@"崩溃原因如下:\n%@\n%@", [exception reason], [[exception userInfo] objectForKey:kCaughtExceptionStackInfoKey]]; NSLog(@"%@",message); // 可以将上述的崩溃文件,上传至服务器供分析 }
打印信息如下:
Have Fun!最好还是要彻底检查崩溃来源