AFNetworking 网络库

源码阅读学习:
参考源码解读: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 来进行数据请求;

代码结构

AFNetworking 网络库_第1张图片
Paste_Image.png
  • AFHTTPSessionManager :AFURLSessionManager
    默认使用request与response的序列化方式是: HTTP Serializer与JSON Serializer,用于在POST multipart时候使用;//发送及接收数据前的处理;
    是对NSURLSession的封装处理,提供设置回调函数接口;
    处理session的delegate,处理session task的delegate;
    how to use AFHTTPSessionManager?
    GET --> create NSURLSessionDataTask -> dataTask resume

  • SecurityPolicy
    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:

  1. 使用request searializer 创建post的 NSURLRequest;
  2. NSURLSession 调用 uploadTaskWithStreamedRequest 创建 NSURLSessionUploadTask;
  3. 给task添加对应的delegate并存到到字典中,用于task状态返回的处理;
  4. 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的依赖
消息通知

你可能感兴趣的:(AFNetworking 网络库)