10

已经有一些关于此的问题,但其中似乎没有提供准确的结果。我需要简单地确定手机是否在给定时刻连接到手机网络。

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

此类似乎记录不正确,返回未在手机上安装 SIM 卡的 mobileCountryCode、isoCountryCode 和 mobileNetworkCode 的值。如果手机已解锁,则运营商名称表示“家庭”网络或以前的家庭网络。

我还查找了一些人声称以下工作,它使用 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 并且必须保持连接,这使得可达性检查更加困难。

4

2 回答 2

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

于 2013-01-30T13:03:02.720 回答
5

好的,我想我现在有了正确的解决方案,最后更简单了。

The issue with the CTGetSignalStrength() method is that it works normally, but if you remove a sim, it reports the last signal before the removal. I found another method in the same framework called CTSIMSupportGetSIMStatus(), also undocumented, which can tell you if a SIM is currently connected. Using both as follows should confirm the current network signal.

First declare the methods:

NSString * CTSIMSupportGetSIMStatus();
int CTGetSignalStrength();

Then check connectivity to cell network like so:

NSString *status = CTSIMSupportGetSIMStatus();
int signalstrength = CTGetSignalStrength();
BOOL connected = ( [status isEqualToString: @"kCTSIMSupportSIMStatusReady"] && signalstrength > 0 );
于 2013-01-31T16:29:43.887 回答