iOS开发网络篇—Reachability检测网络状态

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

开发工具:xcode6.3.2 操作系统:OS X Yosemite10.10.4 学习来源:《疯狂IOS讲义(下)》中的ios网络应用编程

1、下载,添加Reachability类。

官网下载网址:

https://developer.apple.com/library/prerelease/ios/samplecode/Reachability/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007324-Intro-DontLinkElementID_2

获取下载的zip文件包找到里面的:reachability.m和reachability.h然后放进工程下:

2、

添加SystemConfiguration.framework框架

然后打开Main.storyborad界面设计文件,添加1个UILabel、1个UITextField和3个UIButton,并将它们摆放整齐,如图:

为了在程序钟访问界面上的文本框,可以将文本框绑定到siteField IBOulet属性;为了让程序能响应界面上3个按钮的点击事件,还需要为“测试”按钮的“Touch Up Inside”事件绑定testNetStatus事件处理方法,为“测试wifi”按钮的“Touch Up Inside”事件绑定testWifi事件处理方法,为了“测试3G/4G”按钮的“Touch Up Inside”事件绑定testInternet事件处理方法。

3、实现网络监听以及按钮测试的代码:

要点:

<1>如果是要自动监听手机联网的状态,就需要使用默认的通知中心对象[NSNotificationCenter defaultCenter]来通过监听

kReachabilityChangedNotification通知,并且当通知中心收到通知,就触发另一个自定义的成员方法的reachabilityChanged:方法。

源代码写法:

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(netChanged:) name:kReachabilityChangedNotification

object:nil];

<2>然后是不管是在上面创建通信中心之后,还是在为按钮组件的触发点击事件绑定的代码中,都要创建一个网络可达型对象(有两种):

-1-Reachability *reach = [Reachability reachabilityWithHostName:”www….”]

-2-Reachability *reach =[Reachability reachabilityForInternetConnection]

<3>然后通过Reachability对象获取当前网络状态:

[reach currentReachabilityStatus]

这个方法返回的就是Reachability声明中声明了的枚举三个枚举值:

typedef enum : NSInteger {

NotReachable = 0,

ReachableViaWiFi,

ReachableViaWWAN

} NetworkStatus;

也就是说这三个值代表着网络连接三种状态。

另外补充:

很奇怪的是:和《疯狂IOS讲义下》(8.1检测网络状态)提供的源代码不一样的地方是以上网络状态除了绑定组件监听事件,也就是自动监听网络状态的代码可以仅仅写在托管类AppDelegate.m中就可以运行,ViewController.m可以不写任何代码就可以运行。

但是自己新建的oc程序,然后按照同样的步骤压迫实现同样效果却需要额外的条件:

必须在ViewController.h声明一个私有的成员变量:

@property (nonatomic,strong) Reachability *conn;

然后在ViewController.m中用conn创建一个Reachability对象,并且

[conn startNotifier]。

然后才能在ViewController.m中或者AppDelegate.m中设置自动监听网络状态的代码。

----------------------------------------------------------------------------------------------------------------------------------------------------------

以上是本人半年前的学习积累,其中关于最后的"另外补充"其实就是很基本的原因,就是没有使用property的全局作用使得Reachability只能作用于某个方法内部,从而会在程序运行过程中就会出现无效的结果。

下面是本人在2016年2月25日更新的网络监听代码使用快速一览

----------------------------------------------------------------------------------------------------------------------------------------------------------


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络七层协议 五层模型 TCP连接 HTTP连接 socket套接字

socket&#xff08;套接字&#xff09;是通信的基石&#xff0c;是支持TCP/IP协议的网络通信的基本操作单元&#xff0c;包含进行网络通信必须的五种信息&#xff1a;连接使用的协议&#xff0c;本地主机的IP地址&#xff0c;本地进程的协议端口&#xff0c;远地主机的IP地址&a…

[vs2010 project] CppUnit快速入门

简介 测试是软件开发过程中极其重要的一环&#xff0c;详尽周密的测试能够减少软件BUG&#xff0c;提高软件品质。测试包括单元测试、系统测试等。其中单元测试是指针对软件功能单元所作的测试&#xff0c;这里的功能单元可以是一个类的属性或者方法&#xff0c;测试的目的是看…

[javascript|基本概念|Number]学习笔记

Number类型的值&#xff1a;整数/浮点数值 整数 十进制 e.g.: var intNum 50; 八进制 (严格模式下无效,解析错误)字面值首位必须是0,之后的数字序列为0&#xff5e;7 e.g.: var intNum 070; //解析为十进制56 (如果字面值数值超出了范围&#xff0c;前导0将被忽略&#xf…

[转]深入理解linux内核list_head

http://blog.chinaunix.net/uid-27122224-id-3277511.html 深入理解linux内核list_head的实现 2012-07-17 17:37:01 分类&#xff1a; LINUX 前言&#xff1a;在linux源代码中有个头文件为list.h。很多linux下的源代码都会使用这个头文件&#xff0c;它里面定义 了一个结构,以及…

xcode左侧不显示工程文件目录,提示NO Filter Results

解决办法&#xff1a; What solved was to go to Navigate > Reveal in Project Navigator . After this, the structure appeared again.

【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信

在工控测试系统中&#xff0c;经常需要使用到各类程控仪器&#xff0c;这些程控仪器通常具有GPIB、LAN、USB等硬件接口&#xff0c;计算机通过这些接口能够与其通信&#xff0c;从而实现自动测量、数据采集、数据分析和数据处理等操作。本文主要介绍如何与程控仪器通过GPIB接口…

标题在上边框中的html(fieldset标签)

<fieldset> <legend>标题</legend> 内容 </fieldset> 转载于:https://www.cnblogs.com/lswbk/p/4952820.html

移除项目中的CocoaPods

在项目中移除CocoaPods cocoaPods虽然很方便&#xff0c;但是我是真心的不喜欢用它&#xff0c;总是出错如果你觉得CocoaPods让你的项目出现了问题&#xff0c;不好用甚至是恶心&#xff0c;想将其从项目中彻底移除&#xff0c;也有方法&#xff1a; 1.删除工程文件夹下的Podf…

ShellExecute使用详解

有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂&#xff0c;比较少用。 2.WinExec主要运行EXE文件。如&#xff1a;WinExec(Notepad.exe Readme.txt, SW_SHOW); 3.ShellExecute不仅可以运行EXE文件&#xff0c;也可以运行…

javascript笔记整理(对象基础)

一、名词解释 1.基于对象&#xff08;一切皆对象&#xff0c;以对象的概念来编程&#xff09; 2.面向对象编程(Object Oriented Programming&#xff0c;OOP) A.对象(JavaScript 中的所有事物都是对象) B.对象的属性和行为 属性:用数据值来描述他的状态 行为:用来改变对象行为的…

java的安装和配置

JRE (JAVA Runtime Enviroment java运行环境),包括JVM(java虚拟机)和java程序所需的核心功能类库&#xff0c;如果只是运行java程序&#xff0c;只需安装JRE。 JDK &#xff08;Java Development Kit 开发工具包&#xff09;包括开发JAVA程序时所需的工具&#xff0c;包括JRE…

#if, #ifdef, #ifndef, #else, #elif, #endif的用法

#ifdef的用法 灵活使用#ifdef指示符&#xff0c;我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。 代码举例&#xff1a;新建define.cpp文件 &#xff03;include "iostream.h" int main() { #ifdef DEBUG cout<< "Beginning ex…

redhat 6.6 安装 (LVM)

http://www.cnblogs.com/kerrycode/p/4341960.html转载于:https://www.cnblogs.com/zengkefu/p/4954955.html

MFC对话框最小化到托盘

1、在资源中的Icon中导入一个自己喜欢的图标&#xff0c;ID命名为IDR_MAINFRAME&#xff0c;将先前的IDR_MAINFRAME的图标删除掉&#xff1b; 2、在自己的Dialog头文件中定义一个变量 NOTIFYICONDATA m_nid&#xff0c;关于该结构体的具体信息可以查阅MSDN&#xff1b; 3、添加…

Android acache读后感

今天了解到了一个android轻量级的开源缓存框架,(github&#xff1a;https://github.com/yangfuhai/ASimpleCache),花了一点时间研究了一下源代码&#xff0c;大概的思路就是每个缓存目录对应一个Acache类&#xff0c;通过mInstanceMap关联&#xff08;个人觉得这个主要是减少对…

continue break

块作用域 一个块或复合语句是用一对花括号&#xff08;"{}"&#xff09;括起来的任意数量的简单的java语句。块定义了变量的作用范围。 1、嵌套块是方法内的嵌套&#xff0c;不包括类的花括号。在嵌套块内的 变量是不可以重复定义的。 2、不允许重复定义的是局部变…

GetVersionEx 获取系统版本信息

转自&#xff1a;http://blog.csdn.net/yyingwei/article/details/8286658 最近在windows 8上获取系统版本信息需要调用系统API&#xff0c;于是用到了GetVersionEx。 首先看一看函数原型&#xff1a; [cpp] view plaincopy BOOL GetVersionEx(POSVERSIONINFO pVersionInformat…

popoverController(iPad)

一、设置尺寸 提示&#xff1a;不建议&#xff0c;像下面这样吧popover的宽度和高度写死。 1 //1.新建一个内容控制器2 YYMenuViewController *menuVc[[YYMenuViewController alloc]init];3 4 //2.新建一个popoverController&#xff0c;并设置其内容控制器5 s…

静态成员变量和非静态成员变量的对比

静态成员变量和非静态成员变量的对比 1、存储的数据 静态成员变量存储的是所有对象共享的数据 非静态成员变量存储的是每个对象特有的数据 2、存储位置 静态成员变量是随着类的加载在方法区的静态区开辟内存了 非静态成员变量是随着对象的创建再堆中开辟内存 3、调用方式 静态成…

c++的thread类(c++线程简单用法)

最近看了一个Thread类&#xff08;忘记在哪里看的了&#xff09;&#xff0c;感觉不错。 创建线程时线程对应的函数必须是类的静态成员&#xff0c;由于静态成员无法访问类的非静态成员&#xff0c;我从前都是把对象的指针作为参数传递给线程函数来避免这个问题&#xff0c;但是…