轻量级前端框架助力开发者提升项目效率与性能
941
2022-10-07
[IOS]如何使用AFNetwork,并获得.txt的值
1. 根据上篇文章,先安装好AFNetwork
2. 如果url里面是.txt这类的,会报错:
”Request failed: unacceptable content-type: text/plain” 错误
有2个方法:
一. 修改源码, 在AFN的AFURLResponseSerialization.m文件中,修改init方法中。
self.acceptableContentTypes = [NSSet setWithObjects: @"application/json", @"text/json", @"text/javascript", nil];
二.不修改源码:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
3.错误:关于JSON text did not start with array or object and option to allow fragments not set 错误
这是因为 AFNetworking默认把响应结果当成json来处理,(默认manager.responseSerializer = [AFJSONResponseSerializer serializer]) ,很显然,我们请求的百度首页 返回的并不是一个json文本,而是一个html网页,但是AFNetworking并不知道,它坚信请求的结果就是一个json文本!然后固执地以json的形式去解析,显然没办法把一个网页解析成一个字典或者数组,所以产生了上述错误.
然而,我们期望它能够正确地处理这个情形,而不是提示一个错误. 这时候 你必须告诉AFNetworking:别把这个网页当json来处理! 只需要在发送请求前加入:
manager.responseSerializer = [AFHTTPResponseSerializer serializer]
4.使用方法:
NSLog(@"AFNetworking start......."); [self AFNetworkStatus]; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSString *url = @"your url path"; [manager GET:url parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"AFNetworking 请求成功:%@",responseObject); NSString *result = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"AFNetworking result: %@",result); [self 跳转方法]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"AFNetworking 请求失败:%@",error); [self 跳转方法]; }];}
***注意:if(!responseObject) {}要加入这个判断,没有这个判断,即使没有网络,你获得的结果也是success的
failure不是没有网络的判断,应该是AFNetworking的异常捕获才到这里
以上看法是错误的,我可以确定是手机无网络了,而且变量也没有缓存,那为什么断网后仍然可以获取url的值呢,百思不得其解.我把app删了后重新跑一次,发现又可以判断无网络了,但是只能初装的第一次能判断是否有网络,之后还是不能判断.那只能在上面包一层网络判断了.
补充:
可以加上AFN的网络状态判断:
开启监听[[AFNetworkReachabilityManager sharedManager] startMonitoring]; 判断网络链接状态[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusNotReachable:{ NSLog(@"无网络"); break; } case AFNetworkReachabilityStatusReachableViaWiFi:{ NSLog(@"WiFi网络"); break; } case AFNetworkReachabilityStatusReachableViaWWAN:{ NSLog(@"3G网络"); break; } default: break; } }];
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~