当应用程序访问网络时,它首先应该检查设备的网络状态,确认设备的网络环境以及连接情况,并针对这些情况提醒用户做出相应的处理。最好能监听设备的网络状态的改变,当设备连接、断开网络时,提醒用户做出相应处理。
本文主要介绍使用一个第三方类库来做检测网络状态:Reachability。
下面来简单的使用。
新建项目,将Reachability.h和Reachability.m文件拖到项目中,再添加SystemConfiguration.framework库。在使用它的类中包含头文件#import <Reachability.h>
向项目中Main.Storyboard中拖几个控件,如下:
因为Reachability不支持ARC,需要手动设置ARC,如图:
由于是使用模拟器运行程序,只能模拟两种网络状态。
“检测”按钮:测试访问指定站点时设备的网络状态
/**
* 测试指定站点的网络情况
*/
- (IBAction)testNetStatus {
// 创建访问指定站点的Reachability
Reachability *reach = [Reachability reachabilityWithHostName:self.addressTextField.text];
// 判断该设备的网络状态
switch (reach.currentReachabilityStatus) {
case ReachableViaWiFi:
NSLog(@"使用wifi访问%@", self.addressTextField.text);
break;
case ReachableViaWWAN:
NSLog(@"使用3G/4G访问%@", self.addressTextField.text);
case NotReachable:
NSLog(@"不能访问%@", self.addressTextField.text);
default:
break;
}
}
打印结果:(连接wifi时)
断开wifi时
下面针对设备连接wifi和3G/4G情况分别进行检测
测试设备wifi连接情况
/**
* 测试设备的WIFI连接情况
*/
- (IBAction)testWIFI {
if ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable) {
NSLog(@"wifi网络已连接");
}else {
NSLog(@"Wifi网络不可用");
}
}
连接wifi时
断开wifi时
测试设备3G/4G连接情况(模拟器无法模拟该情况)
/**
* 测试设备3G/4G连接情况
*/
- (IBAction)testInternet {
if ([[Reachability reachabilityForInternetConnection]currentReachabilityStatus] != NotReachable) {
NSLog(@"3G/4G网络已连接");
}else {
NSLog(@"3G/4G网络不可用");
}
}
除了上面直接检测网络连接状态之外,有时候程序还需要监听网络状态的改变。当网络连接或断开时,提醒用户,以做出相应的处理。
监听网络状态的改变是通过通知实现的。程序获取Reachability对象后,调用Reachability对象的startNotifier方法即可开启该对象的监听状态。当Reachability的网络状态改变时,该对象会发出一个KReachabilityChangeNotification通过给默认的通知中心,然后注册该通知的对象就能监听该通知,并做出相应处理。
当应用启动后,我们可以在appDelegate的didFinishLaunchingWithOptions方法中监听网络状态的改变。
代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 向通知中心注册KReachabilityChangeNotification通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChange:) name:kReachabilityChangedNotification object:nil];
// 获取指定站点的Reachability对象
Reachability *reach = [Reachability reachabilityWithHostName:@"www.baidu.com"];
// 开始监听状态
[reach startNotifier];
return YES;
}
/**
* 监听到网络状态改变时的回调方法
*/
- (void)reachabilityChange:(NSNotification *)noti {
// 通过通知对象获取被监听的Reachability对象
Reachability *reach = [noti object];
//获取Reachability对象当前的网络状态
NetworkStatus status = [reach currentReachabilityStatus];
switch (status) {
case ReachableViaWiFi:
NSLog(@"当前已经连接了wifi");
break;
case ReachableViaWWAN:
NSLog(@"当前已经连接了3G/4G");
case NotReachable:
NSLog(@"当前无网络连接");
default:
break;
}
}
当前连接wifi时:
当前断开wifi时:
对Reachability检测网络状态和监听网络状态的讲解结束了,这只是简单的使用。