第三方类AFNetworking(一)
一、CocoaPods
CocoaPods简介
CocoaPods是一个用来帮助我们管理第三方依赖库的工具
在开发iOS应用时,会经常使用第三方类库,比如SDWeblmage、AFNetworking等等,手动的下载与添加类库非常麻烦,通过CocoaPods可以便捷的下载与管理第三方类库。
使用CocoaPods的目的是让我们能自动化的、集中的、直观的管理第三方开源库。
官方链接:https://cocoapods.org
CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境,OS X系统默认支持Ruby运行,但是Ruby的默认源使用的是rubygems.org,过内访问这个网站时,如果无法FQ,则不能下载,解决方案是将其替换成可用的Ruby,比如淘宝,替换如下:
打开终端,输入gem sources —remove https://rubygems.org/
再输入gem source - a http://ruby.淘宝.org/
为了验证你的Ruby镜像是并且是taobao,可用输入gem sources-|查看
CocoaPods安装
终端中输入 sudo gem install cocoa pods (中间可能要输入管理员密码,不是明文,在你输入密码的时候不会提示)
安装过程需要稍作等待,成功后会有成功安装的提示
在终端中使用cd命令进入工程所在目录。然后在当前目录下使用 vim Podfile命令创建Podfile文件(配文件)。
键盘输入i进入编辑模式,在podfile文件中输入一下文字
platform :ios, '8.0'
target "UISenior18_CocoaPodszuoye" do
pod 'AFNetworking', '~> 3.1.0'
end
在变价完成后,按下esc键,再按下“:”,此时,输入“wq”再按回车,保存退出。
利用CocoaPods下载类库,在终端的当前项目目录下输入pod install 等得一会。
然后回到你的工程所在的目录,会发现现在多了很多文件,此时我们应该使用,xcworkspace文件打开项目,而不再用xcodeproj文件打开。
如果一个项目中已经包含了Cocoapods的配置文件,但是编译却出现错误,那么我们仅需要一行命令就可以配置好所有的第三方类库
$pod update (更新)
二、AFNetworking
AFNetworking简介
AFNetworking是一个在iOS开发中 使用非常多网络开源库
适用于iOS以及Mac OS X。它构建于在(Apple iOS开发文档)
NSURLConnection , NSOperation,以及其他熟悉的Foundation技术之上
它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松
AFNetworking简介
AFNeting是一个轻量级的网络请求API类库。是以NSURLConnection,NSOperation和其他方法为基础的核心代码:AFHTTPRequestOperationManager
AFNetworking 拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松
AFNetworking是一个轻量级的网络请求API类库。是以NSURLCommection,NSOperation和其他方法为基础的核心代码:AFHTTPRequestOperationManager
AFnetworking拥有良好的架构,丰富的api,以及模块化架构方式,使得使用起来非常轻松
AFNetworking3.0目前使用NSURLSession作为网络类
AFNetworking简介
AFNetworking是一个轻量级的网络请求API类库。是以NSURLConection,NSOperation和其他方法为基础的核心代码:AFHTTPRequestOperationManager
AFNetworking拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松
功能梳理一:
AFRLConnectionOperation:继承自NSOperation实现了NSURL Connection的代理方法。//弃用了
AFHTTPRequestOperatio:继承自AFURLConnection的子类,当request请求使用的协议为HTTP和HTTPS时使用,它封装了用于决定request是否成功的状态码和内容类型
AFJSONRequestOperation:继承自AFHTTPRequestOperation,用于下载和处理jsonresponse数据。
AFPropertyListRequestOperation:继承自AFHTTPRequestOperation,用于下载和处理propretyListresponse数据
功能梳理二:
AFHTTPlient:是一个封装了基于http协议的网络应用程序的公共流模式。包含
1.发起基于根路径的使用基本的url相关路径来只做request
2.为request自动添加设置http headers。
3.使用http 基础证书或者OAuth来验证request
4.为由client制作的requests管理一个NSOperationQueue
5.从NSDictionary生成一个查询字符串或http bodies。
6.从request中构建多部件
7.自动的解析http response数据为相应的表现数据
8.在网络可达性测试用监控和响应变化。
网络监测
AFNetworking可以进行网络监测
//开始监测
[AFNetworkReachabilityManager sharedManager]startMonitoring];
//打印数据
[AFNetworkReachablityManager sharedManager]setReachablityStatuesChangeBlock:^(AFNetworkReachablity status status) {
NSL(@“%ld”,status)’
}];
//几种不同的网络状态
typedef NS_ENUM(NSInteger,AFNetworkReachabilityStatus){
AFNetworkReachabilityStatusUnknown = -1;
AFNetworkReachabilityStatusNotReachable = 0;
AFNetworkReachabilityStatusReachableViaWWAN = 1;
AFNetworkReachabilityStatusReachableViaWiFi = 2;
};
#import "ViewController.h" #import <AFNetworking.h> @interface ViewController () { //进行网络监测判断的BOOl值 BOOL isOpen; } //用于网络请求的session对象 @property (nonatomic,strong)AFHTTPSessionManager *session; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //初始化session对象 self.session = [AFHTTPSessionManager manager]; //设置请求接口回来的时候支持什么类型的数据 self.session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"application/x-json",@"text/html", nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)netWorkAction:(id)sender { if (!isOpen) { //打开网络监测 [[AFNetworkReachabilityManager sharedManager]startMonitoring]; isOpen = YES; }else{ //关闭网络监测 [[AFNetworkReachabilityManager sharedManager]stopMonitoring]; isOpen = NO; } //接下来会判断当前是wifi状态还是3g状态,网络不可用状态 [[AFNetworkReachabilityManager sharedManager]setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusUnknown: NSLog(@"当前网络处于未知状态"); break; case AFNetworkReachabilityStatusNotReachable: NSLog(@"当前网络处于未连接状态"); break; case AFNetworkReachabilityStatusReachableViaWWAN: NSLog(@"当前网络处于无线广域网"); break; case AFNetworkReachabilityStatusReachableViaWiFi: NSLog(@"当前网络处于wifi状态"); break; default: break; } }]; } - (IBAction)getRequestAction:(id)sender { //get请求请求的网址 [self.session GET:@"http://api.yhouse.com/m/city/dynmiclist" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) { NSLog(@"它是一个下载的进度"); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"请求成功:%@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败:"); }]; } - (IBAction)postRequestAction:(id)sender { /*{ do = "pri_memberlist"; "member_id" = zpHr2dsRvQQxYJxo2; "workspace_id" = ILfYpE4Dhs2gWcuQx; }*/ NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php"; NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:@"pri_memberlist" forKey:@"do"]; [dict setObject:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"]; [dict setObject:@"ILfYpE4Dhs2gWcuQx" forKey:@"workspace_id"]; [self.session POST:urlStr parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) { // NSLog(@"上传进度"); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"post请求成功:%@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"post请求失败"); }]; } - (IBAction)post1RequestAction:(id)sender { /* body体:/*address = ""; comment = "\U7c7b\U6a21\U5757\U8ba1\U5212\U7528\U5230\U7b2c\U4e09\U90e8\U5206\U4e2d\Uff0c\U5f85\U63d0\U95ee\U3001\U56de\U7b54\U79ef\U7d2f\U5230\U4e00\U5b9a\U6570\U91cf\U65f6\Uff0c\U4fbf\U4e8e\U5927\U5bb6\U7684\U95ee\U9898\U7684\U5feb\U901f\U67e5\U627e\Uff0c\U6240\U4ee5\U63d0\U95ee\U90e8\U5206\U6682\U65f6\U4e0d\U52a0\U5165\U8fd9\U4e2a"; do = "add_comment"; kind = task; "member_id" = zpHr2dsRvQQxYJxo2; other = ""; "task_id" = 55a47e79ec25e3641;*/ NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php"; NSString *comment = @"类模块计划用到第三部分中,待提问、回答积累到一定数量时,便于大家的问题的快速查找,所以提问部分暂时不加入这个"; comment = [comment stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:@"" forKey:@"address"]; [dict setObject:comment forKey:@"comment"]; [dict setObject:@"add_comment" forKey:@"do"]; [dict setObject:@"task" forKey:@"kind"]; [dict setObject:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"]; [dict setObject:@"" forKey:@"other"]; [dict setObject:@"55a47e79ec25e3641" forKey:@"task_id"]; [self.session POST:urlStr parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) { NSLog(@"上传"); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"请求成功:%@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败"); }]; } @end
注意事项
AFNetworking可以进行JSON数据解析/Plist数据解析(不支持XML数据解析)
URL字符串中如果有特殊字符或者中文字符,AFNETWorking并没有做UTF8的转码,需要:
url =
[urlStr stringByAddingPercentEncodingWithAllowedCharacters:NSUTF8StringEncoding];
代码实例:
#pragma mark - POST请求2的响应方法 - (IBAction)postRequest2Action:(id)sender { NSString *urlStr = @"http://m.taskwedo.com/API/wedo1/wedo.php"; NSString *commonContent = @"类模块计划用到第三部分中,待提问、回答积累到一定数量时,便于大家的问题的快速查找,所以提问部分暂时不加入这个"; commonContent = [commonContent stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; // 当body体或URL中出现汉字时使用 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setValue:@"" forKey:@"address"]; [dict setValue:commonContent forKey:@"comment"]; [dict setValue:@"add_comment" forKey:@"do"]; [dict setValue:@"task" forKey:@"kind"]; [dict setValue:@"zpHr2dsRvQQxYJxo2" forKey:@"member_id"]; [dict setValue:@"" forKey:@"other"]; [dict setValue:@"55a47e79ec25e3641" forKey:@"task_id"]; [self.session POST:urlStr parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) { NSLog(@"上传成功"); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"请求成功:%@", responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败"); }]; }