Есть ли способ аннулировать кэш локализации NSBundle, без перезапуска приложения? [УСВН]
Предположим, что мы можем изменить во время выполнения локализуемый.строки, которые помещаются в NSBundle
В настоящий момент, даже если мы изменим его содержимое, NSLocalizedString вернет старые(кэшированные) значения.
- Запустить Приложение
- получить LocalizableString для конкретного key1
- Изменение Локализуемо.строки key1 = value2
- Проверьте, если LocalizableString для конкретного key1 == значение2
То, что я уже пробовал:
- [[NSBundble mainBundle] invalidateResourceCache]
- [UIApplication _performMemoryWarning]
- попробовал посмотреть, есть ли какие-нибудь словари. используется для кэширования, в ivars в NSBundle.
- пытался увидеть, в GNUStep реализация NSBundle, но это отличается от того, что мы имеем в ios 6.0
То, что я не могу сделать (по определению):
- Я не могу swizzle [NSBundle localizableStringForKey: value: table]
- Я невозможно изменить макросы
- В общем, я не могу повлиять на исходный код проекта, только добавить что-то на шаге #4
Это только для целей развития. Поэтому мне не нужно публиковать его в AppStore или что-то еще, поэтому любые частные методы или решения в порядке.
Итак, вопрос в том. Может быть, кто-то знает, как это сделать, или кто-то, кто дает мне другие идеи, как это сделать? Спасибо.
1 ответ:
Примечание: это решение использует частные API, и ваши приложения, отправленные в App Store, будут отклонены, если вы используете этот код.
Итак, после некоторого поиска я нашел ссылку, которая помогла мне
// 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 }После очистки кэша пакетов используются новые ключи локализации. Так что теперь мне не нужно перезапускать приложение в симуляторе, чтобы увидеть изменения в локализуемых строках.
Comments