如何实时检测iOS中的蜂窝信号功率increase/decrease
How to detect at realtime the increase/decrease of cellular signal power in iOS
我的应用程序(它是一个应用程序商店应用程序)能够通过 3G/4G/LTE/Edge 等连接...但是它无法实时(可能通过回调)检测到信号已被修改。例如:如果我连接到 4G 并且我在信号为 EDGE 或 2G 的 "corner" 中,我想禁用某些功能。另外我想重新启用信号再次变为 4G 的功能。
我看过 CTTelephonyNetworkInfo
class SDK 中也提供了这些值
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyGPRS __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyEdge __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyWCDMA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSDPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSUPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMA1x __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORev0 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevB __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyeHRPD __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyLTE __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
但是如果其中一个值处于活动状态,应用程序如何接收通知。我有一些从 CTTelephoneNetworkInfo 读取的代码,我取回的值是正确的,但是这是在我手动调用方法时完成的。
为了检测蜂窝信号功率,我使用 CTRadioAccessTechnologyDidChangeNotification
。
你可以试试这个代码:
import CoreTelephony
private var info: CTTelephonyNetworkInfo!
func createObserver() {
self.info = CTTelephonyNetworkInfo();
NSNotificationCenter.defaultCenter().addObserver(self, selector: "currentAccessTechnologyDidChange",
name: CTRadioAccessTechnologyDidChangeNotification, object: self.observerObject)
}
func currentAccessTechnologyDidChange() {
if let currentAccess = self.info.currentRadioAccessTechnology {
switch currentAccess {
case CTRadioAccessTechnologyGPRS:
print("GPRS")
case CTRadioAccessTechnologyEdge:
print("EDGE")
case CTRadioAccessTechnologyWCDMA:
print("WCDMA")
case CTRadioAccessTechnologyHSDPA:
print("HSDPA")
case CTRadioAccessTechnologyHSUPA:
print("HSUPA")
case CTRadioAccessTechnologyCDMA1x:
print("CDMA1x")
case CTRadioAccessTechnologyCDMAEVDORev0:
print("CDMAEVDORev0")
case CTRadioAccessTechnologyCDMAEVDORevA:
print("CDMAEVDORevA")
case CTRadioAccessTechnologyCDMAEVDORevB:
print("CDMAEVDORevB")
case CTRadioAccessTechnologyeHRPD:
print("HRPD")
case CTRadioAccessTechnologyLTE:
print("LTE")
default:
print("DEF")
}
} else {
print("Current Access technology is NIL")
}
}
我已经在我的 iphone 上通过打开 on/off 飞行模式对其进行了测试,我注意到有时我必须等待更多时间才能收到通知。因此,在您的情况下,更好的方法可能只是调用 info.currentRadioAccessTechnology
并在需要时获得结果。当然,当你不再需要观察者的时候记得把它移除。
有关此的 Apple 文档:
currentRadioAccessTechnology
Discussion:
The current radio access technology the device is registered with. May be NULL
if the device is not registered on any network.
此外,我做了一些研究,发现了一个有趣的 answer 可能会对您有所帮助。
简单的 Obj-C 版本:
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
CTTelephonyNetworkInfo *ctInfo = [CTTelephonyNetworkInfo new];
[[NSNotificationCenter defaultCenter] addObserverForName:CTRadioAccessTechnologyDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
NSLog(@"current access radio access did change to : %@", ctInfo.currentRadioAccessTechnology);
}];
我的应用程序(它是一个应用程序商店应用程序)能够通过 3G/4G/LTE/Edge 等连接...但是它无法实时(可能通过回调)检测到信号已被修改。例如:如果我连接到 4G 并且我在信号为 EDGE 或 2G 的 "corner" 中,我想禁用某些功能。另外我想重新启用信号再次变为 4G 的功能。
我看过 CTTelephonyNetworkInfo
class SDK 中也提供了这些值
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyGPRS __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyEdge __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyWCDMA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSDPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSUPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMA1x __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORev0 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevB __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyeHRPD __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyLTE __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
但是如果其中一个值处于活动状态,应用程序如何接收通知。我有一些从 CTTelephoneNetworkInfo 读取的代码,我取回的值是正确的,但是这是在我手动调用方法时完成的。
为了检测蜂窝信号功率,我使用 CTRadioAccessTechnologyDidChangeNotification
。
你可以试试这个代码:
import CoreTelephony
private var info: CTTelephonyNetworkInfo!
func createObserver() {
self.info = CTTelephonyNetworkInfo();
NSNotificationCenter.defaultCenter().addObserver(self, selector: "currentAccessTechnologyDidChange",
name: CTRadioAccessTechnologyDidChangeNotification, object: self.observerObject)
}
func currentAccessTechnologyDidChange() {
if let currentAccess = self.info.currentRadioAccessTechnology {
switch currentAccess {
case CTRadioAccessTechnologyGPRS:
print("GPRS")
case CTRadioAccessTechnologyEdge:
print("EDGE")
case CTRadioAccessTechnologyWCDMA:
print("WCDMA")
case CTRadioAccessTechnologyHSDPA:
print("HSDPA")
case CTRadioAccessTechnologyHSUPA:
print("HSUPA")
case CTRadioAccessTechnologyCDMA1x:
print("CDMA1x")
case CTRadioAccessTechnologyCDMAEVDORev0:
print("CDMAEVDORev0")
case CTRadioAccessTechnologyCDMAEVDORevA:
print("CDMAEVDORevA")
case CTRadioAccessTechnologyCDMAEVDORevB:
print("CDMAEVDORevB")
case CTRadioAccessTechnologyeHRPD:
print("HRPD")
case CTRadioAccessTechnologyLTE:
print("LTE")
default:
print("DEF")
}
} else {
print("Current Access technology is NIL")
}
}
我已经在我的 iphone 上通过打开 on/off 飞行模式对其进行了测试,我注意到有时我必须等待更多时间才能收到通知。因此,在您的情况下,更好的方法可能只是调用 info.currentRadioAccessTechnology
并在需要时获得结果。当然,当你不再需要观察者的时候记得把它移除。
有关此的 Apple 文档:
currentRadioAccessTechnology
Discussion: The current radio access technology the device is registered with. May beNULL
if the device is not registered on any network.
此外,我做了一些研究,发现了一个有趣的 answer 可能会对您有所帮助。
简单的 Obj-C 版本:
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
CTTelephonyNetworkInfo *ctInfo = [CTTelephonyNetworkInfo new];
[[NSNotificationCenter defaultCenter] addObserverForName:CTRadioAccessTechnologyDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
NSLog(@"current access radio access did change to : %@", ctInfo.currentRadioAccessTechnology);
}];