iphone - 准确读取iPhone信号强度

标签 iphone objective-c xcode signals

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

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

此类的记录似乎不正确,在手机未安装 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/

相关文章:

iphone - 对于讲英语的人,您如何发音“xib”

iphone - ios fellow alloc 之间有什么不同?

ios - 如何编译 iOS 应用程序 (IPA) 以通过 Microsoft Intune 分发它

iphone - iPhone 3G 上的坐标全错了?这可能是你的编译器

iphone - 在 iPhone 上更改背景图像的按钮

iphone - CGRect 中的 presentModalViewController

objective-c - 避免保留循环,NSNotificationCenter?

ios - 如何从父类调用一个方法到它的子类?

ios - 使用 UIStackView 的动态 UITableView 行高?

iphone - 如何附加到 iPhone 上的发布应用程序?不是调试版