zoukankan      html  css  js  c++  java
  • 检查网络状态

    当应用程序需要访问网络时,它首先应该检查设备的网络状态,确认设备的网络环境及连接情况,并针对这些情况提醒用户做出相应的处理。最好能监听设备的网络状态的改变,当设备网络状态连接、断开时,程序也应该有相应的处理。
      工欲善其事必先利器,在检查设备的网络状态前,我们要先实现两个步骤:
    1. 下载,添加Reachability类。
        下载Reachability.zip压缩包,最新的版本为V3.5,解压该压缩包会得到一个Xcode项目,其实关键是得到改项目的Reachability.h和 Reachability.m文件,并把它们添加到项目中。
          2. 为项目添加SystemConfiguration.framework框架。
         添加方法:
    • 1)   选中项目名称
    • 2)选中TARGETS
    • 3)选中Build Phases
    • 4)在Link Binary With Libraries中添加。
      
      将Reachability.h和 Reachability.m文件添加到项目中。
      注意:如果Reachability不是3.0以上的版本,而是Reachability 2.x版本,它是不支持ARC的。本项目已经启用了ARC,早期版本的Reachability类并不支持ARC,因此需要手动设置该类禁用ARC。
      打开Main.storyboard界面设计文件,向该文件中添加1个UILabel,1个UITextFieldhe 3个UIButton,如下图所示(^_^不好意思,最下面2个UILabel是打广告的)。为了在程序中访问界面上的文本框,将文本框绑定到siteField IBOutlet属性。为了让程序能相应界面上3个按钮的点击事件,将“测试”按钮的“Touch UP Inside”事件绑定testNetStatus:事件处理方法,为“测试WIFI”按钮的“Touch UP Inside”事件绑定testWifi:事件处理方法,为“测试3G/4G”按钮的“Touch UP Inside”事件绑定testInternet:事件处理方法。
      
     
      接下来编辑该示例的视图控制器类,该视图控制器类的实现部分主要依靠Reachability类来检测网络状态。
      核心实现代码:
     
    复制代码
     1 //  ViewController.m
     2 //  NetWorkDemo
     3 //
     4 //  Copyright (c) 2014年 MiracleHe. All rights reserved.
     5 //
     6 
     7 #import "ViewController.h"
     8 #import "Reachability.h"
     9 
    10 @interface ViewController ()
    11 
    12 @end
    13 
    14 @implementation ViewController
    15 @synthesize siteField;
    16 
    17 - (void)viewDidLoad
    18 {
    19     [super viewDidLoad];
    20     // Do any additional setup after loading the view, typically from a nib.
    21 }
    22 - (IBAction)testNetStatus:(id)sender {
    23     NSString *site = self.siteField.text;
    24     Reachability *reach = [Reachability reachabilityWithHostName: site];
    25     switch ([reach currentReachabilityStatus]) {
    26         case NotReachable:
    27             [self showAlert:[NSString stringWithFormat:@"不能访问%@", site]];
    28             break;
    29         
    30         case ReachableViaWWAN:
    31             [self showAlert:[NSString stringWithFormat:@"使用3G/4G网络访问%@", site]];
    32             break;
    33             
    34         case ReachableViaWiFi:
    35             [self showAlert:[NSString stringWithFormat:@"使用Wifi网络访问%@", site]];
    36             break;
    37     }
    38     
    39 }
    40 
    41 
    42 - (IBAction)testWifi:(id)sender {
    43     if ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable) {
    44         [self showAlert:@"wifi网络已经连接"];
    45     }else{
    46         [self showAlert:@"wifi网络不可用。"];
    47     }
    48 }
    49 
    50 
    51 - (IBAction)testInternet:(id)sender {
    52     if ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable) {
    53         [self showAlert:@"3G/4G网络已经连接"];
    54     }else{
    55         [self showAlert:@"3G/4G网络不可用"];
    56     }
    57 }
    58 
    59 -(void) showAlert:(NSString*) msg
    60 {
    61     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"网络状态" message:msg delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
    62     [alert show];
    63     
    64 }
    65 
    66 -(BOOL)textFieldShouldReturn:(UITextField *)textField
    67 {
    68     [siteField resignFirstResponder];
    69     return YES;
    70     
    71 }
    72 
    73 - (void)didReceiveMemoryWarning
    74 {
    75     [super didReceiveMemoryWarning];
    76     // Dispose of any resources that can be recreated.
    77 }
    78 
    79 @end
    复制代码
     
      上面程序首先调用了Reachability类的reachabilityWithHostName:类方法来获取Reachability对象,然后调用该对象的currentReachabilityStatus方法来获取访问指定站点的方式,该方法返回NetworkStatus枚举值,该枚举值有如下3个:
    typedef enum{
        NotReachable = 0,     //无连接
        ReachableViaWiFi,     //使用3G/4G网络
        ReachableViaWWAN      //使用WiFi网络
    }NetworkStatus;
      上面程序对Reachability的currentReachabilityStatus方法返回值进行判断,这样即可获取该应用访问网络的状态和方式。
      编译、运行该程序,如对www.cnblogs.com进行“测试”,效果如下图。
      如果访问的站点本身不存在,即时设备的网络处于连接状态,Reachability对象的currentReachabilityStatus方法也将返回NotReachable。
      如果程序仅需要测试设备的WiFi或3G/4G网络是否连接,则可先调用Reachability类的reachabilityForLocalWiFi或reachabilityForInternetConnection类方法获取Reachability对象,然后调用该Reachability对象的currentReachabilityStatus方法获取网络连接状态,如果网络连接状态返回NotReachable,则表明这种类型的网络暂未连接。
     
      除了直接检测网络连接状态之外,有时候程序还需要监听网络状态的改变。当网络断开连接时,提醒用户,网络连接已经断开,应用可能需要暂停;当网络重新连接时,再次提醒用户,应用可以继续运行。程序获取Reachability对象之后,调用Reachability对象的startNotifier方法即可开启该对象的被监听状态——当Reachability的连接状态发生改变时,该对象将会发送一个kReachabilityChangedNotification通知给默认的通知中心,因此程序只要使用默认的通知中心监听该通知即可。
      为了监听网络状态的改变,在应用程序委托类(AppDelegate.m)的application: didFinishLaunchingWithOptions:方法中增加如下代码:
    复制代码
        //使用通知中心监听kReachabilityChangedNotification通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
        //获取访问指定站点的Reachability对象
        Reachability *reach = [Reachability reachabilityWithHostName:@"www.cnblogs.com"];
        //让Reachability对象开启被监听状态
        [reach startNotifier];
    复制代码
      上面的代码使用默认的通知中心检测kReachabilityChangedNotification通知,这意味着当Reachability的连接状态发生改变时,默认的通知中心就会收到该通知,从而触发应用程序委托类的reachabilityChanged:方法,还需要在应用程序委托类中定义如下方法:
    复制代码
    - (void) reachabilityChanged:(NSNotification*) note
    {
        //通过通知对象获取被监听的Reachability对象
        Reachability *curReach = [note object];
        //获取Reachability对象的网络状态
        NetworkStatus status = [curReach currentReachabilityStatus];
        if (status == NotReachable) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提醒" message:@"不能访问www.cnblogs.com" delegate:nil cancelButtonTitle:@"YES" otherButtonTitles: nil];
            [alert show];
        }
    }
    复制代码
       reachabilityChanged:会判断该Reachability对象的网络连接状态,当该对象的网络连接状态处于NotReachable时,程序会使用UIAlertView进行提醒。 
       希望上面的总结能对正在学习iOS开发的小伙伴有一点点帮助,假如觉得还不错,烦请小伙伴不要忘记右下角的点“推荐”哦
  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    108. Convert Sorted Array to Binary Search Tree
    111. Minimum Depth of Binary Tree
    49. Group Anagrams
    使用MALTAB标定实践记录
    442. Find All Duplicates in an Array
    522. Longest Uncommon Subsequence II
    354. Russian Doll Envelopes
    opencv 小任务3 灰度直方图
    opencv 小任务2 灰度
  • 原文地址:https://www.cnblogs.com/wangxiaorui/p/5029809.html
Copyright © 2011-2022 走看看