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 来识别当前网络类型(无连接,WiFi
或 WWAN
)并仅在 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]
我的一个应用程序中有一个场景,我应该允许用户仅在连接至少为 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 来识别当前网络类型(无连接,WiFi
或 WWAN
)并仅在 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]