苹果示例源码阅读:Reachability

456 查看

本文由我们团队的 康祖彬 童鞋撰写,在他的个人主页也可以看到这篇文章:https://kangzubin.cn


Reachability 是苹果官方提供的示例源码,它是对 SystemConfiguration.framework 模块中的 SCNetworkReachability.h 头文件里提供的一系列网络连接状态相关的 C 函数进行简单封装,以示范如何在 iOS App 开发中实现网络状态变化监听,由此也衍生出各种 Reachability 框架,比较著名的有 Github 上的 tonymillion/Reachability 以及 AFNetworking 中的 AFNetworkReachabilityManager 模块,它们的实现原理基本上是完全相同的。

下面我们就来阅读分析一下苹果提供的 Reachability 源码,源码中最核心的就 Reachability.hReachability.m 两个文件。

初始化方法

Reachability 中提供了三个快速初始化方法,分别为 reachabilityWithHostName:reachabilityWithAddress:reachabilityForInternetConnection

reachabilityWithHostName: 方法

该方法通过指定的 服务器域名 初始化一个 Reachability 对象以进行判断网络连接状态,源码如下:

分析:上述代码比较简单,通过调用 SCNetworkReachabilityCreateWithName C 函数生成一个 SCNetworkReachabilityRef 引用,然后初始化一个 Reachability 对象,并把刚才生成的引用赋给该对象中的 _reachabilityRef 成员变量,以供后面网络状态监听使用。

reachabilityWithAddress: 方法

该方法通过指定的 服务器 IP 地址 初始化一个 Reachability 对象以进行判断网络连接状态,源码如下:

分析:与上述类似,该方法通过调用 SCNetworkReachabilityCreateWithAddress C 函数生成一个 SCNetworkReachabilityRef 引用,并赋给 Reachability 对象中的 _reachabilityRef 成员变量。

reachabilityForInternetConnection 方法

该方法通过 默认的路由地址 初始化一个 Reachability 对象以进行判断网络连接状态,通常用于 App 没有连接到特定主机的情况,源码如下:

分析:在该方法中先初始化一个默认的 sockaddr_in Socket 地址(这里创建的为零地址,0.0.0.0 地址表示查询本机的网络连接状态),然后调用 reachabilityWithAddress: 方法返回一个 Reachability 对象。

网络状态监听

开始监听

通过上述初始化方法获得一个 Reachability 对象后,可调用 startNotifier 方法开始进行网络状态变化的监听,源码如下: