zoukankan      html  css  js  c++  java
  • iOS中使用 Reachability 检测网络


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

     

    如果你想在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
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    - (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的方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    - (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的状态


     

    遗留问题

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

    转:http://www.rrzhai.com/p/7396

  • 相关阅读:
    select、poll和epoll
    Linux 常用命令之文件和目录
    SmartPlant Review 帮助文档机翻做培训手册
    SmartPlant Foundation 基础教程 3.4 菜单栏
    SmartPlant Foundation 基础教程 3.3 标题栏
    SmartPlant Foundation 基础教程 3.2 界面布局
    SmartPlant Foundation 基础教程 3.1 DTC登陆界面
    SmartPlant Foundation 基础教程 1.4 SPF架构
    SmartPlant Foundation 基础教程 1.3 SPF其他功能
    SmartPlant Foundation 基础教程 1.2 SPF集成设计功能
  • 原文地址:https://www.cnblogs.com/ygm900/p/3759988.html
Copyright © 2011-2022 走看看