• iOS获取手机当前的网络状态


    获取iOS网络状态,目前有两个办法。

    1.通过监听手机状态栏的信息。

    2.通过使用官方提供的类Reachability。

    一、通过手机监听手机状态栏的信息

    好处:

    1.可以通过苹果的审核上架AppStore。

    2.代码量少,简单易懂。

    3.可以区分网络类型,精确到2G,3G,4G。

    缺点:必须保证在使用该方法的过程中,手机状态栏statusBar没有隐藏。

    代码如下:

    - (NSString *)networkingStatesFromStatusBar {
        UIApplication *app = [UIApplication sharedApplication];
        NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
        int type = 0;
        for (id child in children) {
            if ([child isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
                type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
            }
        }
        NSString *networkStateString = @"wifi";
        switch (type) {
            case 0:
                networkStateString = @"notReachable";
                break;
            case 1:
                networkStateString = @"2G";
                break;
            case 2:
                networkStateString = @"3G";
                break;
            case 3:
                networkStateString = @"4G";
                break;
            case 4:
                stateString = @"LTE";
                break;
            case 5:
                networkStateString = @"wifi";
                break;
            default:
                break;
        }
        return networkStateString; 
    }

    二、通过通过使用官方提供的类Reachability

    好处:官方提供的权威方法。无需依赖状态栏。

    缺点:只有三种网络状态

    typedef NS_ENUM(NSInteger, NetworkStatus) {
        // Apple NetworkStatus Compatible Names.
        NotReachable = 0,
        ReachableViaWiFi = 2,
        ReachableViaWWAN = 1
    };

    使用:

    1.下载并导入Reachability,链接:https://github.com/tonymillion/Reachability

    2.导入SystemConfiguration.framework框架

    3.代码实现:

    Reachability提供了两种实现方法:

    1.使用Block回调,代码如下

        /** 网络状态对象*/
        Reachability *reach= [Reachability reachabilityWithHostName:@"www.apple.com"];
        //使用block回调实现
        reach.reachableBlock = ^(Reachability *reach) {
          dispatch_async(dispatch_get_main_queue(), ^{
              NetworkStatus netStatus = [reach currentReachabilityStatus];
              switch (netStatus) {
                  case NotReachable:
                      NSLog(@"未检测到网络");
                      break;
                  case ReachableViaWiFi:
                      NSLog(@"wifi");
                      break;
                  case ReachableViaWWAN:
                      NSLog(@"蜂窝网络");
                      break;
                  default:
                      break;
              }
          });
        };
        reach.unreachableBlock = ^(Reachability *reach) {
            NSLog(@"UNREACHBLE!");
        };
        [reach startNotifier];

    2.使用通知,代码如下

        /** 网络状态对象*/
        Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
        [reach startNotifier];

    监听方法的实现

    -(void)reachabilityChanged:(NSNotification *)notification {
        Reachability *curReach = [notification object];
        NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
        NetworkStatus netStatus = [curReach currentReachabilityStatus];
        switch (netStatus) {
            case NotReachable:
                NSLog(@"未检测到网络");
                break;
            case ReachableViaWiFi:
                NSLog(@"wifi");
                break;
            case ReachableViaWWAN:
                NSLog(@"蜂窝网络");
                break;
            default:
                break;
        }
    }

    最后不要忘记移除通知。

    - (void)dealloc {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
    }

     

     

  • 相关阅读:
    批量改文件名小工具
    整理一下在 npmjs.com 上面发布资源包踩过的坑
    告别Vuex,发挥compositionAPI的优势,打造Vue3专用的轻量级状态
    vue3 专用 indexedDB 封装库,基于Promise告别回调地狱
    C++ 学习笔记(三):介绍几个在线编译器【转】
    【Linux】一篇文章彻底搞定信号!【转】
    缓存淘汰算法系列(一)【转】
    缓存淘汰算法 LRU 和 LFU【转】
    NAND Flash标准之ONFI VS TOGGLE【转】
    NAND FLASH学习笔记之nand flash基础(一)【转】
  • 原文地址:https://www.cnblogs.com/hd1992/p/5018814.html
Copyright © 2020-2023  润新知