BayMaxProtector-集崩溃保护与页面降级于一体的大白保护机制

文章迁移至掘金:https://juejin.im/user/57f9cf9ea22b9d005bf78c6a

BayMaxProtector

Crash protector -take care of your application like BayMax

一、what can BayMaxProtector do?

1、BayMaxProtector 可以提高你App的稳定性,减少因为常见错误而引发的崩溃,目前支持的保护类型有四种,分别是UnrecognizedSelectorKVO(KVO重复添加、移除、或dealloc时未移除observer)、NSNotification(dealloc时未移除)NSTimer(去除了timer对target的强引用,target可以自由释放而不会产生崩溃,同时timer可以自动invalid)这四种情况。容器类的考虑到已经有较为成熟的框架,便没有加进来,如果后期有需要的话,再加入。

2、BayMaxProtector不仅为你的应用提供崩溃保护的功能,并且还通过BayMaxDegradeAssist提供了一套页面降级机制,按照该套机制的规则与约定,可以实现页面自动降级为对应的H5页面,也可以实现页面的手动降级。所谓自动降级,是指在程序发生UnrecognizedSelector错误时,会从配置中将该页面对应的urlparams(注意:如果viewdidload方法中发生错误,并且消息接受者不是视图控制器的话,获取不到参数,其他情况都可以(如网络null错误、解析错误、数据源model混乱等)),传给外界,外界可以通过这个展示对应的H5页面。手动降级是指程序本来并没有发生UnrecognizedSelector相关错误,但是由于代码业务逻辑发生错误,我们需要强制换成对应的H5页面,通过BayMaxDegradeAssist提供的接口,可以轻松地做到这些,这样就能够避免传统的防崩溃机制导致的空转状态,所谓空转是指程序不崩溃,但是无法继续进行接下来的业务逻辑。

3、BayMaxProtector将发生的错误封装为一个BayMaxCatchError对象,这个对象会根据不同的错误类型,将对应错误的描述信息打包,并通过统一的方式将错误信息回调给外界,外界可以对错误进行分类处理。

4、其他功能你可以自己探索

二、how to use?

1、 手动方式:将BayMax文件夹下的内容拖入拖入项目。
2、 Appdelegate 中设置你想要保护的类型(建议debug模式下不要开启),保护的类型是枚举类型,支持枚举的或运算。

示例:
一、带错误回调的所有类型
[BayMaxProtector openProtectionsOn:BayMaxProtectionTypeAll catchErrorHandler:^(BayMaxCatchError * _Nullable error) {
    if (error.errorType == BayMaxErrorTypeUnrecognizedSelector) {
        NSLog(@"ErrorUnRecognizedSelInfos:%@",error.errorInfos);

    }else if (error.errorType == BayMaxErrorTypeTimer){
        NSLog(@"ErrorTimerinfos:%@",error.errorInfos);


    }else if (error.errorType == BayMaxErrorTypeKVO){
        NSLog(@"ErrorKVOinfos:%@",error.errorInfos);

    }else{
        NSLog(@"infos:%@",error.errorInfos);
    }
}];

二、指定某一类型
[BayMaxProtector openProtectionsOn:BayMaxProtectionTypeUnrecognizedSelector];


三、组合类型
[BayMaxProtector openProtectionsOn:BayMaxProtectionTypeNotification|BayMaxProtectionTypeTimer];


四、过滤带有指定前缀的类
[BayMaxProtector ignoreProtectionsOnClassesWithPrefix:@[@"UI",@"CA"]];

3、如何进行页面降级?

1、引入`BayMaxDegradeAssist.h`头文件。
2、设置数据源(BayMaxDegradeAssistDataSource)与事件回调代理(BayMaxDegradeAssistDelegate)
3、实现数据源代理BayMaxDegradeAssistDataSource,其中要实现四个`required`方法和一个`optional`方法
@required:
//共有多少组H5-iOS对应关系,一个视图控制器对应一组关系
- (NSInteger)numberOfRelations;
//第index组iOS试图控制器的名字
- (NSString *)nameOfViewControllerAtIndex:(NSInteger)index;
//第index组下试图控制器对应的url
- (NSString *)urlOfViewControllerAtIndex:(NSInteger)index;
//第index组下H5与iOS之间参数的对应关系集合
- (NSArray<NSDictionary<NSString * , NSString *> *> *)correspondencesBetweenH5AndIOSParametersAtIndex:(NSInteger)index;

@optional://用来实现手动降级
//手动降级的某些页面,处理后,最终还是会走BayMaxDegradeAssistDelegate中的自动降级相关方法
- (NSArray *)viewControllersToDegradeInitiative;

4、实现BayMaxDegradeAssistDelegate,其中有两个可选方法,在这里可以获取到发生错误的视图控制器实例或者类,以及该页面对应的带参数的完整URL或者不带参数的URL,和配置中该视图控制器对应的所有信息。外界可以针对这两种情况分别处理,由于手动降级最终还是走的自动降级,所以只需要处理自动降级的代理事件即可。

// 非viewdidload方法出错,可以获取当前页面对应的H5完整url(带参数),然后进行页面降级,展示自己的webview
- (void)autoDegradeInstanceOfViewController:(UIViewController *)degradeVC ifErrorHappensInProcessExceptViewDidLoadWithReplacedCompleteURL:(NSString *)completeURL relation:(NSDictionary *)relation;

//在viewdidload方法中出错,可以获取出错页面对应的不完整url(不带参数),然后进行页面降级,展示自己的webview
- (void)autoDegradeClassOfViewController:(Class)degradeCls ifErrorHappensInViewDidLoadProcessWithReplacedURL:(NSString *)URL relation:(NSDictionary *)relation;

5、流程:启动App->请求配置或者从缓存中读取配置->调用`BayMaxDegradeAssist`的`reloadRelations`方法

三、why BayMax Can do This?

主要参考了网易的健康系统,踩了一些坑,加了一些新的东西进来,然而目前还有很多需要优化的地方,会不断完善。
列一下目前需要解决的问题,希望您能够提供宝贵的建议。

1、如何自动识别出系统类,并对这些类进行自动的过滤。

2、页面降级中针对发生在viewDidLoad方法中的unrecognizedSelector错误,如果消息接受者不是视图控制器,该如何获取这个视图控制器实例。

3、页面降级如何处理回调?

4、其他

5、为什么把BayMaxProtector做成pod组件后,我能搜到,别人也能搜到,但是install的时候却一直报错。。。。😭。😭。😭

如果您有兴趣一起做或者有好的建议,可以加我QQ😊:935143023

如果觉得还可以,记得给个star啊😊😊😊

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容