5.1 网络基础->1.4 网络状态监控

作者: 蓝田_Loto | 来源:发表于2016-04-13 17:00 被阅读188次

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正。

    1.4.1 网络状态监控-Reachability

    在网络应用中,需要对用户设备的网络状态进行实时监控,目的是让用户了解自己的网络状态,防止一些误会(比如怪应用无能)

    根据用户的网络状态进行智能处理,节省用户流量,提高用户体验

    - WIFI、3G网络:自动下载高清图片
    - 低速网络:只下载缩略图
    - 没有网络:只显示离线的缓存数据
    

    Reachability的使用步骤:

    (1)添加框架SystemConfiguration.framework

    (2)添加源代码

    苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态
    

    https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip

    (3)包含头文件

    #import "Reachability.h"
    

    Reachability常见方法

    1.主动监测监测网络状态

    // 是否WIFI
    + (BOOL)isEnableWIFI {
        return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
    }
    
    // 是否3G
    + (BOOL)isEnable3G {
        return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
    }
    

    2.监控网络状态

    1> 监听通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];
    
    2> 开始监听网络状态
    // 获得Reachability对象
    self.reachability = [Reachability reachabilityForInternetConnection];
    // 开始监控网络
    [self.reachability startNotifier];
    
    3> 移除监听
    [self.reachability stopNotifier];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    

    代码示例:
    #import "Reachability.h"
    #import "ViewController.h"
    
    @interface ViewController ()
    @property(nonatomic, strong) Reachability *reachability; //监控网络
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
      [super viewDidLoad];
    
      [self getNetworkStatus];
    
      // 监听网络状态发生改变的通知
      [[NSNotificationCenter defaultCenter]
          addObserver:self
             selector:@selector(getNetworkStatus)
                 name:kReachabilityChangedNotification
               object:nil];
    
      // 获得Reachability对象
      self.reachability = [Reachability reachabilityForInternetConnection];
      // 开始监控网络(一旦网络状态发生改变,就会发出通知kReachabilityChangedNotification)
      [self.reachability startNotifier];
    }
    
    // 获取现在的网络状态
    - (void)getNetworkStatus {
      if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus !=
          NotReachable) {
        NSLog(@"是wifi");
      } else if ([Reachability reachabilityForInternetConnection]
                     .currentReachabilityStatus != NotReachable) {
        NSLog(@"是手机自带网络");
      } else {
        NSLog(@"网络有问题");
      }
    }
    
    // 移除通知
    - (void)dealloc {
    
      [[NSNotificationCenter defaultCenter] removeObserver:self];
    
      [self.reachability stopNotifier];
      self.reachability = nil;
    }
    
    - (void)didReceiveMemoryWarning {
      [super didReceiveMemoryWarning];
      // Dispose of any resources that can be recreated.
    }
    
    @end
    


    1.4.2 网络状态监控-AFN框架

    typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
      AFNetworkReachabilityStatusUnknown = -1,         // 未知网络
      AFNetworkReachabilityStatusNotReachable = 0,     // 无法联网
      AFNetworkReachabilityStatusReachableViaWWAN = 1, // 手机自带网络
      AFNetworkReachabilityStatusReachableViaWiFi = 2, // WIFI
    };
    

    代码示例:

    #import "ViewController.h"
    #import <AFNetworking.h>
    
    @interface ViewController ()
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
      [super viewDidLoad];
      // 开始网络监控(获得网络监控的管理者)
      AFNetworkReachabilityManager *mgr =
          [AFNetworkReachabilityManager sharedManager];
    
      // 设置网络状态改变后的处理
      [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    
        // 当网络状态改变了, 就会调用这个block
        switch (status) {
        case AFNetworkReachabilityStatusUnknown: // 未知网络
          NSLog(@"未知网络");
          break;
    
        case AFNetworkReachabilityStatusNotReachable: // 没有网络(断网)
          NSLog(@"没有网络(断网)");
          break;
    
        case AFNetworkReachabilityStatusReachableViaWWAN: // 手机自带网络
          NSLog(@"手机自带网络");
          break;
    
        case AFNetworkReachabilityStatusReachableViaWiFi: // WIFI
          NSLog(@"WIFI");
          break;
        }
      }];
    
      // 开始监控
      [mgr startMonitoring];
    
      // 拿到当前网络状态
      // mgr.networkReachabilityStatus;
    }
    
    - (void)didReceiveMemoryWarning {
      [super didReceiveMemoryWarning];
      // Dispose of any resources that can be recreated.
    }
    
    @end
    



    作者:蓝田(Loto)
    出处: 简书

    如果你觉得本篇文章对你有所帮助,请点击文章末尾下方“喜欢”
    如有疑问,请通过以下方式交流:
    评论区回复微信(加好友请注明“简书+称呼”)发送邮件shorfng@126.com



    本文版权归作者和本网站共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

    相关文章

      网友评论

        本文标题:5.1 网络基础->1.4 网络状态监控

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