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

时间:2009-05-23 00:39:51

标签: iphone jailbreak core-telephony roaming-profile

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

我正在撰写的应用程序适用于越狱手机,但如果可能,我更愿意使用标准SDK。

以下是我已经找到的内容:

1。 Apple SDKs: 在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
        );

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

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

4。显然,我从SO开始检查这个: 找不到相关的东西。

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

3 个答案:

答案 0 :(得分:23)

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

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

static NSString *carrierPListSymLinkPath = @"/var/mobile/Library/Preferences/com.apple.carrier.plist";
static NSString *operatorPListSymLinkPath = @"/var/mobile/Library/Preferences/com.apple.operator.plist";

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

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

- (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]);
}

答案 1 :(得分:1)

符号链接的解决方案不是唯一的方法,但绝对是最好的。正如我刚刚意识到的那样,返回的字符串包含运营商和运营商的MCC和MNC代码!即使是核心电话框架也无法检索有关漫游时iPhone连接的运营商的信息。

 Logs: 
 carrier: /System/Library/Carrier Bundles/iPhone/72410/carrier.plist
 operator: /System/Library/Carrier Bundles/iPhone/20810/carrier.plist

如您所见,运营商(原始蜂窝提供商)行包含“文件夹”72410内的文件,即MCC 724(巴西)和MNC 10(VIVO)。 操作员(实际上是我现在连接的手机 - 我正在漫游)位于文件夹20810内,这意味着MCC 208(法国)和MNC 10(SFR)。

顺便说一下,我正在使用带有iOS5的iPhone 4。

答案 2 :(得分:0)

在非越狱设备上,您可以使用第三方服务,例如http://ipinfo.io(我自己的服务),根据设备的IP地址查找当前的运营商代码国家/地区,然后您可以将其与CTCarrier详细信息以确定设备是否正在漫游。这是标准的ipinfo.io API响应:

$ curl ipinfo.io/24.32.148.1 
{
    "ip": "24.32.148.1",
    "hostname": "doc-24-32-148-1.pecos.tx.cebridge.net",
    "city": "Pecos",
    "region": "Texas",
    "country": "US",
    "loc": "31.3086,-103.5892",
    "org": "AS7018 AT&T Services, Inc.",
    "postal": "79772"
}

可提供自定义程序包,其中还包括移动IP的mnc / mcc详细信息。有关详细信息,请参阅http://ipinfo.io/developers