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

如果你想在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中:

C代码  

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

C代码  

  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的方式

C代码  

  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 检测网络

时间: 2025-01-01 11:20:55

【开发记录】iOS中使用 Reachability 检测网络的相关文章

iOS中使用 Reachability 检测网络

iOS中使用 Reachability 检测网络 内容提示:下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测.   写本文的目的 了解Reachability都能做什么 检测3中网络环境 2G/3G wifi 无网络 如何使用通知 单个controller 多个controller 简单的功能: 仅在wifi下使用 Reachability简介 Reachablity 是一个iOS下... 如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder)

iOS中使用 Reachability 检测网络区分手机网络类型 WiFi 和2 3 4 G

如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测. 写本文的目的 了解Reachability都能做什么 检测3中网络环境 2G/3G wifi 无网络 如何使用通知 单个controller 多个controller 简单的功能: 仅在wifi下使用 Reachability简介 Reachablity 是一个iOS下检测,iOS设备网络环境用的库. 监视目标网络是否可

Reachability检测网络状态

在现在的项目开发当中,监测网络是否正常非常有必要的.Reachability检测网络可以检测WiFi 3G 无线局域网 使用Reachability 下载Reachability,将Reachability添加到项目当中,在要检测网的类当中添加 #import <Reachability.h> //  开启网络状态的监听 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(reachabilityCh

iOS中使用block进行网络请求回调

iOS中使用block进行网络请求回调 HttpRequest.h // // HttpRequest.h // UseBlockCallBack // // Created by Michael on 2/13/14. // Copyright (c) 2014 EIMS. All rights reserved. // #import <Foundation/Foundation.h> typedef void (^FinishBlock)(NSString *dataString); @

iOS开发笔记--iOS中的多线程

摘要 本文主要介绍iOS开发中的三种多线程技术:NSThread, NSOperation/NSOperationQueue, GCD.以及在多线程编程中的注意点和小技巧. 多线程 NSThread NSOperation/NSOperationQueue GCD 目录[-] iOS中的多线程 iOS的三种多线程技术特点: GCD基本思想 队列: 操作: 不同队列中嵌套同步操作dispatch_sync的结果: 同步操作dispatch_sync的应用场景: GCD优点: GCD队列: NSOp

iOS开发笔记--iOS中的触摸事件和手势处理

iOS中的事件可以分为三大类:原文:http://my.oschina.net/aofe/blog/268749 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象". UIApplication,UIViewController,UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. UIRespon

iOS开发:iOS中的多控制器管理

iOS中的控制器有三种创建方式: 1.通过storyboard创建 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Apply" bundle:nil]; SchemeViewController *schemeVC = [storyboard instantiateViewControllerWithIdentifier:@"SchemeViewController"]; 2.指定xib文

常用三方,Reachability 检测网络连接

常用三方 Reachability 检 测网络连接 用来检查网络连接是否可用:包括WIFI和 WWAN(3G/EDGE/CDMA等)两种工作模式. 可以从Apple网站下载到: http://developer.apple.com/library/ios/#samplecode/Reachab ility/History/History.html#//apple_ref/doc/uid/DTS40007324-R evisionHistory-DontLinkElementID_1. 现在有更好

Reachability 检测网络状态

-(void)viewWillAppear:(BOOL)animated { [IOSExcept JudgeNetwork];//联网 NSLog(@"检查网络 请稍后....."); self.backImage.hidden = YES;//隐藏背景图片 if (IOS.isDayMode == 1) { [self.backImage setImage:[UIImage imageNamed:@"back_day"]]; } else { [self.bac