如何实时检测iOS中蜂窝信号功率的增加/减少

时间:2016-04-07 15:44:44

标签: 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读取的代码,我收回的值是正确的,但这是在我手动调用方法时完成的。

1 个答案:

答案 0 :(得分:5)

为了检测蜂窝信号功率,我使用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   讨论:   设备注册的当前无线电接入技术。如果设备未在任何网络上注册,则可以是NULL

另外,我做了一些研究,我发现了一个有趣的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); 
}];