AFNetworking 3.0 版本使用

转载 2016年05月30日 14:50:55

AFNetworking 3.0 版本使用

在Xcode7.0之后,苹果废弃了NSURLConnection方法,数据请求使用NSURLSession,作为网络请求类第三方库使用量最大的AFN也及时的更新的新的版本——AFN 3.0版本。新的版本的里废弃了基于NSURLConnection封装的AFHTTPRequestOperationManager,转而使用基于NSURLSession封装的AFHTTPSessionManager了。

下面将详细介绍AFN3.0的使用

1.cocoapods导入AFN 3.0

1.1 进入到工程目录下

$ cd 工程目录名

1.2 搜索最新的AFN库版本

$ pod search AFNetworking

1.3 创建podfile文件

$ vim podfile

1.4 按下键盘“i”键,输入如下的pod语句,然后按下“esc”键,退出编辑,再输入“:wq”,保存退出vim,项目根目录下就会新建我们需要的podfile文件

$ platform:iOS,'7.0'
$ pod 'AFNetworking','~>3.1.0'

1.5 导入AFN库,使用如下语句导入和直接$ pod install的区别是略过cocoaPods的库更新过程,导入速度较快

$ pod install --verbose --no-repo-update

导入成功,使用后缀名为.xcworkspace的文件打开工程

2.配置plist文件

在Xcode 7.0之后,苹果使用了https的网路协议,所以在网络请求前,我们还需要配置一下工程的Info.plist文件

右键Info.plist文件  ->  open as ->  source code ,找到下图位置,粘贴如下代码

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <key>NSAppTransportSecurity</key>  
  2.     <dict>  
  3.         <key>NSAllowsArbitraryLoads</key>  
  4.         <true/>  
  5.     </dict>  


3.使用AFN进行数据请求

3.1 请求管理类 (HttpsManager)

该类里都是+号方法,不是单例类

在.h里定义超时时间宏,以及成功和失败的block块

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #define kTimeOutInterval 30 // 请求超时的时间  
  2. typedef void (^SuccessBlock)(NSDictionary *dict, BOOL success); // 访问成功block  
  3. typedef void (^AFNErrorBlock)(NSError *error); // 访问失败block  

封装AFN请求管理者

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #pragma mark - 创建请求者  
  2. +(AFHTTPSessionManager *)manager  
  3. {  
  4.     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
  5.     // 超时时间  
  6.     manager.requestSerializer.timeoutInterval = kTimeOutInterval;  
  7.       
  8.     // 声明上传的是json格式的参数,需要你和后台约定好,不然会出现后台无法获取到你上传的参数问题  
  9.     manager.requestSerializer = [AFHTTPRequestSerializer serializer]; // 上传普通格式  
  10. //    manager.requestSerializer = [AFJSONRequestSerializer serializer]; // 上传JSON格式  
  11.       
  12.     // 声明获取到的数据格式  
  13.     manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // AFN不会解析,数据是data,需要自己解析  
  14. //    manager.responseSerializer = [AFJSONResponseSerializer serializer]; // AFN会JSON解析返回的数据  
  15.     // 个人建议还是自己解析的比较好,有时接口返回的数据不合格会报3840错误,大致是AFN无法解析返回来的数据  
  16.     return manager;  
  17. }  

3.2 get

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. + (void)getUserCarShopAndSalesDataForSalesWithUserId:(NSString *)userId date:(NSString *)date selectAreaType:(NSString *)areaType Success:(SuccessBlock)success fail:(AFNErrorBlock)fail  
  2. {  
  3.     // get请求也可以直接将参数放在字典里,AFN会自己讲参数拼接在url的后面,不需要自己凭借  
  4.     NSDictionary *param = @{@"user_id":userId, @"sale_date":date, @"accessToken":@"e9c0e60318ebd07ec2fe"@"area_type":areaType};  
  5.     // 创建请求类  
  6.     AFHTTPSessionManager *manager = [self manager];  
  7.     [manager GET:@"http://pm.yunhan-china.com/index.php/Api_sale/sales_get" parameters:param progress:^(NSProgress * _Nonnull downloadProgress) {  
  8.         // 这里可以获取到目前数据请求的进度  
  9.     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {  
  10.         // 请求成功  
  11.         if(responseObject){  
  12.             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];  
  13.             success(dict,YES);  
  14.         } else {  
  15.             success(@{@"msg":@"暂无数据"}, NO);  
  16.         }  
  17.     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {  
  18.         // 请求失败  
  19.         fail(error);  
  20.     }];  
  21. }  

3.3 post

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. + (void)loginWithUserAccount:(NSString *)account password:(NSString *)password success:(SuccessBlock)success fail:(AFNErrorBlock)fail  
  2. {  
  3.     // 将请求参数放在请求的字典里  
  4.     NSDictionary *param = @{@"phoneNumber":account, @"password":@"f379eaf3c831b04de153469d1bec345e"};  
  5.     // 创建请求类  
  6.     AFHTTPSessionManager *manager = [self manager];  
  7.     [manager POST:@"http://pm.yunhan-china.com/index.php/api_common/login" parameters:param progress:^(NSProgress * _Nonnull uploadProgress) {  
  8.         // 这里可以获取到目前数据请求的进度  
  9.     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {  
  10.         // 请求成功  
  11.         if(responseObject){  
  12.             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];  
  13.             success(dict,YES);  
  14.         } else {  
  15.             success(@{@"msg":@"暂无数据"}, NO);  
  16.         }  
  17.     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {  
  18.         // 请求失败  
  19.         fail(error);  
  20.     }];  
  21.       
  22. }  

3.4 下载

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. - (void)downLoadWithUrlString:(NSString *)urlString  
  2. {  
  3.     // 1.创建管理者对象  
  4.     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
  5.     // 2.设置请求的URL地址  
  6.     NSURL *url = [NSURL URLWithString:urlString];  
  7.     // 3.创建请求对象  
  8.     NSURLRequest *request = [NSURLRequest requestWithURL:url];  
  9.     // 4.下载任务  
  10.     NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {  
  11.         // 下载进度  
  12.         NSLog(@"当前下载进度为:%lf"1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);  
  13.     } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {  
  14.         // 下载地址  
  15.         NSLog(@"默认下载地址%@",targetPath);  
  16.         // 设置下载路径,通过沙盒获取缓存地址,最后返回NSURL对象  
  17.         NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];  
  18.         return [NSURL fileURLWithPath:filePath]; // 返回的是文件存放在本地沙盒的地址  
  19.     } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {  
  20.         // 下载完成调用的方法  
  21.         NSLog(@"%@---%@", response, filePath);  
  22.     }];  
  23.     // 5.启动下载任务  
  24.     [task resume];  
  25. }  

3.5 上传

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. - (void)uploadWithUser:(NSString *)userId UrlString:(NSString *)urlString upImg:(UIImage *)upImg  
  2. {  
  3.     // 创建管理者对象  
  4.     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
  5.     // 参数  
  6.     NSDictionary *param = @{@"user_id":userId};  
  7.     [manager POST:urlString parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {  
  8.         /******** 1.上传已经获取到的img *******/  
  9.         // 把图片转换成data  
  10.         NSData *data = UIImagePNGRepresentation(upImg);  
  11.         // 拼接数据到请求题中  
  12.         [formData appendPartWithFileData:data name:@"file" fileName:@"123.png" mimeType:@"image/png"];  
  13.         /******** 2.通过路径上传沙盒或系统相册里的图片 *****/  
  14. //        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"file" fileName:@"1234.png" mimeType:@"application/octet-stream" error:nil];  
  15.           
  16.     } progress:^(NSProgress * _Nonnull uploadProgress) {  
  17.         // 打印上传进度  
  18.         NSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);  
  19.     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {  
  20.         //请求成功  
  21.         NSLog(@"请求成功:%@",responseObject);  
  22.           
  23.     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {  
  24.         //请求失败  
  25.         NSLog(@"请求失败:%@",error);  
  26.     }];  
  27. }  

3.6 网络监听

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. - (void)AFNetworkStatus{  
  2.       
  3.     //1.创建网络监测者  
  4.     AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];  
  5.       
  6.     /*枚举里面四个状态  分别对应 未知 无网络 数据 WiFi 
  7.      typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) { 
  8.      AFNetworkReachabilityStatusUnknown          = -1,      未知 
  9.      AFNetworkReachabilityStatusNotReachable     = 0,       无网络 
  10.      AFNetworkReachabilityStatusReachableViaWWAN = 1,       蜂窝数据网络 
  11.      AFNetworkReachabilityStatusReachableViaWiFi = 2,       WiFi 
  12.      }; 
  13.      */  
  14.       
  15.     [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {  
  16.         //这里是监测到网络改变的block  可以写成switch方便  
  17.         //在里面可以随便写事件  
  18.         switch (status) {  
  19.             case AFNetworkReachabilityStatusUnknown:  
  20.                 NSLog(@"未知网络状态");  
  21.                 break;  
  22.             case AFNetworkReachabilityStatusNotReachable:  
  23.                 NSLog(@"无网络");  
  24.                 break;  
  25.                   
  26.             case AFNetworkReachabilityStatusReachableViaWWAN:  
  27.                 NSLog(@"蜂窝数据网");  
  28.                 break;  
  29.                   
  30.             case AFNetworkReachabilityStatusReachableViaWiFi:  
  31.                 NSLog(@"WiFi网络");  
  32.                   
  33.                 break;  
  34.                   
  35.             default:  
  36.                 break;  
  37.         }  
  38.           
  39.     }] ;  
  40. }  

本文转载自http://blog.csdn.net/ios_wq/article/details/51285444

- `AFNetworking (~> 3.1.0)` required by `Podfile`--Cocoapods安装三方库报错

Cocoapods安装第三方库 pod install之后报如下错误 - `AFNetworking (~> 3.1.0)` required by `Podfile` - `AFNetworki...
  • SYH523364
  • SYH523364
  • 2017年05月11日 09:57
  • 461

AFNetworking 3.0 最新实用封装(带缓存)

AFNetworking 的到来使我们开发者又方便了许多,话不多说,直接上代码。 首先 引入框架 AFNetworking框架 GitHub下载地址:https://github.com/AFNet...
  • by3g123
  • by3g123
  • 2016年02月03日 13:05
  • 7957

AFNetworking3.0版本之前和之后的一些变化

由于苹果在iOS 7.0开始推出NSURLSession网络框架(在iOS 9.0开始NSURLConnection过期)所以AFNetworking从3.0版本开始取消了NSURLConnectio...
  • hannibal_zj
  • hannibal_zj
  • 2016年08月16日 00:42
  • 1310

iOS程序猿之AFNetworking 3.0 版本使用

AFNetworking 3.0 版本使用 在Xcode7.0之后,苹果废弃了NSURLConnection方法,数据请求使用NSURLSession,作为网络请求类第三方库使用量最大的AFN也及时的...
  • iOS_wq
  • iOS_wq
  • 2016年04月30日 10:31
  • 9406

AFNetworking 2.0到3.0 迁移指南

AFNetworking是一款在OS X和iOS下都令人喜爱的网络库。为了迎合iOS新版本的升级, AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。...
  • qq_16844001
  • qq_16844001
  • 2016年04月07日 11:22
  • 1296

iOS-AFNetworking 2.0 和AFNetworking 3.0 区别及具体用法

在AFNetworking 3.0之前,底层是通过封装NSURLConnection来实现的。 在AFNetworking 3.0之后,也就是在iOS 9.0 之后,NSURLConnection...
  • SSY_1992
  • SSY_1992
  • 2018年01月02日 17:11
  • 69

AFNetworking3.0文件/图片上传

iOS(AFNetworking3.0)与后台图片文件/上传上次提及的AFNetworking3.0的简单的请求返回son格式,这次是文件/图片上传。...
  • u013058192
  • u013058192
  • 2017年04月18日 20:30
  • 565

AFNetworking3.0的基本使用方法

AFNetworking3.0的基本使用方法
  • super_man_ww
  • super_man_ww
  • 2016年11月09日 10:42
  • 2313

AFNetworking 3.0上传图片

//#pragma mark - 上传图片 - (void)uploadImageWithImage:(UIImage *)image {     //截取图片     NSData *imag...
  • App_IOS
  • App_IOS
  • 2016年01月26日 09:58
  • 5635

ios 对于AFNetworking3.0的基本使用

AFNetworking在3.0版本中删除了基于 NSURLConnection API的所有支持。AFHTTPRequestOperationManager已经抛弃,所以需要对数据请求进行改动。 G...
  • yc081323
  • yc081323
  • 2016年08月12日 17:17
  • 1813
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AFNetworking 3.0 版本使用
举报原因:
原因补充:

(最多只允许输入30个字)