您的位置:首页 > 理论基础 > 计算机网络

iOS开发之网络监听

2015-12-15 15:35 246 查看
当应用程序访问网络时,它首先应该检查设备的网络状态,确认设备的网络环境以及连接情况,并针对这些情况提醒用户做出相应的处理。最好能监听设备的网络状态的改变,当设备连接、断开网络时,提醒用户做出相应处理。

本文主要介绍使用一个第三方类库来做检测网络状态: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检测网络状态和监听网络状态的讲解结束了,这只是简单的使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: