iOS网络状态(一)
主题 《iOS开发》 by evan
SCNetworkReachabilityRef
在开发过程中,只要是你的app与网络打交道,难免会涉及到监听网络的状态,知道了网络的能力或者状态,你的app就可以提前预判到一些问题,从而拥有更加友好的交互逻辑。
如何获取网络状态
在官方文档中我们可以知道,通过创建一个
SCNetworkReachabilityRef
对象,然后调用SCNetworkReachabilitySetCallback
函数,就可以获取到设备当前的网络信息。创建
SCNetworkReachabilityRef
创建一个
SCNetworkReachabilityRef
有三中方式,Creating a Reachability Reference SCNetworkReachabilityCreateWithAddress SCNetworkReachabilityCreateWithAddressPair SCNetworkReachabilityCreateWithName
如何获取网络信息
通过第二步差创建的
SCNetworkReachabilityRef
调用如下方法Boolean SCNetworkReachabilitySetCallback (SCNetworkReachabilityRef target, SCNetworkReachabilityCallBack callout, SCNetworkReachabilityContext *context );
然后调用
Boolean
SCNetworkReachabilityGetFlags (
SCNetworkReachabilityRef target,
SCNetworkReachabilityFlags *flags
)方法,判断flag和以下枚举的关系,即可获知当前的网络状态。
typedef CF_OPTIONS(uint32_t, SCNetworkReachabilityFlags) { kSCNetworkReachabilityFlagsTransientConnection = 1<<0, kSCNetworkReachabilityFlagsReachable = 1<<1, kSCNetworkReachabilityFlagsConnectionRequired = 1<<2, kSCNetworkReachabilityFlagsConnectionOnTraffic = 1<<3, kSCNetworkReachabilityFlagsInterventionRequired = 1<<4, kSCNetworkReachabilityFlagsConnectionOnDemand = 1<<5, // __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_3_0) kSCNetworkReachabilityFlagsIsLocalAddress = 1<<16, kSCNetworkReachabilityFlagsIsDirect = 1<<17, `#if TARGET_OS_IPHONE kSCNetworkReachabilityFlagsIsWWAN = 1<<18, `#endif // TARGET_OS_IPHONE kSCNetworkReachabilityFlagsConnectionAutomatic = kSCNetworkReachabilityFlagsConnectionOnTraffic };
代码实现
在github上早就有高人开源了代码Reachability,用起来也比较简单。不过,如果你想更进一步了解整个底层的实现机制,还是建议你自己去实践,这样如果后期项目中有改动,也就能更加得心应手,好不生疏。