ste*_*r84 10 iphone xcode signals objective-c
关于此问题已经有几个问题,但它们中的任何内容似乎都无法提供准确的结果.我需要确定手机是否在特定时刻连接到手机网络.
此类似乎记录不正确,返回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,必须保持这样,使得可达性检查更加困难.
我正在玩这个功能,我注意到你以一种有趣的方式调用它.我通过添加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.
好吧我觉得我现在有了正确的解决方案,最后这个解决方案有点简单.
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)
| 归档时间: |
|
| 查看次数: |
10639 次 |
| 最近记录: |