CTTelephonyNetworkInfo的currentRadioAccessTechnology含义不明确

3

我有一个应用程序的场景,如果连接至少为4G或LTE,我应该允许用户将一些数据同步到服务器。以下是我使用的源代码,直到下面解释的情况发生之前,它都可以正常工作。

if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {
                self.currentCellularDataConnectionType = kGPRS;
                self.cellularConnectionFast = NO;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) {
                self.currentCellularDataConnectionType = kWCDMA;
                self.cellularConnectionFast = NO;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {
                self.currentCellularDataConnectionType = kEDGE;
                self.cellularConnectionFast = NO;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
                self.currentCellularDataConnectionType = kLTE;
                self.cellularConnectionFast = YES;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
                self.currentCellularDataConnectionType = (NSString *)currentCellularAccessTechnology;
                self.cellularConnectionFast = NO;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] ||
                     [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
                self.currentCellularDataConnectionType = [NSString stringWithFormat:@"%@ ~= %@",currentCellularAccessTechnology,k4G];
                self.cellularConnectionFast = YES;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA] ||
                     [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0] ||
                     [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA] ||
                     [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) {
                self.currentCellularDataConnectionType = [NSString stringWithFormat:@"%@ ~= %@",currentCellularAccessTechnology,k3G];
                self.cellularConnectionFast = NO;
            }
            else {
                self.currentCellularDataConnectionType = (NSString *)currentCellularAccessTechnology;
                self.cellularConnectionFast = NO;
            }

currentCellularDataConnectionType保存当前的无线接入技术,cellularConnectFast属性确定连接是否足够快速。

以下情况会发生问题,

如果用户通过按睡眠/电源按钮将置于睡眠模式,则CTRadioAccessTechnologyDidChangeNotification通知有时会将“currentRadioAccessTechnology”属性值设置为NULL或NIL。此后我们将无法收到正确数据连接类型(RadioAccessTechnology)的第二个通知。因此,在这种情况下我无法设置“cellularConnectionFast”属性值。

我尝试实现的逻辑是,只有当CTTelephonyNetworkInfo.currentRadioAccessTechnology值不为NULLNIL时才设置“currentCellularDataConnectionType”和“cellularConnectionFast”属性值,代码如下:

if ((NSNull *)currentCellularAccessTechnology == [NSNull null] || currentCellularAccessTechnology == nil) {
            DDLogInfo(@"From %s, New Cellular Connection Type recieved as: %@, so sticking with the previous Cellular Connection Type: %@",__PRETTY_FUNCTION__,currentCellularAccessTechnology,self.currentCellularDataConnectionType);
        }
        else {
            if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {
                self.currentCellularDataConnectionType = kGPRS;
                self.cellularConnectionFast = NO;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) {
                self.currentCellularDataConnectionType = kWCDMA;
                self.cellularConnectionFast = NO;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {
                self.currentCellularDataConnectionType = kEDGE;
                self.cellularConnectionFast = NO;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
                self.currentCellularDataConnectionType = kLTE;
                self.cellularConnectionFast = YES;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
                self.currentCellularDataConnectionType = (NSString *)currentCellularAccessTechnology;
                self.cellularConnectionFast = NO;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] ||
                     [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
                self.currentCellularDataConnectionType = [NSString stringWithFormat:@"%@ ~= %@",currentCellularAccessTechnology,k4G];
                self.cellularConnectionFast = YES;
            }
            else if ([currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA] ||
                     [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0] ||
                     [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA] ||
                     [currentCellularAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) {
                self.currentCellularDataConnectionType = [NSString stringWithFormat:@"%@ ~= %@",currentCellularAccessTechnology,k3G];
                self.cellularConnectionFast = NO;
            }
            else {
                self.currentCellularDataConnectionType = (NSString *)currentCellularAccessTechnology;
                self.cellularConnectionFast = NO;
            }

然而,我在Raywenderlich文章中看到评论指出,当设备未连接到电信基站时,CTTelephonyNetworkInfo.currentRadioAccessTechnology有可能返回'nil'。

在这种情况下,我可以进行哪些实现?我使用reachability类来识别当前网络类型(无连接、WiFiWWAN),并且仅在WWAN下计算“currentRadioAccessTechnology”值。


1
你找到解决问题的方法了吗?我有一个类似的问题:当我将应用程序置于后台和前台时,现有实例的currentRadioAccessTechnology始终返回nil - fabb
1个回答

2
我认为你正在获取一个CTTelephonyNetworkInfo实例,然后在该实例上调用currentRadioAccessTechnology(这就是我所做的)。问题出现在当设备休眠时,正如你指出的那样。在您的应用程序在后台运行时,CTTelephoneNetworkInfo实例仍在工作,但一旦您处于非活动状态,它就变得无效了。因此,当您再次变得活跃时(响应通知UIApplicationWillBecomeActive),需要获取一个新的CTTelephoneNetworkInfo实例。正如你所指出的,当你没有连接到无线电塔时,currentRadioAccessTechnology确实会返回null,但是可达性将不会返回蜂窝数据,所以你应该没问题。作为免费奖励,currentRadioAccessTechnology返回的值是一个字符串,所以你可以清理所有的if语句。请在dispatch once块中设置参考表。
NSSet<NSString*> fastTechs = [[NSSet alloc] initWithObjects: CTRadioAccessTechnologyHSDPA, CTRadioAccessTechnologyHSDPD, CTRadioAccessTechnologyLTE, nil];

NSDictionary<NSString*,NSNumber> accessTechTypes = @{ CTRadioAccessTechnologyHSDPA :k4g, CTRadioAccessTechnologyLTE : kLTE};

那么您的常规代码如下:
CTRadioAcessTechnology accessTech = telephonyInfo.currentRadioAccessTechnology;
self.cellularConnectionFast = [fastTechs contains:accessTech];

并且

self.currentCellularDataConnectionType = accessTechTypes[accessTech]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接