准确读取iPhone信号强度

ste*_*r84 10 iphone xcode signals objective-c

关于此问题已经有几个问题,但它们中的任何内容似乎都无法提供准确的结果.我需要确定手机是否在特定时刻连接到手机网络.

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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

编辑:该应用程序连接到内部wifi,必须保持这样,使得可达性检查更加困难.

wjl*_*wjl 9

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

int CTGetSignalStrength();

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

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

int CTGetSignalStrength();

- (void)viewDidLoad
{
    [super viewDidLoad];

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

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

如果你想测试设备是否目前有一个蜂窝数据网络连接,你可能会更感兴趣的可达性,特别kSCNetworkReachabilityFlagsIsWWAN.


ste*_*r84 5

好吧我觉得我现在有了正确的解决方案,最后这个解决方案有点简单.

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

首先声明方法:

NSString * CTSIMSupportGetSIMStatus();
int CTGetSignalStrength();
Run Code Online (Sandbox Code Playgroud)

然后检查连接到单元网络,如下所示:

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