判断蜂窝网络类型
最近项目需求要判断当前蜂窝网络类型,查了一些资料,进行一个总结。
首先导入框架
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
主要使用currentRadioAccessTechnology属性进行判断
CTTelephonyNetworkInfo *teleInfo= [[CTTelephonyNetworkInfo alloc] init];
NSString *accessString = teleInfo.currentRadioAccessTechnology;
在这里对所有的currentRadioAccessTechnology进行说明
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyGPRS API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos);//GPRS
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyEdge API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos);//2.75G EDGE
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyWCDMA API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos);//3G
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSDPA API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos);//3.5G HSDPA
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSUPA API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos);//3.5G HSUPA
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMA1x API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos);//2G
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORev0 API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos);//3G
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevA API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos);//3G
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevB API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos);//3G
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyeHRPD API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos);//HRPD
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyLTE API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos);//4G
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyNRNSA API_AVAILABLE(ios(14.0)) API_UNAVAILABLE(macos);//5G NSA
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyNR API_AVAILABLE(ios(14.0)) API_UNAVAILABLE(macos);//5G
根据返回的字符串进行判断返回网络状态
NSArray * typeStrings2G = @[CTRadioAccessTechnologyEdge,
CTRadioAccessTechnologyGPRS,
CTRadioAccessTechnologyCDMA1x];
NSArray * typeStrings3G = @[CTRadioAccessTechnologyHSDPA,
CTRadioAccessTechnologyWCDMA,
CTRadioAccessTechnologyHSUPA,
CTRadioAccessTechnologyCDMAEVDORev0,
CTRadioAccessTechnologyCDMAEVDORevA,
CTRadioAccessTechnologyCDMAEVDORevB,
CTRadioAccessTechnologyeHRPD];
NSMutableArray * typeStrings4G = [NSMutableArray array];
if (@available(iOS 14.0, *))
{
[typeStrings4G addObject:CTRadioAccessTechnologyLTE];
//暂时将5G并入4G标识数组中,5G标识符只在iOS 14及以上生效,不然会崩溃
//使用字符串是为了防止系统版本在14.0以上但不支持5G的设备调用api后崩溃
[typeStrings4G addObject:@"CTRadioAccessTechnologyNRNSA"];
[typeStrings4G addObject:@"CTRadioAccessTechnologyNR"];
}
else
{
[typeStrings4G addObject:CTRadioAccessTechnologyLTE];
}
if ([typeStrings4G containsObject:accessString])
{
NSLog(@"4G网络");
}
else if ([typeStrings3G containsObject:accessString])
{
NSLog(@"3G网络");
}
else if ([typeStrings2G containsObject:accessString])
{
NSLog(@"2G网络");
}
else
{
NSLog(@"未知网络");
}
API产生的问题和bug
本以为这种简单操作不会有问题,直到测试反馈一个功能异常的bug。某一个功能在5G网络下iPhone12正常,iPhone12 pro和12pro max异常,在4G下正常;顺藤摸瓜一直排查到发现是返回蜂窝网络状态错误,在这里给同样准备踩坑的人一个提示。上面的api在iPhone12的机型5G网络状态下返回的是CTRadioAccessTechnologyLTE而不是CTRadioAccessTechnologyNRNSA或者CTRadioAccessTechnologyNR,无论系统版本。(ps:基于此严重怀疑iPhone12是假5G,不知道有没有硬件大佬做过测试)
上面的api只有在系统版本高于iOS14.0的iPhone12pro和iPhone12 pro max上有效,当然上面的代码是我做过容错处理的,还是能用的,希望苹果早日修复这个bug吧。