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

时间:2012-11-23 08:54:03

标签: iphone ios private localizable.strings

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

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

    我已经尝试过:

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

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

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

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

2 个答案:

答案 0 :(得分:2)

  

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

所以,经过一些搜索,我找到了帮助我的链接

How to remove NSBundle cache

// 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
}

刷新捆绑缓存后,将使用新的本地化密钥。 所以现在我不需要在模拟器中重启我的应用程序,以便查看可本地化字符串的变化。

答案 1 :(得分:0)

您可以使用 uncache 解决方案。

Localizable.nocache.strings文件夹中使用lproj

例如example.bundle/Resources/de.lproj/Localizable.nocache.strings

通过FileManager获取url后,加载本地化的字符串。

func localizedString(key: String) -> String {
   let bundle = Bundle(url: bundleUrl)
   return bundle.localizedString(forKey: key, value: nil, table: "Localizable.nocache")
}