如何卸载NSBundle?

4
我有一个场景,需要从服务器下载本地化文件。我在应用程序启动时下载文件,并将其存储在包中的文件夹中。例如,如果是英文文件,则将其存储在名为“en.lproj”且文件名为“Localizable.strings”的文件夹下。
现在,当文件被下载后,我使用"bundleWithPath:"方法加载包。一旦它加载完成,我使用"NSLocalizedStringFromTableInBundle(key, @"Localizable", bundle, @"")"方法来显示本地化信息。
到这里为止,一切正常。 但是,如果文件从服务器更新,我将再次下载英文文件,并替换旧文件。 但是,应用程序仍然显示来自已替换的旧文件的本地化信息。 请问是否有方法可以重新加载NSBundle以反映更新?
在上述场景中,当文件被更新时,应用程序未被杀死。 如果我杀死应用程序并重新启动它,那么更改就会反映出来。 但是我希望在不杀死应用程序的情况下反映更改。
有没有方法可以卸载已加载的NSBundle?

在真实的iOS设备上,您无法更新应用程序的捆绑包 - 它是只读的。 - rmaddy
1
@rmaddy:这不是主要的捆绑包。我正在创建一个新的捆绑包。因此,我们可以通过编码来进行任何更改。 - Chetan
1个回答

4

收到答案了。

这段代码有帮助。它用于清除已加载的bundle缓存。

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
_CFBundleFlushBundleCaches 是一个私有 API。如果你尝试提交到 App Store,你的应用将会被苹果拒绝。 - chubao
2
@DavidCheung:谢谢David。是的,我后来发现了这个问题。我的应用被拒绝了。我改变了使用bundle的方法,改为使用静态NSDictionary,这对我很有帮助。谢谢。 - Chetan
2
你能发一篇更完整的答案吗?谢谢。 - chubao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接