测量蜂窝信号强度

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

我知道苹果不提供任何我们可以实现这一目标的API。

有没有可以用来实现这个私人API? 我已经通过关于这个问题的各种线程,但无法find任何相关的信息。

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

我简单地看了一下位于Github的VAFieldTest项目。

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

我非常确信,一些使用的调用在Apple的CoreTelephony框架文档中没有记载 ,因此私有–AppStore中的任何应用程序都必须通过检查。

获取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); 

这不是很难。

  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 } 

你完成了。

2016年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”键将返回nil。

我还没有testing过,但显然这是一个CTTelephonyNetworkInfo而不是一个全局/静态函数的方法。

返回types是id ,所以我认为你得到一个NSDictionary (如_cachedSignalStrength伊娃暗示)或NSNumber (如旧函数所暗示的)。

 id signalStrength = [[CTTelephonyNetworkInfo new] signalStrength]; 

这在iOS 8.3中发生了变化,您可以从提交中看到。

请注意,这仍然没有logging! 所以,如果你的应用程序将在App Store中,请采取预防措施。

这里卢卡斯的答案转换为Xamarin,并在iOS 10.2.1上testing:

 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;