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