? ? 很多時候,用戶會反饋網絡訪問異常。但那時候其實服務器訪問都正常,并沒有看到什么異常報錯。故無法排查這些異常問題。還有很多時候,很多用戶的這些異常無法及時的反饋給運營,導致,可能流失了很多用戶。所以運營要求前端可以捕捉到用戶的訪問異常報錯,整合成數據供他們分析。
? ?我們的項目,網絡訪問用的AFNetworking的框架。于是想到,可以在訪問error時,前端記錄這些訪問異常的接口url,參數,報錯時間,報錯內容以及狀態碼。用來統計具體錯誤的相關詳細信息。等到用戶的app跟服務器的網絡訪問正常時,再將這些錯誤信息一并傳給服務器。
[managerPOST:urlStrparameters:paramssuccess:^(NSURLSessionDataTask*_Nonnulltask,id_NonnullresponseObject) {
success(responseObject);
}failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror) {
//再異常報錯回包的地方,去保存相關數據
[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]];
//將報錯數據拼接好,插入保存進沙盒
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];
}
數據記錄好后,接下來就是傳給服務器的時機選擇了。因為很多時間,客戶端與服務器的連接異常,但是很有可能是客戶端本身是斷網情況,這個時候回傳服務器,也必將失敗的。但是如果用戶正在使用app時,將數據回傳,會影響正常的數據訪問。所以,將時機放在用戶將app退到后臺時,嘗試將數據打包發給服務器,如果發送成功,即清空沙盒里的錯誤數據。如果發送失敗,則繼續將失敗信息保存記錄。等待下一次退到后臺時,繼續嘗試發送。
-(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) {
}];
}