iOS中如何判断当前网络环境是2 g/3 g/4 g/5 g/WiFi

  

  

5克什么的,还得等苹果API更新啊,不过将来还是这个处理过程就是了。
  

  

关于判断当前的网络环境是2 g/3 g/4 g,这个问题以前经常看的到,最近在一工程里看到了如果判断的API。而在撸WebRTC音视频通话的时候,看到了演示中将SCNetworkReachability与其结合,当网络环境改变时,判断当前连接的是什么网络环境,写法欠佳(因为将其与WebRTC的其他逻辑柔和在了一个类)。其实只需要将官方的可达性做一下改进即可。
  

  


  

  

我们可以利用# import & lt; CoreTelephony/CTTelephonyNetworkInfo.h>框架下的一些API来判断当前的网络。
  

  

先来看一下该框架下的一些常量定义:
  

        CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyGPRS __OSX_AVAILABLE_STARTING (__MAC_NA __IPHONE_7_0);   CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyEdge __OSX_AVAILABLE_STARTING (__MAC_NA __IPHONE_7_0);   CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyWCDMA __OSX_AVAILABLE_STARTING (__MAC_NA __IPHONE_7_0);   CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSDPA __OSX_AVAILABLE_STARTING (__MAC_NA __IPHONE_7_0);   CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSUPA __OSX_AVAILABLE_STARTING (__MAC_NA __IPHONE_7_0);   CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMA1x __OSX_AVAILABLE_STARTING (__MAC_NA __IPHONE_7_0);   CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORev0 __OSX_AVAILABLE_STARTING (__MAC_NA __IPHONE_7_0);   CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevA __OSX_AVAILABLE_STARTING (__MAC_NA __IPHONE_7_0);   CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevB __OSX_AVAILABLE_STARTING (__MAC_NA __IPHONE_7_0);   CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyeHRPD __OSX_AVAILABLE_STARTING (__MAC_NA __IPHONE_7_0);   CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyLTE __OSX_AVAILABLE_STARTING (__MAC_NA __IPHONE_7_0);      

这不就是2 g/3 g/4 g等网络环境么?我想等5克普及之后,苹果肯定也会加入代表5 g的常量定义的。
  

  

先看随手写的一个网络环境判断:
  

        - (void) networkStatus   {   (CTRadioAccessTechnologyEdge NSArray * typeStrings2G=@,   CTRadioAccessTechnologyGPRS,   CTRadioAccessTechnologyCDMA1x];      (CTRadioAccessTechnologyHSDPA NSArray * typeStrings3G=@,   CTRadioAccessTechnologyWCDMA,   CTRadioAccessTechnologyHSUPA,   CTRadioAccessTechnologyCDMAEVDORev0,   CTRadioAccessTechnologyCDMAEVDORevA,   CTRadioAccessTechnologyCDMAEVDORevB,   CTRadioAccessTechnologyeHRPD];      NSArray * typeStrings4G=@ [CTRadioAccessTechnologyLTE];      如果([[[UIDevice currentDevice] systemVersion] floatValue]祝辞=7.0){   CTTelephonyNetworkInfo * teleInfo=[[CTTelephonyNetworkInfo alloc] init);   NSString * accessString=teleInfo.currentRadioAccessTechnology;   如果([typeStrings4G containsObject: accessString]) {   NSLog (@“4 g网络”);   }else if ([typeStrings3G containsObject: accessString]) {   NSLog (@“3 g网络”);   }else if ([typeStrings2G containsObject: accessString]) {   NSLog (@“2 g网络”);   其他}{   NSLog(@“未知网络”);   }   其他}{   NSLog(@“未知网络”);   }   }      

代码中的currentRadioAccessTechnology是iOS 7之后新加的API。

  


  

  

在iOS应用中的使用场景肯定不是主动获取,应该是网络产生变化的时候,自动给出通知等,然后做一些相应的处理。下面我们就自己撸一个可达性,然后给出当前的网络环境。
  

  

我们都知道,使用可达性时,如果网络变化,会给出一个通知,但是我们获取的网络状态只有WiFi无线广域网/NotReach几种。我们可以在可达性返回的通知里,无线广域网这种类型下,再做上面的网络判断即可。但是更优的做法就将判断放在可达性中,在使用的时候直接返回不同的网络状态。
  

  

由于最新的可达性已经支持了IPV6,我也是在最新的可达性上做了一些改进。
  

  

大部分方法跟可达性一样,我扩展了枚举类型,修改了网络状态判断。
  

  

主要修改如下:
  

        typedef NS_ENUM(了NSUInteger HLNetWorkStatus) {   HLNetWorkStatusNotReachable=0,   HLNetWorkStatusUnknown=1,   HLNetWorkStatusWWAN2G=2,   HLNetWorkStatusWWAN3G=3,   HLNetWorkStatusWWAN4G=4,      HLNetWorkStatusWiFi=9,   

iOS中如何判断当前网络环境是2 g/3 g/4 g/5 g/WiFi