我正在为iOS开发一个非appstore应用程序。我想在我的代码中读取蜂窝信号强度。
我知道Apple没有提供任何我们可以实现此目的的API。
是否有可用于实现此目的的私有API?我已经完成了有关此问题的各种主题,但未找到任何相关信息。
这是完全可能的,因为有app in the app-store用于检测载波的信号强度。
答案 0 :(得分:10)
这不是很难。
代码:
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;