• Stars
    star
    420
  • Rank 103,194 (Top 3 %)
  • Language
    Objective-C
  • License
    MIT License
  • Created almost 7 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Crash protector -take care of your application like BayMax

BayMaxProtector is a framework that can block common crashes , thereby enhancing your App's stability. Not only that, but you can also use the downgrade mechanism it provides to reduce a page that has a problem to a corresponding web page, So as not to affect the continuation of the business. 这是一个可以对常见崩溃进行拦阻,从而增强你App稳定性的框架,不仅如此,你还可以使用它提供的降级机制,将发生问题的页面降为对应的web页面,从而不影响业务的继续。

个人练手项目,存在一定风险,请谨慎使用

BayMax思路来自网易团队:大白健康系统--iOS APP运行时Crash自动修复系统

2.0主要是对1.0的升级与改造。

2月26日新增功能

新增容器类防护,针对NSArray/NSMutableArray/NSDictionary/NSMutableDictionary/NSString/NSMutableString进行崩溃保护。

一、新增功能

1、增加BayMaxDebugView

BayMaxDebugView可以在开发中更直观的展示它所拦截到的异常,会展示捕获异常的数目,并且可以跟随手指移动,点击后可以展示错误的详细信息。收起后,错误信息清零,长按错误信息可以复制分享。

2、新增自定义IMP方法链表,支持IMP的插入与查找功能

该功能主要用来帮助判断某些系统方法有没有被替换。

typedef struct IMPNode *PtrToIMP;
typedef PtrToIMP IMPlist;
struct IMPNode{
    IMP imp;
    PtrToIMP next;
};
/*向IMP链表中追加imp*/
static inline void BMP_InsertIMPToList(IMPlist list,IMP imp){
    PtrToIMP nextNode = malloc(sizeof(struct IMPNode));
    nextNode->imp = imp;
    nextNode->next = list->next;
    list->next = nextNode;
}
/*
递归判断IMP链表中有没有此元素。
*/
static inline BOOL BMP_ImpExistInList(IMPlist list, IMP imp){
    if (list->imp == imp) {
        return YES;
    }else{
        if (list->next != NULL) {
            return BMP_ImpExistInList(list->next,imp);
        }else{
            return NO;
        }
    }
}

3、增加关闭防护的功能

可以在任意页面,关闭或者打开防护功能,并且可以对重复操作进行过滤,重复的添加或者移除,会作为异常显示在debugView中。

1、保存系统原有的IMP
static IMPlist impList;
+ (void)load{
    //maping_ForwardingTarget_IMP为ForwardingTarget方法的映射
    IMP maping_ForwardingTarget_IMP = class_getMethodImplementation([BayMaxProtector class], @selector(BMP_mappingForwardingTargetForSelectorMethod));
    //maping_Timer_IMP为原有timer方法的映射
    IMP maping_Timer_IMP = class_getMethodImplementation([BayMaxProtector class], @selector(BMP_mappingTimerMethod));
    IMP KVO_IMP = class_getMethodImplementation([NSObject class], @selector(addObserver:forKeyPath:options:context:));
    IMP notification_IMP = class_getMethodImplementation([NSNotificationCenter class], @selector(addObserver:selector:name:object:));

    impList = malloc(sizeof(struct IMPNode));
    impList->next = NULL;

    BMP_InsertIMPToList(impList, maping_ForwardingTarget_IMP);
    BMP_InsertIMPToList(impList, KVO_IMP);
    BMP_InsertIMPToList(impList, maping_Timer_IMP);
    BMP_InsertIMPToList(impList, notification_IMP);
}

2、根据操作的protectionType获取对应的IMP,然后判断该IMP在不在原有的impList中,在的话,说明该防护之前没有开启过,不在的话,说明该防护之前开启过。
    if (!BMP_ImpExistInList(impList, imp)) {
        NSLog(@"关闭保护");
        //再执行一次交换操作
        [self openProtectionsOn:protectionType catchErrorHandler:nil];
    }else{//说明该方法没有被交换,即没有列在保护名单里,空处理即可
        NSString * duplicateClose = [NSString stringWithFormat:@"[%@] Is Not In The Protection State Before And Don't Need To Close This Protection Again",protectionName];
        [[BayMaxDebugView sharedDebugView]addErrorInfo:@{@"waring":duplicateClose}];
    }

4、增加针对libobjc.A.dylib部分方法的方法映射

#pragma mark libobjc.A.dylib IMP映射
/**
NSObject ForwardingTargetForSelector方法的映射
*/
- (void)BMP_mappingForwardingTargetForSelectorMethod{
}
- (void)BMP_excMappingForwardingTargetForSelectorMethod{
}
/**
NSTimer  scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:方法的映射
*/
- (void)BMP_mappingTimerMethod{
}
- (void)BMP_excMappingTimerMethod{
}

5、增加一系列测试用例

二、原有功能

1、防止unrecognizedSelector类型的崩溃

2、防止kvo类型的崩溃

如keypath重复监听、移除了未注册的观察者、移除了不存在的keypath,观察者未移除

3、防止Timer类型的错误

退出页面时,timer可以自动invalidate

4、防止NSNotification类型的错误

在未移除监听者的时候,自动帮你移除监听者

5、支持页面自动降级

可以通过配置在页面发生unrecognizedSelector类型错误的时候,自动降级为对应的web页面,自动降级又分两种,一种是能拿到参数,然后拼成一个完整的url传给web,另一种是发生在viewdidload中,且接收错误消息的对象不是视图控制器,这时候拿不到参数,只能拿到对应的url。】

6、支持页面主动降级

在某些页面发生业务逻辑错误时,比如粗心的把价格单位“元”写成了“万元”,可以手动的将该页面将为对应的web页面,本质上是向该页面发送一个它不能够响应的消息,然后再走自动降级的逻辑。

三、安装

  • 手动:将BayMaxProtector下的所有文件拖入项目
  • CocoaPod:podfile加入 pod 'BayMaxProtector'

四、使用

1、开启防护

//开启全部防护
[BayMaxProtector openProtectionsOn:BayMaxProtectionTypeAll catchErrorHandler:^(BayMaxCatchError * _Nullable error) {
//do your business
}];
//开启某一防护
[BayMaxProtector openProtectionsOn:BayMaxProtectionTypeUnrecognizedSelector];
//开启组合防护
[BayMaxProtector openProtectionsOn:BayMaxProtectionTypeUnrecognizedSelector|BayMaxProtectionTypeTimer];
//设置白名单
[BayMaxProtector ignoreProtectionsOnClassesWithPrefix:@[@"AV"]];

2、关闭防护

//同上
[BayMaxProtector closeProtectionsOn:BayMaxProtectionTypeAll];

3、显示DebugView

[BayMaxProtector showDebugView];

4、隐藏DebugView

[BayMaxProtector hideDebugView];

5、页面降级(可选)

实现相对应的代理方法BayMaxDegradeAssistDelegate与数据源协议BayMaxDegradeAssistDataSource

五、在swift环境下的表现

BayMaxswift环境下绝大部分功能仍然可用,但是如果在viewdidload方法中发生unrecognizedSelector类型的错误,这时候获取当前显示的视图控制器存在问题,从而会影响自动降级相关的流程,其他的暂时没发现问题,如果使用中有新的问题,请留言。

六、效果展示

1、unrecognizedSelector防护

unrecognizedSelector防护

2、unrecognizedSelector-viewdidload防护

unrecognizedSelector-viewdidload防护

3、TimerErrorBlock

TimerErrorBlock

4、KVOErrorBlock

KVOErrorBlock

5、自动降级

自动降级

6、手动降级

手动降级

GitHub下载地址:BayMaxProtector

More Repositories

1

AvoidCrash-UnrecognizedSelector

如何防止因为unrecognizedselector而引起的崩溃问题
Objective-C
18
star
2

TreeViewTemplate

A tree structure template that can be customized
Objective-C
17
star
3

JSPatch-BackgroundOperation

A Mac application to upload JSPatch-hotfix files manually,Support RSA asymmetric encryption, You should just drag your file into the input box when use
Objective-C
15
star
4

LightMap

轻量级的地图解决方案,地图高亮、惯性缩放
Objective-C
12
star
5

JSPatchConfusionDemo

教你如何一步步混淆JSPatch,以绕过苹果的审核。建议使用的时候,对类重新命名,而不要使用demo中的类。
Objective-C
12
star
6

LayerTreeInspector

An Inspector to help you see the application layer tree,At the same time you can also modify some of the common view properties
Objective-C
9
star
7

EasyFullScreen

简易的全屏返回工具,全屏返回过程中支持透明度、颜色渐变,可以指定页面全屏返回。可拓展自己的转场策略
Objective-C
6
star
8

AttributeLabel

富文本label,可以显示高亮文字,响应高亮文字点击事件、同时支持图文混排,操作简单
Objective-C
6
star
9

RuntimeDance

Runtime高级用法小结(建设中)
Objective-C
2
star
10

GifRefreshCategory

只需要换一下图片,此外无需一行代码,无需继承,直接使用MJ原生的即可。
Objective-C
2
star
11

SlideSelectView

一款可以双向滑动的选择器,采用代理设计模式,仿写系统tableview的形式。header可以左右滑动,content可以上下滚动,可以进行定制。【暂时没有考虑复用机制,之后完善。】
Objective-C
1
star
12

CCAnimatedView

如何自己实现一个EaseOut动画效果。
Objective-C
1
star
13

JavaStudy

Java基础
Java
1
star
14

JavaWebStudy

HTML
1
star
15

CCScrollView

当控件向中心点移动时候放大,远离时候缩小,滚动放大缩小
Objective-C
1
star
16

CPointerCalculator

运用c语言函数指针和结构体struct 制作的简易四则运算计算器,界面使用xib搭建的,主要是为了介绍函数指针与结构体的使用。
Objective-C
1
star