【问题标题】:Accurately reading of iPhone signal strength准确读取 iPhone 信号强度
【发布时间】:2013-05-02 22:12:12
【问题描述】:

已经有一些关于此的问题,但其中似乎没有提供准确的结果。我需要简单地确定手机是否在给定时刻连接到手机网络。

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html

此类似乎记录不正确,返回未安装 SIM 卡的手机的 mobileCountryCode、isoCountryCode 和 mobileNetworkCode 的值。如果手机已解锁,则运营商名称表示“家庭”网络或以前的家庭网络。

我还查找了一些人声称以下工作,它使用 CoreTelephony 框架的未记录方法,但结果对我来说毫无用处,报告看似随机的数字,可能它本身并没有持续更新。

-(int) getSignalStrength
{
    void *libHandle = dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
    int (*CTGetSignalStrength)();
    CTGetSignalStrength = dlsym(libHandle, "CTGetSignalStrength");
    if( CTGetSignalStrength == NULL) NSLog(@"Could not find CTGetSignalStrength");
    int result CTGetSignalStrength();
    dlclose(libHandle);
    return result;
}

谢谢。

编辑:该应用已连接到内部 wifi 并且必须保持连接,这使得可访问性检查更加困难。

【问题讨论】:

  • 它无法运行 IOS 8.3 帮助我
  • iOS 8.4 也不行,有没有其他办法?

标签: iphone objective-c xcode signals


【解决方案1】:

我正在玩这个函数,我注意到你以一种有趣的方式调用它。我通过添加 CoreTelephony.framework 作为编译时链接来调用它。对于函数本身,您需要在某处声明它的原型(可能就在您调用的方法上方):

int CTGetSignalStrength();

这需要声明,因为它不在 CoreTelephony 的公共标头中。

现在,我构建了一个简单的应用程序,每秒打印一次信号强度。

int CTGetSignalStrength();

- (void)viewDidLoad
{
    [super viewDidLoad];

    while (true) {
        printf("signal strength: %d\n", CTGetSignalStrength());
        sleep(1);
    }
}

我在 iPad mini 上运行它,它显示稳定的值,直到我拿起它,数字上升了。用锡纸包裹我的 iPad(锡纸是我以前从未使用过的调试工具)导致数字下降。当我将 iPad 置于飞行模式时,它不断重复上一个值,因此这对您来说不是一个准确的测量值。

如果您想测试设备当前是否具有蜂窝数据网络连接,您可能对Reachability 更感兴趣,特别是kSCNetworkReachabilityFlagsIsWWAN

【讨论】:

  • 谢谢,可达性方面可能是一个前进的方向,尽管我没有立即使用它。问题是我们正在通过受限 wifi 部署应用程序,该 wifi 必须保持连接,因此无法检查数据连接的连接性。 iphonedevsdk.com/forum/iphone-sdk-development/… 如果我可以要求手机仅将 wifi 用于某些事情,这可能会有所帮助。
  • @wjl,感谢您的帖子,我有一个疑问,因为它仅适用于蜂窝数据还是我们也能够获得 Wifi 强度?如果连接较弱,我必须限制使用。
【解决方案2】:

好的,我想我现在有了正确的解决方案,最后还是简单了一些。

CTGetSignalStrength() 方法的问题在于它可以正常工作,但是如果您移除一个 sim,它会报告移除前的最后一个信号。我在同一个框架中找到了另一种方法,称为 CTSIMSupportGetSIMStatus(),也未记录在案,它可以告诉您当前是否连接了 SIM 卡。如下使用两者应该可以确认当前的网络信号。

首先声明方法:

NSString * CTSIMSupportGetSIMStatus();
int CTGetSignalStrength();

然后像这样检查与蜂窝网络的连接:

NSString *status = CTSIMSupportGetSIMStatus();
int signalstrength = CTGetSignalStrength();
BOOL connected = ( [status isEqualToString: @"kCTSIMSupportSIMStatusReady"] && signalstrength > 0 );

【讨论】:

  • 这可以检测飞行模式吗?私有 API 是私有的是有原因的。
  • 你不能假设飞行模式使用这个,因为你无法区分安装 SIM 卡的无信号和设置的模式,所以你必须看看别的东西。当手机处于飞行模式时,CTCarrier 类的某些值应该返回 nil,但我预计除非手机重新启动,否则这将不起作用。
  • 我试过你的代码,但不明白它的价值。你知道这个数字实际上代表什么吗?
  • 你是说信号强度?这应该给你信号强度。我不确定范围是多少,但是 0 肯定没有信号。虽然这是不可靠的,您还需要检查 SIM 卡的状态是否已准备就绪,因此我将它与其他函数组合成一个 bool 以查看我们是否有信号。
  • 它不能在 IOS 8.3 上运行,请帮助我
猜你喜欢
  • 2011-03-17
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多