Ios 测量蜂窝信号强度

Ios 测量蜂窝信号强度,ios,iphone,objective-c,cocoa-touch,Ios,Iphone,Objective C,Cocoa Touch,我正在为iOS开发一个非appstore应用程序。我想读取代码中的蜂窝信号强度 我知道苹果没有提供任何API来实现这一点 是否有任何私有API可以用来实现这一点?我已经浏览了关于这个问题的各种帖子,但找不到任何相关信息 这是完全可能的,因为有一个用于检测载波信号强度的方法。我简要地查看了位于的VAFieldTest项目 class/VAFieldTestViewController.m中似乎有getSignalStrength和register_通知函数,当它们调用coretephoney.fr

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

我知道苹果没有提供任何API来实现这一点

是否有任何私有API可以用来实现这一点?我已经浏览了关于这个问题的各种帖子,但找不到任何相关信息


这是完全可能的,因为有一个用于检测载波信号强度的方法。

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

class/VAFieldTestViewController.m中似乎有getSignalStrength和register_通知函数,当它们调用coretephoney.framework时,您可能会感兴趣


我很有信心,一些使用过的调用在中没有记录,因此是私有的-AppStore中的任何应用程序都必须通过检查

我简要介绍了位于的VAFieldTest项目

class/VAFieldTestViewController.m中似乎有getSignalStrength和register_通知函数,当它们调用coretephoney.framework时,您可能会感兴趣

我很有信心,一些使用过的调用在中没有记录,因此是私有的-AppStore中的任何应用程序都必须通过检查

这不是很难

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

你就完了

2016年5月更新

苹果取消了这个机会。

这并不难

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

你就完了

2016年5月更新


苹果公司取消了这个机会。

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

返回类型是id,因此我认为您可以获得_cachedsignalstrengthivar所表示的NSDictionary,或者旧函数所表示的NSNumber

id signalStrength = [[CTTelephonyNetworkInfo new] signalStrength];
这在iOS 8.3中发生了变化,正如您可以从中看到的


请注意,这仍然没有记录在案!因此,如果你的应用程序将进入应用商店,请采取预防措施。

我还没有测试过它,但显然这现在是一种CTTelephonyNetworkInfo方法,而不是全局/静态功能

返回类型是id,因此我认为您可以获得_cachedsignalstrengthivar所表示的NSDictionary,或者旧函数所表示的NSNumber

id signalStrength = [[CTTelephonyNetworkInfo new] signalStrength];
这在iOS 8.3中发生了变化,正如您可以从中看到的


请注意,这仍然没有记录在案!因此,如果您的应用将进入应用商店,请采取预防措施。

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

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

在iOS 9或更高版本的Swift 3中,无需使用CoreTephonery-CTGetSignalStrength提供的专用API即可获得信号强度。只需浏览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

}

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

以在iOS 9或更高版本的Swift 3中获取信号,而不使用CoreTephony-CTGetSignalStrength的专用API。只需浏览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

}

注意:如果状态栏被隐藏,按键状态栏将返回nil。

以下是Lucas的答案转换为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;

以下是Lucas转换为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;

VAFieldTest的值是否准确?VAFieldTest的值是否准确?@Niels Castle如何将我使用VAFieldTest应用程序获得的信号强度转换为dBm?通过Github的链接,您将能够直接与Vlad交互,VAFieldTest的维护者。是否有可能获得其他参数:RSCP信号电平、SC置乱码和EcNo信噪比?该项目在iOS 9上几乎立即崩溃。知道OpenSignal如何进行信号强度测量吗?他们在iOS 10上测试的主屏幕上显示技术和信号强度,数值非常准确。@Niels Castle如何将我使用VAFieldTest应用程序获得的信号强度转换为dBm?按照Github的链接,您将能够直接与Vlad交互,VAFieldTest的维护者。是否有可能获得其他参数:RSCP信号电平、SC置乱码和EcNo信噪比?该项目在iOS 9上几乎立即崩溃。知道OpenSignal如何进行信号强度测量吗?他们在iOS 10上测试的主屏幕上显示技术和信号强度,该值非常准确。它在iOS 9.1上运行,但返回值0,无论我使用LTE还是Wi-Fi。它在iOS 9.1上运行,但返回值0,无论我使用LTE还是Wi-Fi.signalStrength在iOS 9I中返回null,我都在尝试获取iOS 9的蜂窝信号强度,但如上所述,它返回0。使用UIStatusBarSignalStrengthHitemView在后台模式下不起作用,因此它没有任何用处,因为我需要获取信号str

专注于背景。请告诉我是否有人能够获取这些值。iOS 9中的signalStrength返回null我正在尝试获取iOS 9的蜂窝信号强度,但如上所述,它返回0。使用UIStatusBarSignalStrengthHitemView在后台模式下不起作用,因此它没有任何用处,因为我需要在后台获取信号强度。请让我知道是否有人能够获得这些值。在iOS9设备上工作,而不是在模拟器上。这是一个私有API UIKit被列为公共,但它似乎是一个私有值。跟进。我为此制作了一个小演示,在itunes connect中创建了一个应用程序,并验证了商店提交应用程序存档。这并不是万无一失的,但表面上会触发私有API错误?在iOS12设备上崩溃,不幸的是在iOS9设备上工作,而不是在模拟器上。这是私有API UIKit被列为公共,但它似乎是私有值。跟进。我为此制作了一个小演示,在itunes connect中创建了一个应用程序,并验证了商店提交应用程序存档。这并不是万无一失的,但表面上看,私有API错误会被触发?在iOS12设备上崩溃,不幸的是这伤害了我的灵魂,但它满足了要求:它可以工作,并且不使用任何私有API。谢谢大家!@EliotGillum苹果是否批准?使用的密钥在ios 10中不存在。它使用私有API:valueforKey:signalStrengthBars@user100是的,我已经在App Store中成功提交了2个应用程序。这伤害了我的灵魂,但它满足了要求:它工作正常,不使用任何私人API。谢谢大家!@EliotGillum苹果是否批准?使用的密钥在ios 10中不存在。它使用私有API:valueforKey:signalStrengthBars@user100是的,我已经在App Store中成功提交了2个应用程序。