【Warming】:AFNetworking 奇葩问题旨在针对奇葩问题提出奇葩的解法,部分验证并在实际中用到,但不保证有隐性问题。
AFNetworking能获取错误码的空间是[200,300],但是如果后台返回一个401,并且带了错误的信息呢?如果不修改AFNetworking是会返回错误的,但是无法获取跟后台同步的错误提示,这个时候就需要修改AFNetwoking的源码了。解决的大概思路
1、修改AFNetworking获取错误码的空间,找到AFNetworking->Serialization->AFURLResponseSerialization.m
修改init方法里面的
self.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange(200,100)];
修改范围为(200,310);
2、修改AFHTTPSessionManager里面的方法
- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
URLString:(NSString *)URLString
parameters:(id)parameters
uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress
success:(void (^)(NSURLSessionDataTask *, id))success
failure:(void (^)(NSURLSessionDataTask *, NSError *))failure
将
-(NSURLSessionDataTask*)dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler
中的
if(error){
if(failure){
failure(dataTask,error);
}
}
屏蔽了,因为此时后台返回的都是“正确”的数据,我们需要对返回的所有的数据进行处理,当然也可以改错误返回, 如failure(void(^)(NSURLSessionDataTask*, id, NSError *))failure, 然后把response也加进去返回
3、对返回的具体错误码进行解析并处理
获取错误码的方法
NSHTTPURLResponse * response = (NSHTTPURLResponse*)task.response;
NSInteger statusCode = response.statusCode;
如果屏蔽了就加到success里面去处理,如果没有屏蔽而是改了failure回调,则加到failure里面去处理