很多时候,用户会反馈网络访问异常。但那时候其实服务器访问都正常,并没有看到什么异常报错。故无法排查这些异常问题。还有很多时候,很多用户的这些异常无法及时的反馈给运营,导致,可能流失了很多用户。所以运营要求前端可以捕捉到用户的访问异常报错,整合成数据供他们分析。
我们的项目,网络访问用的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) {
}];
}