【W(wǎng)arming】:AFNetworking 奇葩問(wèn)題旨在針對(duì)奇葩問(wèn)題提出奇葩的解法,部分驗(yàn)證并在實(shí)際中用到,但不保證有隱性問(wèn)題。
AFNetworking能獲取錯(cuò)誤碼的空間是[200,300],但是如果后臺(tái)返回一個(gè)401,并且?guī)Я隋e(cuò)誤的信息呢?如果不修改AFNetworking是會(huì)返回錯(cuò)誤的,但是無(wú)法獲取跟后臺(tái)同步的錯(cuò)誤提示,這個(gè)時(shí)候就需要修改AFNetwoking的源碼了。解決的大概思路
1、修改AFNetworking獲取錯(cuò)誤碼的空間,找到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);
}
}
屏蔽了,因?yàn)榇藭r(shí)后臺(tái)返回的都是“正確”的數(shù)據(jù),我們需要對(duì)返回的所有的數(shù)據(jù)進(jìn)行處理,當(dāng)然也可以改錯(cuò)誤返回, 如failure(void(^)(NSURLSessionDataTask*, id, NSError *))failure, 然后把response也加進(jìn)去返回
3、對(duì)返回的具體錯(cuò)誤碼進(jìn)行解析并處理
獲取錯(cuò)誤碼的方法
NSHTTPURLResponse * response = (NSHTTPURLResponse*)task.response;
NSInteger statusCode = response.statusCode;
如果屏蔽了就加到success里面去處理,如果沒(méi)有屏蔽而是改了failure回調(diào),則加到failure里面去處理