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];
}