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

写本文的目的

  • 了解Reachability都能做什么
  • 检测3中网络环境
    • 2G/3G
    • wifi
    • 无网络
  • 如何使用通知
    • 单个controller
    • 多个controller
  • 简单的功能:
    • 仅在wifi下使用

Reachability简介

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

  • 监视目标网络是否可用
  • 监视当前网络的连接方式
  • 监测连接方式的变更

苹果官方提供的Doc

http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html

Github上的文档

https://github.com/tonymillion/Reachability

安装

  1. 创建 network 工程(network是我创建的demo工程,附件中可以下载到)
  2. 使用Cocoaspod安装依赖
  3. 在项目中添加 SystemConfiguration.framework 库

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

  1. #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方式使用

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. DLog(@"开启 www.apple.com 的网络检测");
  5. Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];
  6. DLog(@"-- current status: %@", reach.currentReachabilityString);
  7. // start the notifier which will cause the reachability object to retain itself!
  8. [[NSNotificationCenter defaultCenter] addObserver:self
  9. selector:@selector(reachabilityChanged:)
  10. name:kReachabilityChangedNotification
  11. object:nil];
  12. reach.reachableBlock = ^(Reachability * reachability)
  13. {
  14. dispatch_async(dispatch_get_main_queue(), ^{
  15. self.blockLabel.text = @"网络可用";
  16. self.blockLabel.backgroundColor = [UIColor greenColor];
  17. });
  18. };
  19. reach.unreachableBlock = ^(Reachability * reachability)
  20. {
  21. dispatch_async(dispatch_get_main_queue(), ^{
  22. self.blockLabel.text = @"网络不可用";
  23. self.blockLabel.backgroundColor = [UIColor redColor];
  24. });
  25. };
  26. [reach startNotifier];
  27. }

使用notification的方式

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. DLog(@"开启 www.apple.com 的网络检测");
  5. Reachability* reach = [Reachability reachabilityWithHostname:@"www.apple.com"];
  6. DLog(@"-- current status: %@", reach.currentReachabilityString);
  7. // start the notifier which will cause the reachability object to retain itself!
  8. [[NSNotificationCenter defaultCenter] addObserver:self
  9. selector:@selector(reachabilityChanged:)
  10. name:kReachabilityChangedNotification
  11. object:nil];
  12. [reach startNotifier];
  13. }
  14. - (void) reachabilityChanged: (NSNotification*)note {
  15. Reachability * reach = [note object];
  16. if(![reach isReachable])
  17. {
  18. self.notificationLabel.text = @"网络不可用";
  19. self.notificationLabel.backgroundColor = [UIColor redColor];
  20. self.wifiOnlyLabel.backgroundColor = [UIColor redColor];
  21. self.wwanOnlyLabel.backgroundColor = [UIColor redColor];
  22. return;
  23. }
  24. self.notificationLabel.text = @"网络可用";
  25. self.notificationLabel.backgroundColor = [UIColor greenColor];
  26. if (reach.isReachableViaWiFi) {
  27. self.wifiOnlyLabel.backgroundColor = [UIColor greenColor];
  28. self.wifiOnlyLabel.text = @"当前通过wifi连接";
  29. } else {
  30. self.wifiOnlyLabel.backgroundColor = [UIColor redColor];
  31. self.wifiOnlyLabel.text = @"wifi未开启,不能用";
  32. }
  33. if (reach.isReachableViaWWAN) {
  34. self.wwanOnlyLabel.backgroundColor = [UIColor greenColor];
  35. self.wwanOnlyLabel.text = @"当前通过2g or 3g连接";
  36. } else {
  37. self.wwanOnlyLabel.backgroundColor = [UIColor redColor];
  38. self.wwanOnlyLabel.text = @"2g or 3g网络未使用";
  39. }
  40. }

附件demo说明

开启wifi状态

关闭wifi的状态

遗留问题

    1. 如何在多个controller之前共用一个Reachability(附件demo中是一个controller一个Reachability实例)
    2. 应该在什么使用停止Reachability的检测.

iOS中使用 Reachability 检测网络区分手机网络类型 WiFi 和2 3 4 G的更多相关文章

  1. iOS中使用 Reachability 检测网络

    iOS中使用 Reachability 检测网络 内容提示:下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测.   写本文的目的 了解Reachability都 ...

  2. 【开发记录】iOS中使用 Reachability 检测网络

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

  3. SDWebImage -- 封装 (网络状态检测,是否打开手机网络下下载高清图设置)

    对SDWebImage 进行封装,为了更好的节省用户手机流量,并保证在移动网络下也展示高清图,对使用SDWebImage 下载图片之前进行逻辑处理,根据本地缓存中是否有缓存原始的图片,用户是否打开移动 ...

  4. iOS 中如何判断当前是2G/3G/4G/5G/WiFi

    5G 什么的,还得等苹果API更新啊,不过将来还是这个处理过程就是了. 关于判断当前的网络环境是2G/3G/4G,这个问题以前经常看到,最近在一工程里看到了如果判断的API.而在撸WebRTC音视频通 ...

  5. wp检测是否是手机网络还是wifi网络

    原文发布时间为:2013-06-22 -- 来源于本人的百度文章 [由搬家工具导入] ),newNameResolutionCallback(handle =>{NetworkInterface ...

  6. Android监听手机网络变化

    Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...

  7. iOS网络4——Reachability检测网络状态

    一.整体介绍 前面已经介绍了网络访问的NSURLSession.NSURLConnection,还有网页加载有关的webview,基本满足通常的网络相关的开发. 其实在网络开发中还有比较常用的就是网络 ...

  8. 李洪强iOS开发之使用 Reachability 检测网络

    1.iOS平台是按照一直有网络连接的思路来设计的,开发者利用这一特点创造了很多优秀的第三方应用. 大多数的iOS应用都需要联网,甚至有些应用严重依赖网络,没有网络就无法正常工作. 2.在你的应用尝试通 ...

  9. iOS Reachability检测网络状态

    一.整体介绍 前面已经介绍了网络访问的NSURLSession.NSURLConnection,还有网页加载有关的webview,基本满足通常的网络相关的开发.其实在网络开发中还有比较常用的就是网络状 ...

随机推荐

  1. apache 安装及配置

    近期想用apache运行网站,在网上查询windows 版本的中文说明文档有特别少,所以将学习到的在这里做个笔记,以便日后学习以及大家相互交流. 相关文档:http://httpd.apache.or ...

  2. Objective-C Runtime(二)消息传递机制

    在对象上调用方法是包括Objective-C的众多语言都具备的功能.但在Objective-C中,这个术语叫『传递消息』(pass a message).『消息』有「名称」(name)或「选择子」(s ...

  3. codevs1258关路灯

    传送门 1258 关路灯  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master   题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他 ...

  4. Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

  5. 解决IIS中部署WCF时,访问.svc文件的404错误问题

    如果你直接在IIS 7中配置WCF,访问.svc文件时会出现404错误.解决方法,以管理员身份进入命令行模式,运行:"%windir%\Microsoft.NET\Framework\v3. ...

  6. Native App、Web App 还是Hybrid App?(转)

    一.什么是Native App? Native App即原生应用,即我们一般所称的客户端,是针对不同手机系统单独开发的本地应用,如需使用需要先下载到手机并安装,下载Native App的最常见方法是访 ...

  7. 如何升级xcode 中的cocos2dx 到v2.2.2以上版本

    每次升级cocos2dx版本都觉得不知道怎么弄才行. 这次升级到v2.2.2版本又花了我不少时间.因此在这里分享一下,以后也有地方可以查询. 1. 到http://cocos2d-x.org/ 下载最 ...

  8. UVa 1611 Crane (构造+贪心)

    题意:给定一个序列,让你经过不超过9的6次方次操作,变成一个有序的,操作只有在一个连续区间,交换前一半和后一半. 析:这是一个构造题,我们可以对第 i 个位置找 i 在哪,假设 i  在pos 位置, ...

  9. DPWL具关劳过农派广决建

    圆来压平便几从细样听二现当群世权半几影志土济长即江装家革候它准原打边社而从越何从式万难因造化阶求电么才论须指直很已毛有济做把活半或须白安共角争斗也重代只因识九少�

  10. RxJava入门之路(二)

    收集一下能够避免背压的运算符 sample(500, TimeUnit.MILLISECONDS)  定期收集数据,并发送最后一个 throttleFirst(500,TimeUnit.MILLISE ...