? ? 很多時候蛀缝,用戶會反饋網(wǎng)絡(luò)訪問異常。但那時候其實服務(wù)器訪問都正常嗤练,并沒有看到什么異常報錯俘闯。故無法排查這些異常問題忽冻。還有很多時候,很多用戶的這些異常無法及時的反饋給運營遮婶,導(dǎo)致,可能流失了很多用戶蹦骑。所以運營要求前端可以捕捉到用戶的訪問異常報錯臀防,整合成數(shù)據(jù)供他們分析。
? ?我們的項目捎废,網(wǎng)絡(luò)訪問用的AFNetworking的框架致燥。于是想到,可以在訪問error時辐益,前端記錄這些訪問異常的接口url,參數(shù)脱吱,報錯時間,報錯內(nèi)容以及狀態(tài)碼女仰。用來統(tǒng)計具體錯誤的相關(guān)詳細信息抡锈。等到用戶的app跟服務(wù)器的網(wǎng)絡(luò)訪問正常時,再將這些錯誤信息一并傳給服務(wù)器一罩。
[managerPOST:urlStrparameters:paramssuccess:^(NSURLSessionDataTask*_Nonnulltask,id_NonnullresponseObject) {
success(responseObject);
}failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror) {
//再異常報錯回包的地方撇簿,去保存相關(guān)數(shù)據(jù)
[selfsaveError:errorwithUrl:urlStr];
[[manageroperationQueue]cancelAllOperations];
failure(error);
}];
2.+(void)saveError:(NSError*)error
withUrl:(NSString*)url{
NSDate*date = [NSDatedate];
NSTimeZone*zone = [NSTime ZonesystemTimeZone];
NSIntegerinterval = [zone secondsFromGMTForDate: date];
NSDate*localeDate = [date dateByAddingTimeInterval: interval];
NSString* time=[[SliderViewControllersharedSliderController].formatterstringFromDate:localeDate];
NSMutableArray*array=[NSMutableArrayarrayWithArray:[YcfViewgetNSUserDefaultsObject:ERROR_CONNECT_MESSAGE]];
//將報錯數(shù)據(jù)拼接好四瘫,插入保存進沙盒
NSDictionary* dic=[NSDictionarydictionaryWithObjectsAndKeys:time,@"errorTime",url,@"errorUrl",[NSStringstringWithFormat:@"%ld",(long)error.code],@"errorCode",[StaticgetCurrentNetWorkStatus],@"currentNetwork",[error.userInfoobjectForKey:@"NSLocalizedDescription"] ,@"errorDescrib",nil];
[arrayaddObject:dic];
[YcfView setErrorMessage:arrayTag:ERROR_CONNECT_MESSAGE];
}
數(shù)據(jù)記錄好后找蜜,接下來就是傳給服務(wù)器的時機選擇了。因為很多時間,客戶端與服務(wù)器的連接異常彰居,但是很有可能是客戶端本身是斷網(wǎng)情況,這個時候回傳服務(wù)器撰筷,也必將失敗的陈惰。但是如果用戶正在使用app時,將數(shù)據(jù)回傳毕籽,會影響正常的數(shù)據(jù)訪問抬闯。所以,將時機放在用戶將app退到后臺時关筒,嘗試將數(shù)據(jù)打包發(fā)給服務(wù)器画髓,如果發(fā)送成功,即清空沙盒里的錯誤數(shù)據(jù)平委。如果發(fā)送失敗奈虾,則繼續(xù)將失敗信息保存記錄。等待下一次退到后臺時廉赔,繼續(xù)嘗試發(fā)送。
-(void)sendErrorToServer{
NSDictionary* userDic=(NSDictionary*)[YcfViewgetNSUserDefaultsObject:USERDATA];
NSString*userID = [userDicobjectForKey:@"userId"];
NSString* userName=[userDicobjectForKey:@"uNickname"];
if([userIDintValue]==0) {
userID=@"10";
userName=@"未注冊用戶";
}
if(![[userDicallKeys]containsObject:@"uNickname"]) {
userID=@"10";
userName=@"未注冊用戶";
}
NSArray*array=(NSArray*)[YcfViewgetNSUserDefaultsObject:ERROR_CONNECT_MESSAGE] ;
if([arraycount]==0) {
return;
}
NSMutableDictionary* dic=[[NSMutableDictionaryalloc]init];
[dicsetObject:userNameforKey:@"userName"];
[dicsetObject:userIDforKey:@"userId"];
[dicsetObject:arrayforKey:@"errorList"];
[HttpToolspost4WithPath:SEND_ERROR_URLparams:dicsuccess:^(idJSON) {
if([HttpRequestDicisOkStatus:JSON]) {
[YcfView removeErrorList:ERROR_CONNECT_MESSAGE];
}else{
}
}failue:^(idError) {
}];
}