iOS开发之网络监听

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

本文主要介绍使用一个第三方类库来做检测网络状态: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检测网络状态和监听网络状态的讲解结束了,这只是简单的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值