有没有办法确定iPhone是否正在漫游?

Aft*_*hew 21 iphone jailbreak roaming-profile core-telephony

我正在开发一个iPhone应用程序,并且非常想确定设备是否正在漫游,以便我可以智能地避免在用户家庭网络之外花费昂贵的连接.

我写的应用程序是用于越狱手机,但如果可能的话,我更愿意使用标准的SDK.

这是我已经找到的:

1. Apple SDK: 在Apple文档中,我在Apple的SCNetworkReachability API中找到了承诺.通过API,您可以访问WIFI或手机网络,当前是否建立了网络连接等.但是,搜索SCNetworkReachability API参考pdf以获取"漫游"或"漫游"两者均为nil.他们的示例代码也是如此.

2.越狱iPhone FS的Grep: 首选项 - >常规 - >网络选项卡是用户可以打开或关闭漫游的地方.查看plist文件("/Applications/Preferences/Network.plist"),我能够找到以下引用:

        PostNotification = "com.apple.commcenter.InternationalRoamingEDGE.changed";
        cell = PSSwitchCell;
        default = 1;
        defaults = "com.apple.commcenter";
        key = InternationalRoamingEDGE;
        label = "EDGE_ROAMING_TOGGLE";
        requiredCapabilities =             (
            telephony
        );
Run Code Online (Sandbox Code Playgroud)

这当然是一个领先者,因为看起来我可以注册用户更改了InternationalRoaming设置的通知.尽管如此,我不确定如何将其变成他们实际上正在漫游的知识.

3.检查SpringBoard的类转储源: 我使用class-dump转储了SpringBoard的.我无法找到任何"漫游"或"漫游"的引用

4.显然我开始在SO检查这个: 找不到任何相关的东西.

进一步的步骤:有人在这里有任何建议吗?我知道这是可能的.但苹果显然很难找到它.我非常怀疑,如果不使用私有框架,这是可能的.(例如CoreTelephony).由于这是一个越狱的应用程序,我可能会使用SpringBoard中的注入代码来屏幕抓取运营商名称,但我真的更愿意不去那条路线.任何建议都非常感谢.谢谢.

Aft*_*hew 23

有!它根本没有记录,我非常怀疑这可以在非越狱手机上运行(因为它需要使用不在沙盒中的文件).但是,这是如何完成的.

iPhone文件系统保留两个软链接:

static NSString *carrierPListSymLinkPath = @"/var/mobile/Library/Preferences/com.apple.carrier.plist";
static NSString *operatorPListSymLinkPath = @"/var/mobile/Library/Preferences/com.apple.operator.plist";
Run Code Online (Sandbox Code Playgroud)

当这些链接指向同一文件时,电话不会漫游.当指向不同的文件时,电话正在徘徊.

简化代码(无错误检查等):

- (BOOL)isRoaming
{
    NSFileManager *fm = [NSFileManager defaultManager];
    NSError *error;
    NSString *carrierPListPath = [fm destinationOfSymbolicLinkAtPath:carrierPListSymLinkPath error:&error];
    NSString *operatorPListPath = [fm destinationOfSymbolicLinkAtPath:operatorPListSymLinkPath error:&error];
    return (![operatorPListPath isEqualToString:carrierPListPath]);
}
Run Code Online (Sandbox Code Playgroud)

  • com.apple.operator.plist似乎不再可访问(从iOS 6.1开始) (3认同)