对此已有一些问题,但其中没有任何内容似乎可以提供准确的结果。我需要确定手机是否在特定时刻连接到手机网络。
此类似乎记录错误,返回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并且必须保持不变,因此更难以进行可访问性检查。
答案 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 );