已经有一些关于此的问题,但其中似乎没有提供准确的结果。我需要简单地确定手机是否在给定时刻连接到手机网络。
此类的记录似乎不正确,在手机未安装 SIM 的情况下返回 mobileCountryCode、isoCountryCode 和 mobileNetworkCode 的值。如果手机已解锁,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,并且必须保持连接状态,这使得可达性检查变得更加困难。
最佳答案
我正在玩这个函数,我注意到你以一种有趣的方式调用它。我通过添加 CoreTelephony.framework 作为编译时链接来调用它。对于函数本身,您需要在某处声明它的原型(prototype)(可能就在您调用的方法上方):
int CTGetSignalStrength();
这需要声明,因为它不在 CoreTelephony 的公共(public) header 中。
现在,我构建了一个每秒打印信号强度的简单应用。
int CTGetSignalStrength();
- (void)viewDidLoad
{
[super viewDidLoad];
while (true) {
printf("signal strength: %d\n", CTGetSignalStrength());
sleep(1);
}
}
我在我的 iPad mini 上运行它,它显示稳定的值,直到我拿起它,数字才开始上升。用锡纸包裹我的 iPad(锡纸是我以前从未使用过的调试工具)导致数字下降。当我将我的 iPad 置于飞行模式时,它会不断重复上一个值,因此这对您来说不是一个准确的测量值。
如果您想测试设备当前是否具有蜂窝数据网络连接,您可能对 Reachability 更感兴趣,特别是 kSCNetworkReachabilityFlagsIsWWAN
。
关于iphone - 准确读取iPhone信号强度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14604273/