CTTelephonyNetworkInfo 的 currentRadioAccessTechnology 模棱两可的响应

CTTelephonyNetworkInfo's currentRadioAccessTechnology Ambiguous response

我的一个应用程序中有一个场景,我应该允许用户仅在连接至少为 4G or LTE. 时才将一些数据同步到服务器。下面是我使用的源代码,它工作正常,直到下面解释的场景 occurs/happens.

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属性判断连接是否足够快。

问题出现在以下场景中,

如果用户通过按下 sleep/power 按钮将 iPad 置于睡眠模式,CTRadioAccessTechnologyDidChangeNotification 通知有时会给出“currentRadioAccessTechnology” 属性 值作为 NULL or NIL。在那之后,我们将不会收到具有正确数据连接类型 (RadioAccessTechnology) 的第二个通知。所以我无法在该条件下设置“cellularConnectionFast”属性 值。

我试图实现一种逻辑,仅当 CTTelephonyNetworkInfo.currentRadioAccessTechnology 值不是 [=24 时才设置“currentCellularDataConnectionType”和“cellularConnectionFast”属性 值=] 或 NIL 如下所示,

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 post 中看到评论说 CTTelephonyNetworkInfo.currentRadioAccessTechnology 有可能 return 'nil' 当设备不可用时连接到无线电塔。

在这种情况下我可以做什么实施?我使用可达性 class 来识别当前网络类型(无连接,WiFiWWAN)并仅在 WWAN 时才计算“currentRadioAccessTechnology”值。

我认为您正在获取 CTTelephonyNetworkInfo 的实例,然后在其上调用 currentRadioAccessTechnology(我就是这样做的)。

问题来了,正如你在设备休眠时指出的那样。 CTTelephoneNetworkInfo 实例在您的应用程序在后台 运行 时继续工作,但一旦您进入非活动状态;它变得无效。

当您再次激活时,您需要获取 CTTelephoneNetworkInfo 的新实例(响应通知 UIApplicationWillBecomeActive)。

正如您所指出的,当您未连接到无线电塔时,currentRadioAccessTechnology 会 return null,但可达性不会 returning手机,所以你应该没问题。

作为免费奖励,currentRadioAccessTechnology 编辑的值 return 是一个字符串,因此您可以清理所有这些 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]