准确读取iPhone信号强度

时间:2013-01-30 12:41:20

标签: iphone objective-c xcode signals

对此已有一些问题,但其中没有任何内容似乎可以提供准确的结果。我需要确定手机是否在特定时刻连接到手机网络。

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

此类似乎记录错误,返回mobileCountryCode,isoCountryCode和mobileNetworkCode的值,其中没有为手机安装SIM卡。 carrierName表示“家庭”网络或以前的家庭网络(如果电话已解锁)。

我也查了一下,发现有些人声称以下工作,它使用了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并且必须保持不变,因此更难以进行可访问性检查。

2 个答案:

答案 0 :(得分:9)

我正在玩这个功能,我注意到你以一种有趣的方式调用它。我通过添加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

答案 1 :(得分:5)

好的我觉得我现在有了正确的解决方案,最终会有点简单。

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

首先声明方法:

NSString * CTSIMSupportGetSIMStatus();
int CTGetSignalStrength();

然后检查与小区网络的连接,如下所示:

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