iOS:有没有办法伪造用户';什么地方?

iOS:有没有办法伪造用户';什么地方?,ios,localization,nsbundle,Ios,Localization,Nsbundle,我对允许我的用户选择我的应用程序显示给他们的语言/地区感兴趣。我已经知道了如何加载正确的捆绑包,选择正确的字符串文件,等等。然而,一些系统项我似乎仍然无法控制。例如,开关控制 我有没有办法告诉系统,这个应用现在应该使用特定的语言,而不是用户当前的系统设置?最简单的方法是通过NSUserDefaults:语言环境由AppleScale确定(语言环境ID为字符串)语言由AppleLanguages(语言ID数组)中的第一个匹配确定;您的应用程序只能覆盖应用程序的这些默认设置。要检查它是否被应用程序覆

我对允许我的用户选择我的应用程序显示给他们的语言/地区感兴趣。我已经知道了如何加载正确的捆绑包,选择正确的字符串文件,等等。然而,一些系统项我似乎仍然无法控制。例如,开关控制


我有没有办法告诉系统,这个应用现在应该使用特定的语言,而不是用户当前的系统设置?

最简单的方法是通过
NSUserDefaults
:语言环境由
AppleScale
确定(语言环境ID为字符串)语言由
AppleLanguages
(语言ID数组)中的第一个匹配确定;您的应用程序只能覆盖应用程序的这些默认设置。要检查它是否被应用程序覆盖,您可以使用类似于
[defaults persistentDomainForName:[[NSBundle mainBundle]bundleIdentifier]]objectForKey:@“AppleLocale”]
的内容。要删除覆盖,请使用
-removeObjectForKey:

无论你用哪种方式,当你改变语言时,你都可能不得不这样做;OSX和iOS应用程序根本不是为了在运行时更改语言而设计的(在OSX上,只有新启动的应用程序才会看到语言更改;在iOS上,系统会关闭所有应用程序以更改语言)


我添加了这个特性,使切换语言更易于开发/测试;我不知道这是否会使应用商店审查过程失败。

Whoa-whoo<代码>方法\u setImplementation(类\u getInstanceMethod([NSLocale类],@selector(currentLocale)),(IMP)spoofedImpl)?有没有办法不进行swizzling?您是否尝试过为NSLocale创建一个类别,以返回您为类方法选择的区域设置?@MarcusAdams这比方法swizzling更糟糕,因为类别上的override方法未定义behaviour@Mike成为苹果的软件开发人员,致力于UIKit,创建一个秘密/私有方法,允许您执行此操作,并将其放在下一版本的iOS中。谢谢@tc。听起来这可能是一件值得远离的事情,但我很欣赏详细的选择。