美文网首页
监测网络状态

监测网络状态

作者: SunshineBrother | 来源:发表于2017-01-20 09:08 被阅读48次

    在网络应用中,有的时候需要对用户设备的网络状态进行实时监控,有两个目的:
    (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能)
    (2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体验
      WIFI网络:自动下载高清图片
      4G/3G网络:只下载缩略图
      没有网络:只显示离线的缓存数据

    常用的有以下两种方法:
      (1)、使用苹果观法提供的检测iOS设备网络环境用的库 Reachablity
      (2)、使用AFN框架中的AFNetworkReachabilityManager来监听网络状态的改变
    一、苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态
    使用之前请从Apple网站下载示例:http://xiazai.jb51.net/201608/yuanma/Reachability(jb51.net).rar
    然后将Reachability.h 和 Reachability.m 加到自己的项目中,并引用 SystemConfiguration.framework,就可以使用了。
    Reachability 中定义了3种网络状态:

    typedef enum : NSInteger {
     
      NotReachable = 0, //无连接
      ReachableViaWiFi, //使用3G/GPRS网络
      ReachableViaWWAN //使用WiFi网络
     
    } NetworkStatus;
    
    

    我们可以在程序启动以后启动实时监测

    // AppDelegate.m
     
     
    @interface AppDelegate ()
     
    @property (nonatomic, strong) Reachability *reachability;
     
    @end
     
    // 程序启动器,启动网络监视
    - (void)applicationDidFinishLaunching:(UIApplication *)application {
     
      // 设置网络检测的站点
        NSString *remoteHostName = @"www.apple.com";
      self.reachability = [Reachability reachabilityWithHostName:remoteHostName];
      // 设置网络状态变化时的通知函数
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)
                           name:@"kNetworkReachabilityChangedNotification" object:nil];
      [self updateStatus];
    }
     
     
    - (void)reachabilityStatusChange:(NSNotification *)notification
    {
      Reachability* curReach = [notification object];
      NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
      [self updateInterfaceWithReachability:curReach];
    }
     
    - (void)updateInterfaceWithReachability:(Reachability *)reachability
    {
      if (reachability == _reachability)
      {
        NetworkStatus netStatus = [reachability currentReachabilityStatus];
        switch (netStatus)
        {
          case NotReachable:   {
            NSLog(@"没有网络!");
            break;
          }
          case ReachableViaWWAN: {
            NSLog(@"4G/3G");
            break;
          }
          case ReachableViaWiFi: {
            NSLog(@"WiFi");
            break;
          }
        }
      }
    }
     
     
    - (void)dealloc
    {
       [_reachability stopNotifier];
      [[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
    } 
    

    二、使用AFN框架中的AFNetworkReachabilityManager来监听网络状态的改变

    //使用AFN框架来检测网络状态的改变
    -(void)AFNReachability
    {
      //1.创建网络监听管理者
      AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
     
      //2.监听网络状态的改变
      /*
       AFNetworkReachabilityStatusUnknown     = 未知
       AFNetworkReachabilityStatusNotReachable   = 没有网络
       AFNetworkReachabilityStatusReachableViaWWAN = 3G
       AFNetworkReachabilityStatusReachableViaWiFi = WIFI
       */
      [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
          case AFNetworkReachabilityStatusUnknown:
            NSLog(@"未知");
            break;
          case AFNetworkReachabilityStatusNotReachable:
            NSLog(@"没有网络");
            break;
          case AFNetworkReachabilityStatusReachableViaWWAN:
            NSLog(@"3G");
            break;
          case AFNetworkReachabilityStatusReachableViaWiFi:
            NSLog(@"WIFI");
            break;
     
          default:
            break;
        }
      }];
     
      //3.开始监听
      [manager startMonitoring];
    }
    

    相关文章

      网友评论

          本文标题:监测网络状态

          本文链接:https://www.haomeiwen.com/subject/nsswbttx.html