有没有一种方法可以通过重新启动应用程序使NSBundle本地化缓存无效?[iOS]



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

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

我已经尝试过的:

  • [[NSBundle mainBundle]invalidateResourceCache]
  • [UIApplication_performMemoryWarning]
  • 试着看看有没有字典。用于缓存,位于NSBundle中的ivars中
  • 试着看看,在NSBundle的GNUStep实现中,但它与我们在ios 6.0中的不同

我不能做的事情(根据定义):-我无法swizzle[NSBundle localizableStringForKey:value:table]-我不能改变宏观-一般来说,我不能影响任何原始项目代码,只能在步骤#4添加一些

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

所以,问题是。可能是有人知道怎么做,或者有人给了我另一个如何做的想法?非常感谢。

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

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

如何删除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
}

刷新捆绑包缓存后,将使用新的本地化键。所以现在我不需要在模拟器中重新启动我的应用程序来查看可本地化字符串的更改。

您可以使用uncache解决方案。

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

例如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")
}

最新更新