美文网首页
【iOS开发】判断蜂窝网络类型及系统bug

【iOS开发】判断蜂窝网络类型及系统bug

作者: Dnaleci | 来源:发表于2021-04-25 12:01 被阅读0次

判断蜂窝网络类型

最近项目需求要判断当前蜂窝网络类型,查了一些资料,进行一个总结。
首先导入框架

#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吧。

相关文章

网友评论

      本文标题:【iOS开发】判断蜂窝网络类型及系统bug

      本文链接:https://www.haomeiwen.com/subject/ibxdrltx.html