博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.检查网络状态
阅读量:5927 次
发布时间:2019-06-19

本文共 5222 字,大约阅读时间需要 17 分钟。

以后慢慢启用个人博客:

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

  工欲善其事必先利器,在检查设备的网络状态前,我们要先实现两个步骤:

  1. 下载,添加Reachability类。

    下载压缩包,最新的版本为V3.5,解压该压缩包会得到一个Xcode项目,其实关键是得到改项目的Reachability.h和 Reachability.m文件,并把它们添加到项目中。

      2. 为项目添加SystemConfiguration.framework框架。

     添加方法:

  • 1)   选中项目名称
  • 2)选中TARGETS
  • 3)选中Build Phases
  • 4)在Link Binary With Libraries中添加。

  

  将Reachability.h和 Reachability.m文件添加到项目中。

  注意:如果Reachability不是3.0以上的版本,而是Reachability 2.x版本,它是不支持ARC的。本项目已经启用了ARC,早期版本的Reachability类并不支持ARC,因此需要手动设置该类禁用ARC。

  打开Main.storyboard界面设计文件,向该文件中添加1个UILabel,1个UITextFieldhe 3个UIButton,如下图所示(^_^不好意思,最下面2个UILabel是打广告的)。为了在程序中访问界面上的文本框,将文本框绑定到siteField IBOutlet属性。为了让程序能相应界面上3个按钮的点击事件,将“测试”按钮的“Touch UP Inside”事件绑定testNetStatus:事件处理方法,为“测试WIFI”按钮的“Touch UP Inside”事件绑定testWifi:事件处理方法,为“测试3G/4G”按钮的“Touch UP Inside”事件绑定testInternet:事件处理方法。

  

 

  接下来编辑该示例的视图控制器类,该视图控制器类的实现部分主要依靠Reachability类来检测网络状态。

  核心实现代码:

 

1 //  ViewController.m 2 //  NetWorkDemo 3 // 4 //  Copyright (c) 2014年 MiracleHe. All rights reserved. 5 // 6  7 #import "ViewController.h" 8 #import "Reachability.h" 9 10 @interface ViewController ()11 12 @end13 14 @implementation ViewController15 @synthesize siteField;16 17 - (void)viewDidLoad18 {19     [super viewDidLoad];20     // Do any additional setup after loading the view, typically from a nib.21 }22 - (IBAction)testNetStatus:(id)sender {23     NSString *site = self.siteField.text;24     Reachability *reach = [Reachability reachabilityWithHostName: site];25     switch ([reach currentReachabilityStatus]) {26         case NotReachable:27             [self showAlert:[NSString stringWithFormat:@"不能访问%@", site]];28             break;29         30         case ReachableViaWWAN:31             [self showAlert:[NSString stringWithFormat:@"使用3G/4G网络访问%@", site]];32             break;33             34         case ReachableViaWiFi:35             [self showAlert:[NSString stringWithFormat:@"使用Wifi网络访问%@", site]];36             break;37     }38     39 }40 41 42 - (IBAction)testWifi:(id)sender {43     if ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable) {44         [self showAlert:@"wifi网络已经连接"];45     }else{46         [self showAlert:@"wifi网络不可用。"];47     }48 }49 50 51 - (IBAction)testInternet:(id)sender {52     if ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable) {53         [self showAlert:@"3G/4G网络已经连接"];54     }else{55         [self showAlert:@"3G/4G网络不可用"];56     }57 }58 59 -(void) showAlert:(NSString*) msg60 {61     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"网络状态" message:msg delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];62     [alert show];63     64 }65 66 -(BOOL)textFieldShouldReturn:(UITextField *)textField67 {68     [siteField resignFirstResponder];69     return YES;70     71 }72 73 - (void)didReceiveMemoryWarning74 {75     [super didReceiveMemoryWarning];76     // Dispose of any resources that can be recreated.77 }78 79 @end

 

  上面程序首先调用了Reachability类的reachabilityWithHostName:类方法来获取Reachability对象,然后调用该对象的currentReachabilityStatus方法来获取访问指定站点的方式,该方法返回NetworkStatus枚举值,该枚举值有如下3个:

typedef enum{    NotReachable = 0,     //无连接    ReachableViaWiFi,     //使用3G/4G网络    ReachableViaWWAN      //使用WiFi网络}NetworkStatus;

  上面程序对Reachability的currentReachabilityStatus方法返回值进行判断,这样即可获取该应用访问网络的状态和方式。

  编译、运行该程序,如对www.cnblogs.com进行“测试”,效果如下图。

  如果访问的站点本身不存在,即时设备的网络处于连接状态,Reachability对象的currentReachabilityStatus方法也将返回NotReachable。

  如果程序仅需要测试设备的WiFi或3G/4G网络是否连接,则可先调用Reachability类的reachabilityForLocalWiFi或reachabilityForInternetConnection类方法获取Reachability对象,然后调用该Reachability对象的currentReachabilityStatus方法获取网络连接状态,如果网络连接状态返回NotReachable,则表明这种类型的网络暂未连接。

 

  除了直接检测网络连接状态之外,有时候程序还需要监听网络状态的改变。当网络断开连接时,提醒用户,网络连接已经断开,应用可能需要暂停;当网络重新连接时,再次提醒用户,应用可以继续运行。程序获取Reachability对象之后,调用Reachability对象的startNotifier方法即可开启该对象的被监听状态——当Reachability的连接状态发生改变时,该对象将会发送一个kReachabilityChangedNotification通知给默认的通知中心,因此程序只要使用默认的通知中心监听该通知即可。

  为了监听网络状态的改变,在应用程序委托类(AppDelegate.m)的application: didFinishLaunchingWithOptions:方法中增加如下代码:

//使用通知中心监听kReachabilityChangedNotification通知    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];    //获取访问指定站点的Reachability对象    Reachability *reach = [Reachability reachabilityWithHostName:@"www.cnblogs.com"];    //让Reachability对象开启被监听状态    [reach startNotifier];

  上面的代码使用默认的通知中心检测kReachabilityChangedNotification通知,这意味着当Reachability的连接状态发生改变时,默认的通知中心就会收到该通知,从而触发应用程序委托类的reachabilityChanged:方法,还需要在应用程序委托类中定义如下方法:

- (void) reachabilityChanged:(NSNotification*) note{    //通过通知对象获取被监听的Reachability对象    Reachability *curReach = [note object];    //获取Reachability对象的网络状态    NetworkStatus status = [curReach currentReachabilityStatus];    if (status == NotReachable) {        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提醒" message:@"不能访问www.cnblogs.com" delegate:nil cancelButtonTitle:@"YES" otherButtonTitles: nil];        [alert show];    }}

   reachabilityChanged:会判断该Reachability对象的网络连接状态,当该对象的网络连接状态处于NotReachable时,程序会使用UIAlertView进行提醒。

本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3666825.html,如需转载请自行联系原作者

你可能感兴趣的文章
扩展log4j系列[一]为DailyRollingFileAppender加上maxBackupIndex属性 - 玮哥也是哥 - ITeye技术网站...
查看>>
神器中的神器org-mode之入门篇
查看>>
SQL Server 重复执行作业中某个步骤
查看>>
推荐12款可用于前端开发的免费文本编辑器
查看>>
广东电信:故障是外力强加导致 警方介入调查
查看>>
HDU 2082 找单词
查看>>
c#,js解析json
查看>>
Android中自定义漂亮动态样式
查看>>
一生何求
查看>>
【五一呈献】Java 全能高效 MVC & REST 开发框架 Portal-Basic v3.1.1 正式发布
查看>>
技术人生:让最卑微的念头也表现出来
查看>>
10个实用的 CSS3 按钮效果制作教程
查看>>
GridControl 分组排序
查看>>
GridControl
查看>>
论文笔记(1)-Dropout-Improving neural networks by preventing co-adaptation of feature detectors
查看>>
一种具有细节保留功能的磨皮算法。
查看>>
Xcode 打包 ipa 包
查看>>
c++,多继承造成的二义性及解决办法
查看>>
JMeter性能测试介绍学习一
查看>>
php请求页面将返回的页面发送email
查看>>