iOS中利用CoreTelephony獲取用戶當前網絡狀態(判斷2G,3G,4G)


前言:

  在項目開發當中,往往需要利用網絡.而用戶的網絡環境也需要我們開發者去注意,根據不同的網絡狀態作相應的優化,以提升用戶體驗.

但通常我們只會判斷用戶是在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在這里下咯..


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM