AvoidCrash程序崩溃拦截,友好化提示,程序不崩溃。
作者demo下载地址:https://github.com/chenfanfang/AvoidCrash
#pragma mark ==== 拦截程序崩溃、卡死 S================
//crash拦截,让程序不在卡死、闪退。而是提示用户
-(void)getCXCrash{
// 对 NSMutableArray+AvoidCrash.m 文件进行 -fno-objc-arc 设置(若使用CocoaPods集成则无需手动配置),配置过程如:build phases 搜索到.m文件后在右边点击设置。
// :跟友盟crash统计冲突,需要关闭友盟的拦截:[MobClick setCrashReportEnabled:NO];,但是后来我没有关闭友盟也没事,作者说没影响的,不过用了拦截,友盟收集不到崩溃日志了。作者间书介绍:https://www.jianshu.com/p/2b90aa96c0a0
/*
* [AvoidCrash becomeEffective]、[AvoidCrash makeAllEffective]
* 是全局生效。若你只需要部分生效,你可以单个进行处理,比如:
* [NSArray avoidCrashExchangeMethod];
* [NSMutableArray avoidCrashExchangeMethod];
* .................
* .................
*/
//启动防止崩溃功能(注意区分becomeEffective和makeAllEffective的区别)
//具体区别请看 AvoidCrash.h中的描述
//建议在didFinishLaunchingWithOptions最初始位置调用 上面的方法
[AvoidCrash makeAllEffective];//让所有拦截生效
//注意:⚠️
//setupNoneSelClassStringsArr:和setupNoneSelClassStringPrefixsArr:
//可以同时配合使用
//=============================================
// 1、unrecognized selector sent to instance
//=============================================
//若出现unrecognized selector sent to instance并且控制台输出:
//-[__NSCFConstantString initWithName:age:height:weight:]: unrecognized selector sent to instance
//你可以将@"__NSCFConstantString"添加到如下数组中,当然,你也可以将它的父类添加到下面数组中
//比如,对于部分字符串,继承关系如下
//__NSCFConstantString --> __NSCFString --> NSMutableString --> NSString
//你可以将上面四个类随意一个添加到下面的数组中,建议直接填入 NSString
// * ⚠️不可将@"NSObject"加入classStrings数组中
// * ⚠️不可将UI前缀的字符串加入classStrings数组中
//把需要拦截的添加到下面数组中
NSArray *noneSelClassStrings = @[
@"NSString",
@"CXRootViewController"//拦截跟控制器崩溃
];
[AvoidCrash setupNoneSelClassStringsArr:noneSelClassStrings];
//=============================================
// 2、unrecognized selector sent to instance
//=============================================
//若需要防止某个前缀的类的unrecognized selector sent to instance
//比如AvoidCrashPerson
//你可以调用如下方法
// ⚠️不可将UI前缀的字符串(包括@"UI")加入classStringPrefixs数组中
// * ⚠️不可将NS前缀的字符串(包括@"NS")加入classStringPrefixs数组中
NSArray *noneSelClassPrefix = @[
@"AvoidCrash",
];
[AvoidCrash setupNoneSelClassStringPrefixsArr:noneSelClassPrefix];
//监听通知:AvoidCrashNotification, 获取AvoidCrash捕获的崩溃日志的详细信息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealwithCrashMessage:) name:AvoidCrashNotification object:nil];
//注意需要关闭友盟错误统计,不然自己项目中的crash无法拦截 [MobClick setCrashReportEnabled:NO];
//目前可以防止崩溃的有:NSArray NSMutableArray NSDictionary NSMutableDictionary NSString NSMutableString KVC NSMutableAttributedString NSAttributedString
}
//拦截到crash的通知
- (void)dealwithCrashMessage:(NSNotification *)note {
//不论在哪个线程中导致的crash,这里都是在主线程
//注意:所有的信息都在userInfo中
//你可以在这里收集相应的崩溃信息进行相应的处理(比如传到自己服务器)
//详细讲解请查看 https://github.com/chenfanfang/AvoidCrash
NSLog(@"拦截到崩溃日志:\n%@",note.userInfo);//崩溃日志打印,不要屏蔽
//程序crash提示
UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"提示" message:@"捕获到程序数据异常" delegate:nil cancelButtonTitle:@"知道了" otherButtonTitles:nil];
[alter show];
}
#pragma mark ==== 拦截程序崩溃、卡死 E================