日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ios 容错处理JKDataHelper和AvoidCrash

發(fā)布時間:2025/4/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios 容错处理JKDataHelper和AvoidCrash 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、JKDataHelper  

  在大團隊協(xié)同開發(fā)過程中,由于每個團隊成員的水平不一,很難控制代碼的質(zhì)量,保證代碼的健壯性,經(jīng)常會發(fā)生由于后臺返回異常數(shù)據(jù)造成app崩潰閃退的情況,為了避免這樣情況使用JKDataHelper這個用于處理常見數(shù)據(jù)容錯的工具,極大程度上降低了因為數(shù)據(jù)容錯不到位產(chǎn)生崩潰閃退的概率。

  在工作中,我們經(jīng)常會遇到,由于服務(wù)器返回數(shù)據(jù)的結(jié)構(gòu)內(nèi)容發(fā)生非正常的改變,而造成app崩潰閃退的情況,雖然屢次強調(diào),但是出現(xiàn)的頻率仍然很高。當時心想雖然很大程度是人員技術(shù)水平的原因,但是如果能夠通過技術(shù)手段,屏蔽掉這樣的問題。無論你是什么樣水平的開發(fā)者,只要使用了一種工具,就能很大程度上避免類似情況的發(fā)生,豈不更好。就這樣JKDataHelper便應(yīng)運而生了。?

對數(shù)組進行處理的函數(shù)

+ (NSArray *)safeArray:(id)array;

內(nèi)部實現(xiàn):

+ (NSArray *)safeArray:(id)array {if ([array isKindOfClass:[NSArray class]]) {return array;}return nil; }

  在app解析后臺API返回的數(shù)據(jù)時,經(jīng)常會發(fā)生我們約定好的解析某一個字端后,返回的數(shù)據(jù)本來應(yīng)該是數(shù)組的,但是異常情況可能時NSString類型的,也可能時NSDictionary類型的,這個時候如果我們把解析到的數(shù)據(jù)執(zhí)行NSArray相關(guān)的方法操作就會crash,比如查找數(shù)組中的某一個索引下的元素。上面的這個方法很好的避免了這種情況的發(fā)生。如果不是數(shù)組類型的話,直接為nil,后續(xù)即使仍然按照NSArray執(zhí)行相關(guān)的操作也不會產(chǎn)生crash。

+ (NSMutableArray *)safeMutableArray:(id)mutableArray + (NSDictionary *)safeDictionary:(id)dict + (NSMutableDictionary *)safeMutableDictionary:(id)dict + (NSString *)safeStr:(id)str + (id)safeObj:(id)obj

以上幾個方法的思路同上。

+ (NSString *)safeStr:(id)str defaultStr:(NSString *)defaultStr

這個方法主要是用在解析NSString類型時,如果不是NSString類型,那么則輸出設(shè)定的默認值。

為了方便使用我用宏定義進行了封裝

#define JKSafeArray(array) [JKDataHelper safeArray:array] #define JKSafeMutableArray(mutableArray) [JKDataHelper safeMutableArray:mutableArray] #define JKSafeDic(dict) [JKDataHelper safeDictionary:dict] #define JKSafeMutableDic(mutableDict) [JKDataHelper safeMutableDictionary:mutableDict] #define JKSafeStr(str) [JKDataHelper safeStr:str] #define JKSafeStr1(str, defaultStr) [JKDataHelper safeStr:str defaultStr:defaultStr] #define JKSafeObj(obj) [JKDataHelper safeObj:obj]

pod "JKDataHelper"

?

二、AvoidCrash

1、若集成了騰訊Bugly或者友盟等等異常搜集的SDK,AvoidCrash會影響到它們的異常搜集嗎?

首先要清楚的一點是,對于一些第三方crash信息搜集工具,比如Bugly或者友盟,它們只有當程序出現(xiàn)異常(崩潰)的時候才會搜集異常信息。而AvoidCrash的作用是,防止部分常見異常的發(fā)生,異常被AvoidCrash捕獲了,程序就不會崩潰,第三方crash信息搜集工具就不會搜集到崩潰信息咯。 AvoidCrash若捕獲到異常,將會發(fā)出一個通知:AvoidCrashNotification,監(jiān)聽該通知即可獲取到原本將導(dǎo)致崩潰的具體信息。此時你可以利用Bugly的自定義異常接口將這些異常信息上傳到Bugly。下面上代碼,上圖說明。 1、首先先來查看下Bugly提供的上報異常的接口 2、創(chuàng)建一個上報異常的工具類 BuglyManager(可以充分利用Bugly上報自定義異常功能,方便我們快速定位app出現(xiàn)的異常,下圖展示了我所開發(fā)的項目中使用Bugly上報了哪些錯誤類型) /** 上報錯誤信息 */ + (void)reportErrorName:(NSString *)errorName errorReason:(NSString *)errorReason callStack:(NSArray *)aStackArray extraInfo:(NSDictionary *)info{[Bugly reportExceptionWithCategory:3 errorName reason:errorReason callStack:aStackArray extraInfo:info terminateApp:NO]; }

3、在AppDelegate中初始化AvoidCrash并且監(jiān)聽通知:AvoidCrashNotification

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[AvoidCrash makeAllEffective];//監(jiān)聽通知:AvoidCrashNotification, 獲取AvoidCrash捕獲的崩潰日志的詳細信息[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealwithCrashMessage:) name:AvoidCrashNotification object:nil];return YES; }- (void)dealwithCrashMessage:(NSNotification *)note {//異常攔截并且通過bugly上報 NSDictionary *info = note.userInfo;NSString *errorReason = [NSString stringWithFormat:@"【ErrorReason】%@========【ErrorPlace】%@========【DefaultToDo】%@========【ErrorName】%@", info[@"errorReason"], info[@"errorPlace"], info[@"defaultToDo"], info[@"errorName"]];NSArray *callStack = info[@"callStackSymbols"];[BuglyManager reportErrorName:Bugly_ErrorName_AvoidCrash errorReason:errorReason callStack:callStack extraInfo:nil];

4、寫一個AvoidCrash可以攔截的異常

NSArray *array = @[@"iOS"];NSString *string = array[100];

5、在Xcode控制臺可以看到下圖的輸出

6、去Bugly錯誤分析中查看 2、為什么集成了AvoidCrash還是會報unrecognized selector sent to instance的異常?

若要捕獲 unrecognized selector sent to instance 類型的異常,

1、首先查看下AvoidCrash中初始化AvoidCrash的兩個方法

/*** * 開始生效.你可以在AppDelegate的didFinishLaunchingWithOptions方法中調(diào)用becomeEffective方法* 【默認不開啟 對”unrecognized selector sent to instance”防止崩潰的處理】**/ + (void)becomeEffective;/** * 相比于becomeEffective,增加* 對”unrecognized selector sent to instance”防止崩潰的處理** 但是必須配合setupClassStringsArr:使用*/ + (void)makeAllEffective;

2、若要捕獲 unrecognized selector sent to instance 類型的異常,請使用[AvoidCrash makeAllEffective] 并且配合下面的兩個方法使用。(這兩個方法可以配合使用,可以同時使用)

/** * 初始化一個需要防止”unrecognized selector sent to instance”的崩潰的類名數(shù)組* ??不可將@"NSObject"加入classStrings數(shù)組中* ??不可將UI前綴的字符串加入classStrings數(shù)組中*/ + (void)setupNoneSelClassStringsArr:(NSArray<NSString *> *)classStrings;/*** 初始化一個需要防止”unrecognized selector sent to instance”的崩潰的類名前綴的數(shù)組* ??不可將UI前綴的字符串(包括@"UI")加入classStringPrefixs數(shù)組中* ??不可將NS前綴的字符串(包括@"NS")加入classStringPrefixs數(shù)組中*/ + (void)setupNoneSelClassStringPrefixsArr:(NSArray<NSString *> *)classStringPrefixs;

3、具體的使用方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[AvoidCrash makeAllEffective];//================================================// 1、unrecognized selector sent to instance(方式1)//================================================//若出現(xiàn)unrecognized selector sent to instance并且控制臺輸出://-[__NSCFConstantString initWithName:age:height:weight:]: unrecognized selector sent to instance//你可以將@"__NSCFConstantString"添加到如下數(shù)組中,當然,你也可以將它的父類添加到下面數(shù)組中//比如,對于部分字符串,繼承關(guān)系如下//__NSCFConstantString --> __NSCFString --> NSMutableString --> NSString//你可以將上面四個類隨意一個添加到下面的數(shù)組中,建議直接填入 NSString//我所開發(fā)的項目中所防止unrecognized selector sent to instance的類有下面幾個,主要是防止后臺數(shù)據(jù)格式錯亂導(dǎo)致的崩潰。個人覺得若要防止后臺接口數(shù)據(jù)錯亂,用下面的幾個類即可。 NSArray *noneSelClassStrings = @[@"NSNull",@"NSNumber",@"NSString",@"NSDictionary",@"NSArray"];[AvoidCrash setupNoneSelClassStringsArr:noneSelClassStrings];//================================================// 2、unrecognized selector sent to instance(方式2)//================================================//若需要防止某個前綴的類的unrecognized selector sent to instance//比如你所開發(fā)項目中使用的類的前綴:CC、DD//你可以調(diào)用如下方法NSArray *noneSelClassPrefix = @[@"CC",@"DD"];[AvoidCrash setupNoneSelClassStringPrefixsArr:noneSelClassPrefix];//監(jiān)聽通知:AvoidCrashNotification, 獲取AvoidCrash捕獲的崩潰日志的詳細信息[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealwithCrashMessage:) name:AvoidCrashNotification object:nil];return YES; }

?

總結(jié)

以上是生活随笔為你收集整理的ios 容错处理JKDataHelper和AvoidCrash的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。