一、CocoaPods
CocoaPods简介
CocoaPods是一个用来帮助我们管理第三方依赖库的工具
在开发iOS应用时,会经常使用第三方类库,比如SDWeblmage、AFNetworking等等,手动的下载与添加类库非常麻烦,通过CocoaPods可以便捷的下载与管理第三方类库。
使用CocoaPods的目的是让我们能自动化的、集中的、直观的管理第三方开源库。
官方链接:https://cocoapods.org
CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境,OS X系统默认支持Ruby运行,但是Ruby的默认源使用的是rubygems.org,过内访问这个网站时,如果无法翻墙,则不能下载,解决方案是将其替换成可用的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(@"请求失败"); }]; }