iOS中使用Reachability 检测网络

如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote)。那么你会使用到Reachability来实现网络检测。

  写本文的目的

  了解Reachability都能做什么

  检测3中网络环境

  2G/3G

  wifi

  无网络

  如何使用通知

  单个controller

  多个controller

  简单的功能:

  仅在wifi下使用

  Reachability简介

  Reachablity 是一个iOS下检测,iOS设备网络环境用的库。

  监视目标网络是否可用

  监视当前网络的连接方式

  监测连接方式的变更

  安装

  创建 network 工程(network是我创建的demo工程,附件中可以下载到)

  使用Cocoaspod安装依赖

  在项目中添加 SystemConfiguration.framework 库

  由于Reachability非常常用。直接将其加入到Supporting Files/networ-Prefix.pch中:

  #import <Reachability/Reachability.h>

  #import <Reachability/Reachability.h>

  如果你还不知道cocoaspod是什么,看这里:

  http://witcheryne.iteye.com/blog/1873221

  使用

  stackoverflow上有一篇回答,很好的解释了reachability的用法

  http://stackoverflow.com/questions/11177066/how-to-use-ios-reachability

  一般情况一个Reachability实例就ok了。

  一个Controller只需要一个Reachability

  Block方式使用


- (void)viewDidLoad

{

[super viewDidLoad];

DLog(@"开启 www.apple.com 的网络检测");

Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];

DLog(@"-- current status: %@", reach.currentReachabilityString);

// start the notifier which will cause the reachability object to retain itself!

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(reachabilityChanged:)

name:kReachabilityChangedNotification

object:nil];

reach.reachableBlock = ^(Reachability * reachability)

{

dispatch_async(dispatch_get_main_queue(), ^{

self.blockLabel.text = @"网络可用";

self.blockLabel.backgroundColor = [UIColor greenColor];

});

};

reach.unreachableBlock = ^(Reachability * reachability)

{

dispatch_async(dispatch_get_main_queue(), ^{

self.blockLabel.text = @"网络不可用";

self.blockLabel.backgroundColor = [UIColor redColor];

});

};

[reach startNotifier];

}

- (void)viewDidLoad

{

[super viewDidLoad];

DLog(@"开启 www.apple.com 的网络检测");

Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];

DLog(@"-- current status: %@", reach.currentReachabilityString);

// start the notifier which will cause the reachability object to retain itself!

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(reachabilityChanged:)

name:kReachabilityChangedNotification

object:nil];

reach.reachableBlock = ^(Reachability * reachability)

{

dispatch_async(dispatch_get_main_queue(), ^{

self.blockLabel.text = @"网络可用";

self.blockLabel.backgroundColor = [UIColor greenColor];

});

};

reach.unreachableBlock = ^(Reachability * reachability)

{

dispatch_async(dispatch_get_main_queue(), ^{

self.blockLabel.text = @"网络不可用";

self.blockLabel.backgroundColor = [UIColor redColor];

});

};

[reach startNotifier];

}

 使用notification的方式


- (void)viewDidLoad

{

[super viewDidLoad];

DLog(@"开启 www.apple.com 的网络检测");

Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];

DLog(@"-- current status: %@", reach.currentReachabilityString);

// start the notifier which will cause the reachability object to retain itself!

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(reachabilityChanged:)

name:kReachabilityChangedNotification

object:nil];

[reach startNotifier];

}

- (void) reachabilityChanged: (NSNotification*)note {

Reachability * reach = [note object];

if(![reach isReachable])

{

self.notificationLabel.text = @"网络不可用";

self.notificationLabel.backgroundColor = [UIColor redColor];

self.wifiOnlyLabel.backgroundColor = [UIColor redColor];

self.wwanOnlyLabel.backgroundColor = [UIColor redColor];

return;

}

self.notificationLabel.text = @"网络可用";

self.notificationLabel.backgroundColor = [UIColor greenColor];

if (reach.isReachableViaWiFi) {

self.wifiOnlyLabel.backgroundColor = [UIColor greenColor];

self.wifiOnlyLabel.text = @"当前通过wifi连接";

} else {

self.wifiOnlyLabel.backgroundColor = [UIColor redColor];

self.wifiOnlyLabel.text = @"wifi未开启,不能用";

}

if (reach.isReachableViaWWAN) {

self.wwanOnlyLabel.backgroundColor = [UIColor greenColor];

self.wwanOnlyLabel.text = @"当前通过2g or 3g连接";

} else {

self.wwanOnlyLabel.backgroundColor = [UIColor redColor];

self.wwanOnlyLabel.text = @"2g or 3g网络未使用";

}

}

- (void)viewDidLoad

{

[super viewDidLoad];

DLog(@"开启 www.apple.com 的网络检测");

Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];

DLog(@"-- current status: %@", reach.currentReachabilityString);

// start the notifier which will cause the reachability object to retain itself!

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(reachabilityChanged:)

name:kReachabilityChangedNotification

object:nil];

[reach startNotifier];

}

- (void) reachabilityChanged: (NSNotification*)note {

Reachability * reach = [note object];

if(![reach isReachable])

{

self.notificationLabel.text = @"网络不可用";

self.notificationLabel.backgroundColor = [UIColor redColor];

self.wifiOnlyLabel.backgroundColor = [UIColor redColor];

self.wwanOnlyLabel.backgroundColor = [UIColor redColor];

return;

}

self.notificationLabel.text = @"网络可用";

self.notificationLabel.backgroundColor = [UIColor greenColor];

if (reach.isReachableViaWiFi) {

self.wifiOnlyLabel.backgroundColor = [UIColor greenColor];

self.wifiOnlyLabel.text = @"当前通过wifi连接";

} else {

self.wifiOnlyLabel.backgroundColor = [UIColor redColor];

self.wifiOnlyLabel.text = @"wifi未开启,不能用";

}

if (reach.isReachableViaWWAN) {

self.wwanOnlyLabel.backgroundColor = [UIColor greenColor];

self.wwanOnlyLabel.text = @"当前通过2g or 3g连接";

} else {

self.wwanOnlyLabel.backgroundColor = [UIColor redColor];

self.wwanOnlyLabel.text = @"2g or 3g网络未使用";

}

}

  附件demo说明

  开启wifi状态

  关闭wifi的状态

  遗留问题

  如何在多个controller之前共用一个Reachability(附件demo中是一个controller一个Reachability实例)

  应该在什么使用停止Reachability的检测.

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-07-30 20:29:11

iOS中使用Reachability 检测网络的相关文章

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

前言:当应用程序需要访问网络的时候,它首先应该检查设备的网络状态,确认设备的网络环境及连接情况,并针对这些情况提醒用户做出相应的处理.最好能监听设备的网络状态的改变,当设备网络状态连接.断开时,程序也应该有相应的处理. 开发工具:xcode6.3.2 操作系统:OS X Yosemite10.10.4 学习来源:<疯狂IOS讲义(下)>中的ios网络应用编程 1.下载,添加Reachability类. 官网下载网址: https://developer.apple.com/library/pr

iOS中 UIWebView加载网络数据 技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载. 直奔核心: [objc] view plain copy #import "TechnologyDetailViewController.h"   #define kScreenWidth [UIScreen mainScreen].bounds.size.width   #define kScreenHeight [UIScreen mainScreen].bounds.size.height   @interface Techn

iOS中GET 和 POST 数据请求

 iOS中GET 和 POST 网络数据请求 同步请求和异步请求的差别:  1.同步请求,有主线程完成网路请求任务,在数据没有请求之前,用户的所有的交互事件应用都无法处理,会造成一种卡顿现象,影响用户体验  2.异步同步,系统默认开辟子线程完成网络请求任务,主线程依然会处理用户的交互事件,此时不会出现卡顿,一旦开辟子线程就会消耗资源(内存),此时就是拿空间换时间 先分析下整体思路: 1.下面准备一个公用的model数据数据模型: Business.h #import <Foundation/Fo

ios开发-ios如何检测网络并尝试连接获取数据

问题描述 ios如何检测网络并尝试连接获取数据 当网络断开时,不断检测网络的连接状态,再连接网络,刷新数据?怎么实现?我用NSNotificationCenter发送通知的时候,会使内存激增,因为不断的在尝试连接...请问怎么处理? 解决方案 下载个那个官方的reachability检测有网没网试试,如果有网的话执行刷新数据的方法 解决方案二: iOS 从网络获取数据

iOS网络编程-iOS中Socket编程介绍

使用Socket进行C/S结构编程,连接过程   服务器端监听某个端口是否有连接请求.服务器端程序处于堵塞状态,直到客户端向服务器端发出连接请求,服务器端接受请求程序才能向下运行.一旦连接建立起来,通过Socket可以获得输入输出流对象.借助于输入输出流对象就可以实现与客户端的通讯,最后不要忘记关闭Socket和释放一些资源(包括:关闭输入输出流). 客户端流程是先指定要通讯的服务器IP地址.端口和采用的传输协议(TCP或UDP),向服务器发出连接请求,服务器有应答请求之后,就会建立连接.之后与

iOS网络编程入门:iOS中的Socket编程

使用Socket进行C/S结构编程,连接过程 服 务器端监听某个端口是否有连接请求.服务器端程序处于堵塞状态,直到客户端向服务器端发出连接请求,服务器端接受请求程序才能向下运行.一旦连接建立起 来,通过Socket可以获得输入输出流对象.借助于输入输出流对象就可以实现与客户端的通讯,最后不要忘记关闭Socket和释放一些资源(包括:关闭 输入输出流). 客户端流程是先指定要通讯的服务器IP地址.端口和采用的传输协议(TCP或UDP),向服务器发出连接请求,服务器有应答请求之后,就会建立连接.之后

使用 Reachability 获取网络状态

Reachability source https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html reachability 为苹果官方demo提供的一个检测网络状态的代码,下载源码后本人对其进行了修改,修改后源码: reachability.h  +  reachability.m #import <Foundation/Foundation.h> #import <Sy

IOS中Json解析实例方法详解(四种方法)_IOS

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此"http://www.bejson.com/"网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的iOS版本,可以使用第三方库来解析Json. 本文将介绍Tou

iOS 中的 21 种设计模式

iOS 中的 21 种设计模式 对象创建原型(Prototype) 使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象. 1 2 NSArray *array = [[NSArray alloc] initWithObjects:@1, nil]; NSArray *array2 = array.copy; array 就是原型了,array2 以 array 为原型,通过 copy 操作创建了 array2. 当创建的实例非常复杂且耗时,或者新实例和已存在的实例值相同,使用原型模式