Abstract:Crash protector -take care of your application like BayMax
CocoaPod
安裝方式:pod 'BayMaxProtector'
一、what can BayMaxProtector do?
1、BayMaxProtector
可以提高你App的穩定性,減少因為常見錯誤而引發的崩潰,目前支援的保護型別有四種,分別是UnrecognizedSelector
、KVO(KVO重複新增、移除、或dealloc時未移除observer)、NSNotification(dealloc時未移除)
、NSTimer(去除了timer對target的強引用,target可以自由釋放而不會產生崩潰,同時timer可以自動invalid)
這四種情況。容器類的考慮到已經有較為成熟的框架,便沒有加進來,如果後期有需要的話,再加入。
2、BayMaxProtector
不僅為你的應用提供崩潰保護的功能,並且還通過BayMaxDegradeAssist
提供了一套頁面降級機制,按照該套機制的規則與約定,可以實現頁面自動降級為對應的H5
頁面,也可以實現頁面的手動降級。所謂自動降級,是指在程式發生UnrecognizedSelector
錯誤時,會從配置中將該頁面對應的url
和params(注意:如果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?
主要參考了網易的健康系統,踩了一些坑,加了一些新的東西進來,然而目前還有很多需要優化的地方,會不斷完善。