2009-05-23 45 views
21

我正在研究一个iPhone应用程序,并且真的想确定设备是否在漫游,这样我就可以智能地避免我的用户在家庭网络外花费昂贵的连接。有什么方法可以确定iPhone是否在漫游?

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

以下是我已经发现:

1.苹果的SDK: 在苹果的文档,我发现苹果的SCNetworkReachability API的承诺。该API提供对诸如您是否在WIFI或手机网络,目前是否建立了网络连接等等的访问。但是,搜索“漫游”或“漫游”的SCNetworkReachability API参考文档都将变为零。他们的示例代码也是如此。

2.越狱iPhone的FS: 首选项 - >一般 - >网络选项卡是用户可以打开或关闭他们的漫游。展望这个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.检查类倾倒跳板来源: 我甩了跳板使用class-dump的类。我无法找到“漫游”或“漫游”

4.很显然,我开始通过SO检查此的任何引用: 无法找到任何有关。

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

+0

你可以试试[Apple Developer Forums](http://devforums.apple.com/)。 – 2009-05-23 04:51:59

回答

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

不错!有趣的解决方案。 – AriX 2009-06-09 17:51:47

+1

此解决方案是否适合您? – 2009-12-17 13:44:49

+0

是的。如果它不适合我,我不会为你写下它。然而,我在一个越狱系统上。如前所述,怀疑它会在普通的iphone程序中工作。 – Aftermathew 2010-02-05 23:22:48

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(体内)。 操作员(实际上是我的手机连接的一个 - 我正在漫游)位于文件夹20810内,这意味着MCC 208(法国)和MNC 10(SFR)。

顺便说一句,我使用iOS 5的iPhone 4。

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

相关问题