ios - 如何在iOS中实时检测蜂窝信号功率的增减

标签 ios iphone reachability

我的应用程序(它是一个应用程序商店应用程序)能够通过 3G/4G/LTE/Edge 等连接...但是它无法实时(可能通过回调)检测到信号强度已被修改.例如:如果我连接到 4G 并且我处于信号为 EDGE 或 2G 的“角落”,我想禁用某些功能。另外我想重新启用信号再次变为 4G 的功能。

我看到了 CTTelephonyNetworkInfo 类,并且这些值也在 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 上对其进行了测试,我注意到有时我必须等待更多时间才能收到通知。因此,在您的情况下,更好的方法可能只是调用 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); 
}];

关于ios - 如何在iOS中实时检测蜂窝信号功率的增减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36481141/

相关文章:

ios - API 响应访问“发件人”和“收件人”邮件的名称

html - 更改 iOS 应用程序中的默认语言

iphone - 使用特定的 url 启动 UIWebview

iphone - 查找和调试废弃内存和堆增长的技巧

iOS/iPhone 可达性 - 如何仅在互联网丢失/无法使用 Reachability.m/.h 时检查

android - 一直 react native 空屏幕

ios - 无法通过 Interface Builder 将条形按钮添加到第二页

ios - 如何从 Mac OS X Catalina 将 IPA 文件上传到 App Store

iOS 可达性 : Problem with host Method

iOS - 可达性 isReachable 不工作