有没有什么方法可以确定iPhone是否在漫游?
我正在开发一个iPhone应用程序,并且真的想确定设备是否在漫游,这样我就可以智能地避免我的用户在家庭networking之外花费昂贵的连接。
我写的应用程序是越狱手机,但是如果可能的话,我宁愿使用标准的SDK。
这是我已经find的:
1.苹果SDK:在苹果文档中,我发现了苹果SCNetworkReachability API的承诺。 该API提供对诸如无论是在WIFI上还是在手机networking上的接入,是否正在build立networking连接等等。然而,search“漫游”或“漫游”的SCNetworkReachability API参考文献都是零。 他们的示例代码也是如此。
2.越狱的iPhone FS的grep:首选项 – >一般 – >networking选项卡是用户可以打开或closures他们的漫游。 查看plist文件(“/Applications/Preferences/Network.plist”),我可以find以下参考:
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的类抛弃源:我使用类抛弃抛弃了SpringBoard的类 。 我无法find任何引用“漫游”或“漫游”
显然,我开始检查在这个SO:找不到任何相关的东西。
进一步的步骤:有没有人有任何build议吗? 我知道这是可能的。 然而,苹果显然已经使它很难find。 我非常怀疑这是可能的,而不使用私人框架。 (如CoreTelephony)。 由于这是一个越狱应用程序,我可能会采取在SpringBoard中通过注入代码来屏幕截取运营商名称,但我真的宁愿不去那条路线。 任何build议非常感谢。 谢谢。
有! 它没有logging在案,我非常怀疑这将在非越狱手机上工作(因为它需要使用不在沙箱中的文件)。 但是,这是如何完成的。
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]); }
符号链接的解决scheme并不是唯一的方法,但绝对是最好的。 我刚刚意识到,返回的string包含运营商和运营商的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)。
顺便说一下,我使用iOS 5的iPhone 4。
在非越狱设备上,您可以使用http://ipinfo.io (我自己的服务)等第三方服务根据设备的IP地址find即使是运营商代码的当前国家,然后您可以将其与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 。