我正在开发一个 iPhone 应用程序,并且非常想确定该设备是否正在漫游,以便我可以智能地避免用户在脱离家庭网络时花费昂贵的连接费用。
我正在编写的应用程序适用于越狱手机,但如果可能的话,我更愿意使用标准 SDK。
这是我已经发现的:
1.苹果SDK:在苹果文档中,我在苹果的 SCNetworkReachability API 中找到了承诺。该 API 提供对诸如您是否在 WIFI 还是手机网络、当前是否建立网络连接等信息的访问。但是,在 SCNetworkReachability API 参考 pdf 中搜索“漫游”或“漫游”,结果均为零。他们的示例代码也是如此。
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的类转储源:我已经使用转储了 SpringBoard 的类类转储 http://www.codethecode.com/projects/class-dump/。我找不到任何提及“漫游”或“漫游”的内容
4.显然我首先检查了SO:找不到任何相关内容。
进一步的步骤:这里有人有什么建议吗?
我知道这是可能的。然而,苹果显然让它变得非常难以找到。我非常怀疑如果不使用私有框架这是可能的。 (例如 CoreTelephony)。由于这是一个越狱的应用程序,我可能会通过在 SpringBoard 中注入代码来屏幕抓取运营商名称,但我真的宁愿不走这条路。非常感谢任何建议。谢谢。
有!它根本没有记录,我非常怀疑这是否适用于未越狱的手机(因为它需要使用不在沙箱中的文件)。然而,这是如何完成的。
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]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)