有没有办法让NSBundle本地化缓存无效,重启应用程序?[iOS的]

tt.*_*lew 5 iphone private localizable.strings ios

假设我们可以在运行时更改Localizable.strings,它放在NSBundle中.在当前时刻,即使我们更改它的内容,NSLocalizedString也会返回旧的(缓存)值.

  1. 运行应用程序
  2. 获取特定key1 < - value1的LocalizableString
  3. 更改Localizable.strings key1 = value2
  4. < - 在应用程序中执行某些操作以使本地化缓存无效 - >
  5. 检查LocalizableString是否为特定key1 == value2

我已经尝试过的:

  • [[NSBundble mainBundle] invalidateResourceCache]
  • [UIApplication _performMemoryWarning]
  • 试图看,如果有一些词典.用于缓存,在NSBundle的ivars中.
  • 试图在GNUStep中实现NSBundle,但它与我们在ios 6.0中的不同

我不能做什么(根据定义): - 我不能调和[NSBundle localizableStringForKey:value:table] - 我不能改变宏 - 一般来说,我不能影响任何原始项目代码,只在第4步添加一些东西

这仅用于开发目的.所以,我不需要在AppStore中发布它,所以任何私有方法或解决方案都可以.

所以,问题是.可能有人知道这样做的方法,还是有人给我另一个想法怎么做呢?谢谢.

tt.*_*lew 2

注意:此解决方案使用私有 API,如果您使用此代码,您向 App Store 提交的应用程序将被拒绝。

因此,经过一番搜索后,我找到了对我有帮助的链接

如何删除 NSBundle 缓存

// First, we declare the function. Making it weak-linked 
// ensures the preference pane won't crash if the function 
// is removed from in a future version of Mac OS X.
extern void _CFBundleFlushBundleCaches(CFBundleRef bundle) 
  __attribute__((weak_import));

BOOL FlushBundleCache(NSBundle *prefBundle) {
    // Before calling the function, we need to check if it exists
    // since it was weak-linked.
    if (_CFBundleFlushBundleCaches != NULL) {
        NSLog(@"Flushing bundle cache with _CFBundleFlushBundleCaches");
        CFBundleRef cfBundle =
           CFBundleCreate(nil, (CFURLRef)[prefBundle bundleURL]);
        _CFBundleFlushBundleCaches(cfBundle);
        CFRelease(cfBundle);
        return YES; // Success
    }
    return NO; // Not available
}
Run Code Online (Sandbox Code Playgroud)

刷新包缓存后,将使用新的本地化密钥。因此,现在我不需要在模拟器中重新启动应用程序即可查看可本地化字符串的更改。