测量细胞信号强度

bha*_*tti 30 iphone cocoa-touch objective-c ios

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

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

是否有可用于实现此目的的私有API?我已经完成了关于这个问题的各种线索,但找不到任何相关信息.

这是完全可能的,因为app-store中有一个应用程序用于检测运营商的信号强度.

vua*_*thu 14

获取signalStreght IOS9:

UIApplication *app = [UIApplication sharedApplication];  
NSArray *subviews = [[[app valueForKey:@"statusBar"]     valueForKey:@"foregroundView"] subviews];  
NSString *dataNetworkItemView = nil;  
     for (id subview in subviews) {  
   if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]])  
   {  
        dataNetworkItemView = subview;  
        break;  
    }  
 }  
int signalStrength = [[dataNetworkItemView valueForKey:@"signalStrengthRaw"] intValue];  
NSLog(@"signal %d", signalStrength);
Run Code Online (Sandbox Code Playgroud)


Mic*_*ner 10

这不是很难.

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

码:

int CTGetSignalStrength(); // private method (not in the header) of Core Telephony

- (void)aScanMethod
{
    NSLog(@"%d", CTGetSignalStrength()); // or do what you want
}
Run Code Online (Sandbox Code Playgroud)

你完成了.

2016年5月更新

Apple取消了这个机会.

  • 它可以在iOS 9.1上运行,但是无论我使用LTE还是Wi-Fi都返回0。 (2认同)

Nie*_*tle 9

我简要地看了一下位于Github的VAFieldTest项目.

在Classes/VAFieldTestViewController.m中似乎有 getSignalStrength()register_notification()函数可能会让你感兴趣CoreTelephony.framework.

我非常有信心,一些使用过的调用在AppleCoreTelephony框架文档中没有记录,因此是私有的 - AppStore中的任何应用程序都必须通过检查.


Luc*_*ira 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

}
Run Code Online (Sandbox Code Playgroud)

注意:如果状态栏被隐藏,键"statusBar"将返回nil.