客户端与服务器交互,这就必须用到网络请求
ASIHTTPRequest 、AFNetWorking 和 MKNetworkKit都是网络访问框架。
AFN 和 ASI :
ASIHTTPRequest已经停止维护
ASIHTTPRequest是基于NSURLConnection类实现的,
AFNetWorking早期也是基于NSURLConnection实现,后来iOS9 之后已经放弃了NSURLConnection,开始使用iOS 7之后推出的NSURLSession,
HTTPS证书校验:
AFN框架中实现HTTPS请求的客户端校验是通过AFSecurityPolicy对象实现的
AFN框架的AFSecurityPolicy类为我们实现了HTTPS证书校验的功能,且同时支持三种方式校验证书
HTTPS请求首先需要TLS/SSL握手,该协议也是建立在TCP基础之上
AFHTTPSessionManager继承自AFURLSessionManager,并且实现了
AFURLSessionManager这个类才是对请求发送的核心类.它主要包括AFURLSessionManagerTaskDelegate、
_AFURLSessionTaskSwizzling、
AFURLSessionManager这三个对象.
AFURLSessionManagerTaskDelegate:
分发处理了AFURLSessionManager主类的上传,下载进度的管理,通过观察task一些方法的变化,来得到进度.而且还帮忙处理了NSURLSessionTaskDelegate、NSURLSessionDataTaskDelegate和NSURLSessionDownloadTaskDelegate 等代理的返回数据.
现在AFNetworking 内部提供的创建方式[AFHTTPSessionManager manager]是单例的不会每次创建一个NSURLSession,那么每次新建一个NSURLSession,然后新建Task,激活Task
共享的NSURLSession将会复用TCP的连接,而每次都新建NSURLSession的操作将导致每次的网络请求都开启一个TCP的三次握手。所以我们封装请求类的时候,最好用单例模式.让manager持有NSURLSession,达到共享的效果.即一个Session创建多个Task来实现网路的请求.
AFHTTPSessionManager请求管理者
//最大请求并发任务数
// 请求格式
// 超时时间
// 设置请求头
// 返回格式
处理get请求:
GET: parameters: progress:^(){}
处理post请求:
POST: parameters: progress:^
处理文件上传:
POST:url parameters:parameters constructingBodyWithBlock:^(formData){
[formData appendPartWithFileURL:
}
处理文件下载:
downloadTaskWithRequest:
NSURLSessionDownloadTask *task =
网络状态监听:
//创建网络监测者
AFNetworkReachabilityManager *manager
setReachabilityStatusChangeBlock:^(
[manager startMonitoring];
AFNetWorking内存泄露
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
点进去查看源码发现并不是单例,而是每次都实例化一个AFHTTPSessionManager对象,源码如下
+ (instancetype)manager {
return [[[self class] alloc] initWithBaseURL:nil];
}
所以我们在使用AFNetWorking的时候要对AFHTTPSessionManager进行单例封装
AFNetWorking关于HTTPs:
iOS 9 引入的 ATS(App Transport Security)技术
目前应对https的方案有两种:
屏蔽调iOS ATS(App Transport Security),在pList.info文件中添加如下代码
第二种方式:
配置https CA证书,这里采用获取NSBundle中获取CA证书,AFNetWorking提供了配置AFSecurityPolicy模块:
AFSecurityPolicy *security =
然后通过设置AFHTTPSessionManager的securityPolicy属性等于自定义的AFSecurityPolicy。
Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable content-type: text/html"
UserInfo={NSLocalizedDescription=Request failed: unacceptable content-type: text/html,
解决:
httpSM.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", nil];
参考:
https://juejin.im/entry/589d1aa161ff4b006b37408e //实例
https://www.jianshu.com/p/5f8e56a17d85
https://www.jianshu.com/p/856f0e26279d //原理