zoukankan      html  css  js  c++  java
  • iOS开发系列-网络状态监控

    概述

    在网络应用中,需要对用户设别的网络状态进行实时监控,可以让用户了解自己的网络状态出现网络问题提示用户。
    一般在网络状态不好的场景下需要做一些处理比如:

    • WIFT/3G/4G网络:自动下载高清图。网络不好的场景下载缩略图。
    • 没有网络显示离线的缓存数据

    网络监控

    方案一

    苹果官方的Reachability示例程序。
    下载地址 https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip

    Reachability获取当前的网络

    Reachability *reachability[Reachability reachabilityForInternetConnection];
    NetworkStatus netStatus = [reachability currentReachabilityStatus];
    switch (netStatus) {
            case NotReachable:
                NSLog(@"----------没有网络");
                break;
            case ReachableViaWWAN:
                NSLog(@"----------蜂窝网络");
                break;
            case ReachableViaWiFi:
                NSLog(@"----------连接wifi");
                break;
            default:
    

    Reachability监听网络

    Reachability监听网络是通过通知kReachabilityChangedNotification的方式来通知网络的改变。在监听的过程中需要保证Reachability实例不能释放。

    // 监听通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
    // 开始监听
    [self.reachability startNotifier];
    
    /*!
     * Called by Reachability whenever status changes.
     */
    - (void) reachabilityChanged:(NSNotification *)note
    {
        Reachability* curReach = [note object];
        NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
        
        // 自己获取网络
        NetworkStatus netStatus = [curReach currentReachabilityStatus];
        switch (netStatus) {
            case NotReachable:
                NSLog(@"----------网络有问题");
                break;
            case ReachableViaWWAN:
                NSLog(@"----------蜂窝网络");
                break;
            case ReachableViaWiFi:
                NSLog(@"----------连接wifi");
                break;
            default:
                break;
        }
        
    }
    

    方案二

    使用AFNetworking框架中的AFNetworkReachabilityManager。AFNetworkReachabilityManager也是基于苹果的Reachability实现的。

    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    // 设置开始监听在设置setReachabilityStatusChangeBlock之前
    [manager startMonitoring];
    // 设置网络监听
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        /**
         typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
         AFNetworkReachabilityStatusUnknown          = -1, // 为止网络
         AFNetworkReachabilityStatusNotReachable     = 0, // 没有联网
         AFNetworkReachabilityStatusReachableViaWWAN = 1, // 手机自带网络
         AFNetworkReachabilityStatusReachableViaWiFi = 2, // WIFI
         };
         */
        NSLog(@"--------------%ld", status);
    }];
    

    AFNetworkReachabilityManager被AFN框架内部强引用者,不需要外部再次强引用。

    另外AFNetworkReachabilityManager提供了一一些获取网络状态的类方法

    @property (readonly, nonatomic, assign, getter = isReachable) BOOL reachable;
    @property (readonly, nonatomic, assign, getter = isReachableViaWWAN) BOOL reachableViaWWAN;
    @property (readonly, nonatomic, assign, getter = isReachableViaWiFi) BOOL reachableViaWiFi;
    
  • 相关阅读:
    洛谷1280 尼克的任务
    洛谷1140 相似基因
    洛谷1133 教主的花园
    洛谷1130 红牌
    洛谷1122 最大子树和
    洛谷1103 书本整理
    洛谷1077 摆花
    【数学】数学知识习题小结(模板)
    python中的深拷贝和浅拷贝(面试题二)
    python中的深拷贝和浅拷贝(面试题)
  • 原文地址:https://www.cnblogs.com/CoderHong/p/8903035.html
Copyright © 2011-2022 走看看