源码阅读学习:
参考源码解读:http://www.jianshu.com/p/c36159094e24
底层原理分析:
- AFNetWorking是对NSURLSession的封装
- AFHTTPRequestOperationManager :内部封装的是 NSUrlConnection,负责发送网络请求,使用最多的一个类.(3.0废弃)
- AFHTTPSessionManager :内部封装是 NSUrlSession ,负责发送网络请求,使用最多的一个类.
- AFHTTPRequestOperationManager 和 AFHTTPSessionManager :定义的 API(方法名称)是一模一样,没有任何区别.
- AFNetworkReachabilityManager :实时监测网络状态的工具类.当前的网络环境发生改变之后,这个工具类就可以检测到.
- AFSecurityPolicy :网络安全的工具类, 主要是针对 HTTPS 服务.
- AFURLRequestSerialization :序列化工具类,基类.上传的数据转换成JSON格式(AFJSONRequestSerializer).使用不多.
- AFURLResponseSerialization :反序列化工具类;基类.使用比较多:
AFJSONResponseSerializer; JSON解析器,默认的解析器. - AFHTTPResponseSerializer; 万能解析器; JSON和XML之外的数据类型,直接返回二进制数据.对服务器返回的数据不做任何处理.
AFXMLParserResponseSerializer; XML解析器;
AFM默认超时时长是:60秒
断点续传:
- 检查服务器文件信息
- 检查本地文件
- 如果本地比服务器文件小,断点续传,利用HTTP请求头的Range实现断点续传
- 如果比服务器文件大,重新下载
- 大小一致,下载完成
文档参考
AFNetworking Docs
Apple - URL Session Programming Guide
由 NSURLConnection 转为 NSURLSession 了;
使用 session task 来进行数据请求;
代码结构
AFHTTPSessionManager :AFURLSessionManager
默认使用request与response的序列化方式是: HTTP Serializer与JSON Serializer,用于在POST multipart时候使用;//发送及接收数据前的处理;
是对NSURLSession的封装处理,提供设置回调函数接口;
处理session的delegate,处理session task的delegate;
how to use AFHTTPSessionManager?
GET --> create NSURLSessionDataTask -> dataTask resumeSecurityPolicy
AFSecurityPolicy
evaluates server trust against pinned X.509 certificates and public keys over secure connections.
使用 Security系统库
用于HTTPS的secure连接请求;
判断请求的证书是否可信;分为 证书/公钥 两种:
AFSSLPinningModePublicKey 、AFSSLPinningModeCertificate
evaluateServerTrust 流程:
读取本地公钥的key文件;
提取pulickey 或者 certificate 信息;
检查域名有效,创建policy,检测server是否值得信任;
如果是None模式:检测证书可信性;
如果是证书模式:检测证书是否与设置过的相匹配;
如果是公钥模式:提取发送过来的公钥,检查是否与本地的key有相同的,如果有相同就返回YES;
--> 验证证书成功后,URLSession会使用证书进行下一步通信处理;Reachability
是对系统SystemConfiguration库中的SCNetWorkReachability的封装;
提供监听网络状态,判断网络是否连接的接口;
设计:将网络状态转换为wifi与wwan两种形式,并对网络变化提供消息通知处理;
在main loop中,schedule一个任务,用于网络状态监控;
网络状态变化,发送通知消息;
区分ipv4/ipv6的参数创建;Request/Response Serializer
根据不同子类的serializer实现,对请求数据进行重新组织,行程字典格式或者json格式等参数内容;
对请求数据进行处理,编码
对请求的header及类型等http信息就行处理
multipart请求的处理(要上传文件需要使用)
Response serializer对返回数据进行解析(JSON/XML/PropertyList/Image/Compound)处理,检查有效性并提取数据进行分装;
example 示例 使用结构设计:
model模块,负责请求及处理数据
controller模块,负责控制view显示数据及协议实现,用户交互
view模块,负责显示数据UIWebView+AFNetworking
UIWebView 类别,使用了runtime
一个运行时属性变量,使用了objc_set/getAssociateObject对属性进行读写;
一个session manager属性变量,也使用运行时函数进行读写;//使用了dispatch_once创建静态变量
二个load request函数
__weak __typeof(self) weakSelf = self;
session请求的返回及状态进度都是用代理模式处理;
每一个session task对应一个delegate;get 请求流程
使用request serializer创建一个NSMutableURLRequest(设置NSURLRequest的参数及header,httpbody信息);
使用NSURLRequest创建一个NSURLSessionDataTask(创建一个session task,设置delegate函数实现,根据task的identify存储对应的delegate对象);
处理NSURLSession相关的delegate函数,调用task对应的代理对象对返回数据、错误、进度等信息进行回调处理;data task 创建流程
POST data task:
- 使用request searializer 创建post的 NSURLRequest;
- NSURLSession 调用 uploadTaskWithStreamedRequest 创建 NSURLSessionUploadTask;
- 给task添加对应的delegate并存到到字典中,用于task状态返回的处理;
- task resume 开始执行task;
NSURLSesssion task种类
data task:
upload task:
download task:后台下载机制如何使用?
当应用退出后,崩溃或者进程被关掉还是会运行;
使用后台session配置,[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier];
在NSURLSessionDownloadDelegate的didFinsh函数中,移动临时目录文件到应用的存储中;
使用相关技术
单例 dispatch_once
Core Foundation 使用,需要手动retain与release管理;
background task
runtime method swizzle
NSOperationQueue
递归锁 NSRecursiveLock
信号量 dispatch_semphore_t (signal +1, wait -1);
手动调用KVO通知,KVO的依赖
消息通知