BayMaxProtector-集崩潰保護與頁面降級於一體的大白保護機制

ccSunday發表於2018-01-22

Abstract:Crash protector -take care of your application like BayMax

BayMaxProtector-github下載地址

CocoaPod安裝方式:pod 'BayMaxProtector'

一、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資料夾下的內容拖入拖入專案。

CocoaPod方式:在podFile中新增 pod 'BayMaxProtector'

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?

主要參考了網易的健康系統,踩了一些坑,加了一些新的東西進來,然而目前還有很多需要優化的地方,會不斷完善。

歡迎加入BayMaxProtector交流群,群聊號碼:466377115

相關文章