测量细胞信号强度

时间:2011-02-10 07:17:55

标签: ios iphone objective-c cocoa-touch

我正在为iOS开发一个非appstore应用程序。我想在我的代码中读取蜂窝信号强度。

我知道Apple没有提供任何我们可以实现此目的的API。

是否有可用于实现此目的的私有API?我已经完成了有关此问题的各种主题,但未找到任何相关信息。

这是完全可能的,因为有app in the app-store用于检测载波的信号强度。

5 个答案:

答案 0 :(得分:10)

这不是很难。

  1. 在您的Xcode项目中链接CoreTelephony.framework
  2. 在您需要的地方添加以下行
  3. 代码:

    int CTGetSignalStrength(); // private method (not in the header) of Core Telephony
    
    - (void)aScanMethod
    {
        NSLog(@"%d", CTGetSignalStrength()); // or do what you want
    }
    

    你已经完成了。

    2016年5月更新

    Apple取消了这个机会。

答案 1 :(得分:9)

我简要地查看了位于Github的VAFieldTest项目。

Classes / VAFieldTestViewController.m中似乎有 getSignalStrength()register_notification()函数,当您调用CoreTelephony.framework时可能会感兴趣。

我非常确信某些已使用的调用在CoreTelephony framework documentation from Apple中没有记录,因此是私有的 - AppStore中的任何应用程序都必须通过检查。

答案 2 :(得分:5)

要在Swift 3中获得iOS 9或更高版本的信号,而不使用CoreTelephony的私有API - CTGetSignalStrength()。只是搜索statusBar视图。

func getSignalStrength() -> Int {

    let application = UIApplication.shared
    let statusBarView = application.value(forKey: "statusBar") as! UIView
    let foregroundView = statusBarView.value(forKey: "foregroundView") as! UIView
    let foregroundViewSubviews = foregroundView.subviews

    var dataNetworkItemView:UIView!

    for subview in foregroundViewSubviews {
        if subview.isKind(of: NSClassFromString("UIStatusBarSignalStrengthItemView")!) {
            dataNetworkItemView = subview
            break
        } else {
            return 0 //NO SERVICE
        }
    }

    return dataNetworkItemView.value(forKey: "signalStrengthBars") as! Int

}

注意:如果状态栏被隐藏,则键" statusBar"将返回零。

答案 3 :(得分:1)

我还没有测试过,但显然现在这是一种CTTelephonyNetworkInfo而不是全局/静态函数的方法。

返回类型为id,因此我认为您获得NSDictionary(如_cachedSignalStrength ivar暗示)或NSNumber(如旧函数所暗示)

id signalStrength = [[CTTelephonyNetworkInfo new] signalStrength];

这在iOS 8.3中有所改变,正如您从commit所见。

请注意,这仍然没有记录!因此,如果您的应用程序将进入App Store,请采取预防措施。

答案 4 :(得分:0)

这里的卢卡斯'答案转换为Xamarin,并在iOS 10.2.1上进行测试:

var application = UIApplication.SharedApplication;
var statusBarView = application.ValueForKey(new NSString("statusBar")) as UIView;
var foregroundView = statusBarView.ValueForKey(new NSString("foregroundView")) as UIView;

UIView dataNetworkItemView = null;
foreach (UIView subview in foregroundView.Subviews)
{
    if ("UIStatusBarSignalStrengthItemView" == subview.Class.Name)
    {
        dataNetworkItemView = subview;
        break;
    }
}
if (null == dataNetworkItemView)
    return false; //NO SERVICE

int bars = ((NSNumber)dataNetworkItemView.ValueForKey(new NSString("signalStrengthBars"))).Int32Value;