测量蜂窝信号强度
我正在开发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);
这不是很难。
- 在您的Xcode项目中链接CoreTelephony.framework
- 在需要的地方添加以下行
码:
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;