iOS AvoidCrash程序崩溃拦截提示

作者: 爱恨的潮汐 | 来源:发表于2018-07-08 17:43 被阅读0次

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================

原作者间书介绍:https://www.jianshu.com/p/2b90aa96c0a0

相关文章

网友评论

    本文标题:iOS AvoidCrash程序崩溃拦截提示

    本文链接:https://www.haomeiwen.com/subject/bxwouftx.html