2.检查网络状态

简介: 以后慢慢启用个人博客:http://www.yuanrengu.com   当应用程序需要访问网络时,它首先应该检查设备的网络状态,确认设备的网络环境及连接情况,并针对这些情况提醒用户做出相应的处理。

      以后慢慢启用个人博客:http://www.yuanrengu.com

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

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

  1. 下载,添加Reachability类。

    下载Reachability.zip压缩包,最新的版本为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 @end
13 
14 @implementation ViewController
15 @synthesize siteField;
16 
17 - (void)viewDidLoad
18 {
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*) msg
60 {
61     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"网络状态" message:msg delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
62     [alert show];
63     
64 }
65 
66 -(BOOL)textFieldShouldReturn:(UITextField *)textField
67 {
68     [siteField resignFirstResponder];
69     return YES;
70     
71 }
72 
73 - (void)didReceiveMemoryWarning
74 {
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进行提醒。 

   希望上面的总结能对正在学习iOS开发的小伙伴有一点点帮助,假如觉得还不错,烦请小伙伴不要忘记右下角的点“推荐”哦!

 

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

相关文章
|
数据处理
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
336 0
|
JavaScript
vue导出pdf(接口)
vue导出pdf(接口)
183 3
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
1152 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
缓存 前端开发 数据库
服务器硬件基础知识
服务器硬件基础知识
406 0
lanqiao oj 1085 小猪存钱罐
lanqiao oj 1085 小猪存钱罐
98 0
|
算法
阿里云图像搜索技术创新-工业五金图片搜索
阿里云图像搜索产品3月17日正式发布工业五金搜索模型,通过大规模算法模型训练,可在海量五金图片素材中快速定位到图片中五金件的同款或相似款商品原图,识别过程中可有效避免图片方位变化、光照变化、背景场景变化等情况对搜索结果的影响。以此帮助工业五金电商商城、仓库等快速找到同款、相似款。通过输入工业五金类图片,可以在海量商品库中找到同款、相似款配件,并返回对应的配件信息,提升五金类产品购物效率,帮忙更多工业五金制造和零售等企业轻松上云。
744 57
阿里云图像搜索技术创新-工业五金图片搜索
|
机器学习/深度学习 边缘计算 TensorFlow
Python机器学习工具与库的现状,并展望其未来的发展趋势
【6月更文挑战第13天】本文探讨了Python在机器学习中的核心地位,重点介绍了Scikit-learn、TensorFlow、PyTorch等主流库的现状。未来发展趋势包括自动化、智能化的工具,增强可解释性和可信赖性的模型,跨领域融合创新,以及云端与边缘计算的结合。这些进展将降低机器学习门槛,推动技术在各领域的广泛应用。
229 3
|
开发框架 自然语言处理 前端开发
在Winform程序中动态绘制系统名称,代替图片硬编码名称
在Winform程序中动态绘制系统名称,代替图片硬编码名称
GitHub获120k+star的阿里内网“疯传”葵花宝典JVM虚拟机调优指南
jvm性能调优都做了什么? JVM性能调优有很多设置,这个参考JVM参数即可. 主要调优的目的: 控制GC的行为.GC是一个后台处理,但是它也是会消耗系统性能的,因此经常会根据系统运行的程序的特性来更改GC行为 控制JVM堆栈大小.一般来说,JVM在内存分配上不需要你修改,(举例)但是当你的程序新生代对象在某个时间段产生的比较多的时候,就需要控制新生代的堆大小.同时,还要需要控制总的JVM大小避免内存溢出 控制JVM线程的内存分配.如果是多线程程序,产生线程和线程运行所消耗的内存也是可以控制的,需要通过一定时间的观测后,配置最优结果
|
弹性计算 运维 Kubernetes
全景剖析阿里云容器网络数据链路(一)—— Flannel
本系列联合作者 容器服务 @谢石 近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的IaaS化到现在的微服务化,客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度,也一直在高速的发展和演进中,这必然对客户对云原生网络的可观测性带来了极高的门槛和挑战。为了提高云原生网络的可观测性,同时便于客户和前后线同学增加对业务链路的可读性
1228 0
全景剖析阿里云容器网络数据链路(一)—— Flannel