在iOS中检查蜂窝网络类型

在iOS中检查蜂窝网络类型,ios,networking,3g,cellular-network,Ios,Networking,3g,Cellular Network,我正在开发一个iOS应用程序,希望确定该设备具有哪种类型的蜂窝连接 我最感兴趣的是我的设备使用的蜂窝网络类型:2G或3G,或其他 然而,可达性.h仅提供对wifi或3G的检查 如何检查2G、3G等?2G/3G无法通过可达性.h或任何其他第三方库进行区分,因为iPhone仅向API提供网络类型信息(WWAN、WiFi、无网络) 但是,如果您能够知道2G或3G网络的IP范围,您可以确定iPhone使用的网络速度/频率。使用此技术,您可以区分EDGE和3G:在iOS 7.0+中,我们有CoreTeph

我正在开发一个iOS应用程序,希望确定该设备具有哪种类型的蜂窝连接

我最感兴趣的是我的设备使用的蜂窝网络类型:2G或3G,或其他

然而,可达性.h仅提供对wifi或3G的检查


如何检查2G、3G等?

2G/3G无法通过
可达性.h
或任何其他第三方库进行区分,因为iPhone仅向API提供网络类型信息(WWAN、WiFi、无网络)


但是,如果您能够知道2G或3G网络的IP范围,您可以确定iPhone使用的网络速度/频率。

使用此技术,您可以区分EDGE和3G:

在iOS 7.0+中,我们有CoreTephony framework,它可以为我们提供所需的网络类型详细信息

CTTelephonyNetworkInfo *telephonyInfo = [[CTTelephonyNetworkInfo alloc] init];
    NSString *currentRadio = telephonyInfo.currentRadioAccessTechnology;
    if ([currentRadio isEqualToString:CTRadioAccessTechnologyLTE]) {
        // LTE

    } else if([currentRadio isEqualToString:CTRadioAccessTechnologyEdge]) {
        // EDGE

    } else if([currentRadio isEqualToString:CTRadioAccessTechnologyWCDMA]){
        // 3G

    }

我发现最好的方法是:

+ (NSNumber *)dataNetworkTypeFromStatusBar {

UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"]    subviews];
NSNumber *dataNetworkItemView = nil;

for (id subview in subviews) {
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
        dataNetworkItemView = subview;
        break;
    }
}
return [dataNetworkItemView valueForKey:@"dataNetworkType"]; }

    /* Where
    0 = No wifi or cellular
    1 = 2G and earlier
    2 = 3G
    3 = 4G
    4 = LTE
    5 = Wifi
    */
由于方法正在检查状态栏的值,请确保状态栏未隐藏在应用程序中。如果不可见,该方法将始终返回0。

对于Swift 4

let telephonyInfo = CTTelephonyNetworkInfo()
    let currentRadio = telephonyInfo.currentRadioAccessTechnology
    if (currentRadio == CTRadioAccessTechnologyLTE) {
        // LTE
        print("LTE")
    } else if (currentRadio == CTRadioAccessTechnologyEdge) {
        // EDGE
          print("EDGE")
    } else if (currentRadio == CTRadioAccessTechnologyWCDMA) {
        // 3G
         print("3G")
    }
    else if(currentRadio==CTRadioAccessTechnologyHSDPA){
        // HSDPA
        print("HSDPA")
    }

注意:导入CoreTephony

ios sdk有很多限制-没有2g/3g/LTE的身份检查。在可能重复的情况下开始开发后感觉很差