21

我正在开发一个 iPhone 应用程序,并且真的很想确定设备是否正在漫游,这样我就可以智能地避免在用户离开家庭网络时花费昂贵的连接费用。

我正在编写的应用程序是针对越狱手机的,但如果可能的话,我更愿意使用标准 SDK。

这是我已经找到的:

1. Apple SDKs: 在Apple 文档中,我发现了Apple 的SCNetworkReachability API 中的promise。该 API 提供对诸如您是在 WIFI 还是手机网络上、当前是否建立网络连接等内容的访问。但是,在 SCNetworkReachability API 参考 pdf 中搜索“roam”或“roaming”都为零。他们的示例代码也是如此。

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
        );

这当然是一个线索,因为看起来我可以注册用户更改国际漫游设置的通知。不过,我不确定如何将其转化为他们实际上正在漫游的知识。

3. 检查 SpringBoard 的类转储源: 我已经使用class-dump 转储了 SpringBoard 的类。我找不到任何提及“漫游”或“漫游”

4. 显然,我首先在 SO 上进行了检查: 找不到任何相关的东西。

进一步的步骤:这里有人有什么建议吗?我知道这是可能的。然而,苹果显然很难找到它。我非常怀疑这在不使用私有框架的情况下是否可行。(例如 CoreTelephony)。由于这是一个越狱的应用程序,我可能会使用 SpringBoard 中的注入代码对运营商名称进行屏幕抓取,但我真的不想走这条路。非常感谢任何建议。谢谢。

4

3 回答 3

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]);
}
于 2009-06-08T19:45:31.677 回答
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。

于 2011-11-12T09:51:58.257 回答
0

在非越狱设备上,您可以使用http://ipinfo.io (我自己的服务)等第三方服务,根据设备的 IP 地址找出当前所在国家/地区的运营商代码,然后您可以将其与CTC 运营商详细信息,以确定设备是否正在漫游。这是标准的 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

于 2014-08-09T19:11:50.863 回答