2.检查网络状态
当应用程序需要访问网络时,它首先应该检查设备的网络状态,确认设备的网络环境及连接情况,并针对这些情况提醒用户做出相应的处理。最好能监听设备的网络状态的改变,当设备网络状态连接、断开时,程序也应该有相应的处理。
工欲善其事必先利器,在检查设备的网络状态前,我们要先实现两个步骤:
- 下载,添加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进行提醒。
- Google 分析的基准化测试
- WebFont 三宗罪之一:WebFont 与 FOUT
- 探究基于声明的身份标识
- 深化“互联网+先进制造业”发展工业互联网的系列解读二:打造平台体系
- WebFont 三宗罪之二:吹毛求疵的WebFont 渲染差异
- IDC发布IT转型报告,现代化、自动化、转型三要素必不可少
- 存储过程和触发器的应用
- 两部委印发车联网产业标准体系建设指南 提到了自动驾驶
- 状态开关按钮ToggleButton
- 微软开放 .NET 框架源代码
- Angularjs基础(十二)
- 妙趣横生的HTML5 Page Visibility API
- 禁止/移除 WordPress 4.2 中前台自动加载的 emjo 脚本
- 项目管理方面的几个.NET开源项目
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用 Go 语言开发 Android 应用的正确姿势探索
- Android的配置文件操作的完美封装(使用注解 反射让配置文件操作如此清晰和简单)
- Android中protobuf的使用
- 疫情监控三部曲——在STM32F103 MCU上实现(裸机版)
- Android配置文件操作模块封装,全互联网最简单好用的封装
- 使用logcat让Android应用支持查看实时日志并输出至界面显示功能
- 如何处理redis集群的hot key和big key
- 嵌入式linux之go语言开发(十一)让web服务器跑在终端上,通过网页配置终端参数
- 嵌入式linux之go语言开发(十二)参数配置文件存储模块开发
- 嵌入式linux之go语言开发(十三)LittlevGL,漂亮的嵌入式GUI的go语言绑定
- 同事问我MySQL怎么递归查询,我懵逼了...
- RocketMQ学习四-生产者producer
- 想有自己的博客吗?浏览器支持 MarkDown和语法高亮的最简单示例(使用markdown-it、highlight.js和mermaid)
- Golang--Go语言 五百行后台代码实现一简约的个人博客网站-TinyBlog
- RocketMQ学习5