本文由我们团队的 康祖彬 童鞋撰写,在他的个人主页也可以看到这篇文章:https://kangzubin.cn。
Reachability 是苹果官方提供的示例源码,它是对 SystemConfiguration.framework
模块中的 SCNetworkReachability.h
头文件里提供的一系列网络连接状态相关的 C 函数进行简单封装,以示范如何在 iOS App 开发中实现网络状态变化监听,由此也衍生出各种 Reachability
框架,比较著名的有 Github 上的 tonymillion/Reachability 以及 AFNetworking
中的 AFNetworkReachabilityManager
模块,它们的实现原理基本上是完全相同的。
下面我们就来阅读分析一下苹果提供的 Reachability 源码,源码中最核心的就 Reachability.h
和 Reachability.m
两个文件。
初始化方法
Reachability
中提供了三个快速初始化方法,分别为 reachabilityWithHostName:
、reachabilityWithAddress:
和 reachabilityForInternetConnection
。
reachabilityWithHostName: 方法
该方法通过指定的 服务器域名
初始化一个 Reachability
对象以进行判断网络连接状态,源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
+ (instancetype)reachabilityWithHostName:(NSString *)hostName { Reachability* returnValue = NULL; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, [hostName UTF8String]); if (reachability != NULL) { returnValue= [[self alloc] init]; if (returnValue != NULL) { returnValue->_reachabilityRef = reachability; } else { CFRelease(reachability); } } return returnValue; } |
分析:上述代码比较简单,通过调用 SCNetworkReachabilityCreateWithName
C 函数生成一个 SCNetworkReachabilityRef
引用,然后初始化一个 Reachability
对象,并把刚才生成的引用赋给该对象中的 _reachabilityRef
成员变量,以供后面网络状态监听使用。
reachabilityWithAddress: 方法
该方法通过指定的 服务器 IP 地址
初始化一个 Reachability
对象以进行判断网络连接状态,源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
+ (instancetype)reachabilityWithAddress:(const struct sockaddr *)hostAddress { SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, hostAddress); Reachability* returnValue = NULL; if (reachability != NULL) { returnValue = [[self alloc] init]; if (returnValue != NULL) { returnValue->_reachabilityRef = reachability; } else { CFRelease(reachability); } } return returnValue; } |
分析:与上述类似,该方法通过调用 SCNetworkReachabilityCreateWithAddress
C 函数生成一个 SCNetworkReachabilityRef
引用,并赋给 Reachability
对象中的 _reachabilityRef
成员变量。
reachabilityForInternetConnection 方法
该方法通过 默认的路由地址
初始化一个 Reachability
对象以进行判断网络连接状态,通常用于 App 没有连接到特定主机的情况,源码如下:
1 2 3 4 5 6 7 8 9 |
+ (instancetype)reachabilityForInternetConnection { struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; return [self reachabilityWithAddress: (const struct sockaddr *) &zeroAddress]; } |
分析:在该方法中先初始化一个默认的 sockaddr_in
Socket 地址(这里创建的为零地址,0.0.0.0 地址表示查询本机的网络连接状态),然后调用 reachabilityWithAddress:
方法返回一个 Reachability
对象。
网络状态监听
开始监听
通过上述初始化方法获得一个 Reachability
对象后,可调用 startNotifier
方法开始进行网络状态变化的监听,源码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
- (BOOL)startNotifier { >Reachability 是苹果官方提供的示例源码,它是对 SystemConfiguration.framework 模块中的 SCNetworkReachability.h 头文件里提供的一系列网络连接状态相关的 C 函数进行简单封装,以示范如何在 iOS App 开发中实现网络状态变化监听,由此也衍生出各种 Reachability 框架,比较著名的有 Github 上的 tonymillion/Reachability 以及 AFNetworking 中的 AFNetworkReachabilityManager 模块,它们的实现原理基本上是完全相同的。
下面我们就来阅读分析一下苹果提供的 Reachability 源码,源码中最核心的就 初始化方法
reachabilityWithHostName: 方法该方法通过指定的
分析:上述代码比较简单,通过调用 reachabilityWithAddress: 方法该方法通过指定的
分析:与上述类似,该方法通过调用 reachabilityForInternetConnection 方法该方法通过
分析:在该方法中先初始化一个默认的 网络状态监听开始监听通过上述初始化方法获得一个
|