前言:
在項目開發當中,往往需要利用網絡.而用戶的網絡環境也需要我們開發者去注意,根據不同的網絡狀態作相應的優化,以提升用戶體驗.
但通常我們只會判斷用戶是在WIFI還是移動數據,而實際上,移動數據也分為2G/3G/4G等不同制式.而不同的網絡制式又對用戶體驗產生
較為明顯的影響(對於依賴網絡的項目而言).因此很有必要對不同的網絡制式作相應的優化.
而在iOS當中,無論是蘋果官方提供的Reachability類還是較為常用的第三方網絡類AFNetworking,它們提供的網絡環境判斷也僅限
於WIFI/數據,因此我們需要其他方式去獲得客戶端更詳細的網絡環境.
CoreTelephony.framework中提供了CTTelephonyNetworkInfo這個類.這個類是iOS7以后才出現的,在使用這個類之前我們需要
導入CoreTelephony.framework
然后在工程中導入相應地.h文件
#import <CoreTelephony/CTTelephonyNetworkInfo.h> //為判斷網絡制式的主要文件 #import <CoreTelephony/CTCarrier.h> //添加獲取客戶端運營商 支持
實現代碼如下:
CTTelephonyNetworkInfo *networkStatus = [[CTTelephonyNetworkInfo alloc]init]; //創建一個CTTelephonyNetworkInfo對象 NSString *currentStatus = networkStatus.currentRadioAccessTechnology; //獲取當前網絡描述
通過該類的.h文件可以看到.有以下的描述信息:
/* * Radio Access Technology values */ 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);
其實這些都是我們比較熟悉的網絡制式類型了.取到這些描述信息后,我們就可以用他們來做判斷了..
if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyGPRS"]){ //GPRS網絡 return; } if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyEdge"]){ //2.75G的EDGE網絡 return; } if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyWCDMA"]){ //3G WCDMA網絡 return; } if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSDPA"]){ //3.5G網絡 return; } if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSUPA"]){ //3.5G網絡 return; } if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMA1x"]){ //CDMA2G網絡 return; } if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORev0"]){ //CDMA的EVDORev0(應該算3G吧?) return; } if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevA"]){ //CDMA的EVDORevA(應該也算3G吧?) return; } if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevB"]){ //CDMA的EVDORev0(應該還是算3G吧?) return; } if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyeHRPD"]){ //HRPD網絡 return; } if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyLTE"]){ //LTE4G網絡 return; }
別看代碼多..其實都一個樣,只是狀態比較多而已.
而我們取2G/3G/4G的話..就不停的判斷吧
取運營商名字:
//用回上面的對象
currentStatus.subscriberCellularProvider.carrierName
這里也做了個DEMO,基於AFNetworking的判斷,可以判斷 有無網絡,WIFI網絡,移動數據網絡 (主要描述寫在NetworkStatusMonitor.h)
調用方法:
[NetworkStatusMonitor StartWithBlock:^(NSInteger NetworkStatus) { //NetworkStatus為枚舉值 }];
http://download.csdn.net/detail/nicky2k8/8605057 DEMO在這里下咯..