AFNetWorking源码学习(三)——AFNetworkReachabilityManager和AFSecurityPolicy

858 阅读5分钟

        本篇开始来学习AFNetWorking中封装的网络状态监听模块AFNetworkReachabilityManager和AFSecurityPolicy,一个是用来对当前的网络状态进行判断,另一个是用来保证网络请求的安全性,提供安全策略。

一、AFNetworkReachabilityManager

1、功能作用

AFNetworkReachabilityManager的主要功能就是进行网络检测,也可以通过设置状态改变回调来获取当前网络状态,也能够调用start和stop方法开启和停止网络监控。

2、属性和接口

        核心的方法是startMonitoring和stopMonitoring,我们具体来看看该类中是如何实现开始网络监测和停止网络监测的:

        在startMonitoring方法当中,最后调用到AFPostReachabilityStatusChange方法,该方法是用来将主线程的状态更改通知排入队列。看看其内部实现:

        这里做了两件事情:一是将flags通过AFNetworkReachabilityStatusForFlags进行解析返回当前网络状态;二是在主线程中根据当前网络状态注册网络状态改变时的监听;AFNetworkReachabilityStatusForFlags方法用来解析flags来返回当前的网络状态:        在进行开启和停止网络监听的时候,这里用到了SCNetworkReachability这个类中的一些列内容,SCNetworkReachability是可以获取网络状态同时也可以对网络进行检测的。

在AFNetWorking源码学习(一)中的流程介绍中,在创建一个sessionManger的时候,会初始化一个AFNetworkReachabilityManager对象,用来进行网络检测,创建的方式是:

        当然在AFNetworkReachabilityManager中还包含控件定时器相关的处理,这里在UIKit+AFNetworking中继续学习。

二、AFSecurityPolicy

1、功能作用

        网络通信安全策略模块AFSecurityPolicy,AFSecurityPolicy提供了https请求时的网络安全策略,同时在AFNetworking中,使得在系统底层自己去验证之前,AFNetworking可以先去验证服务端的证书,如果验证不通过,则直接越过系统的验证,取消https的网络请求。否则,继续去走系统根证书的验证。

2、属性和接口

如上图是AFSecurityPolicy对外提供的一些属性和接口;

在AFURLSessionManager中的NSURLSession的相关代理中,实现了关于https验证的代理方法,具体实现如下:

NSURLSessionDelegate

NSURLSessionTaskDelegate: 在服务端接收到客户端发来的网络请求的时候,有时候需要先验证客户端是否为正常的用户,再去依次为客户端返回数据。这一过程可以参考HTTPS的请求流程,如下图所示:

ps:图来源于:blog.csdn.net/seujava\_er…

        这两个代理方法是用来做https证书验证的,NSURLSessionDelegate的验证级别是在session级别上,就是在有一个sessionManager的时候,会走到这里的代理方法,来去进行证书验证;这个验证是seesion级别的,也就是当前session证书验证通过的话,session所管理的task也都遵守该证书。而NSURLSessionTaskDelegate这个的验证级别是在task级别,这里多了一个参数task,然后调用我们自定义的Block会多回传这个task作为参数,这样我们就可以根据每个task去自定义我们需要的https认证方式。

接下来看看AFSecurityPolicy内部是如何来满足各种https认证的需求的:

初始化方法:

        在AFSecurityPolicy中提供了三种初始化的方法,具体的做法如图中注释所示。

        检验是否应根据安全策略接受指定的服务器信任的,核心方法是以下evaluateServertTrust:这个方法,我们一起看看AFSecurityPolicy是如何实现的:

(ps:备注来源于网上各个参考;)

总结来说,该方法做了以下的事情:

1、先去判断“是否有域名,且允许自建证书,需要验证域名

“,

根据这些文件,你应该只相信你提供的证书进行评估。固定证书被添加到信任中。没有固定凭证,就没有什么可评估的。(英文注释翻译。)直接返回;

2、不满足上述条件时开始做验证:

(1)判断验证策略;

(2)验证https验证模式 默认是无,还有证书匹配和公钥匹配

  • 验证证书类型;setverTrust中去获取证书链,然后和我们一开始初始化设置的证书集合self.pinnedCertificates去匹配,如果有一对能匹配成功的,就返回YES,否则NO。
  • 公钥验证:公钥验证从setverTrust,获取证书链每一个证书的公钥,放到数组中。和我们的self.pinnedPublicKeys去配对,如果有一个相同的,就返回YES,否则NO。至于这个self.pinnedPublicKeys,初始化的地方如下:

        AFSecurityPolicy对于证书验证提供了以上的方法,在有特殊验证需求的时候可以使用AF提供的验证需求,在这里,如果进入AF的验证,AF会让在系统验证证书之前,先进行自主验证,如果自主验证不通过,就会直接取消网络请求;如果通过则继续进行系统验证;

        以上是关于AFNetworkReachabilityManager和AFSecurityPolicy的功能以及提供的一些属性和接口的大致介绍。总结来说,在AFNetworking中,这两位的存在是为了保证整个网络请求的正常发出,AFNetworkReachabilityManager则是用来进行网络监控,监听当前网络状态;AFSecurityPolicy则是提供了https请求时的网络安全策略。