Есть ли способ аннулировать кэш локализации NSBundle, без перезапуска приложения? [УСВН]



Предположим, что мы можем изменить во время выполнения локализуемый.строки, которые помещаются в NSBundle
В настоящий момент, даже если мы изменим его содержимое, NSLocalizedString вернет старые(кэшированные) значения.




  1. Запустить Приложение

  2. получить LocalizableString для конкретного key1

  3. Изменение Локализуемо.строки key1 = value2


  4. Проверьте, если LocalizableString для конкретного key1 == значение2


То, что я уже пробовал:




  • [[NSBundble mainBundle] invalidateResourceCache]

  • [UIApplication _performMemoryWarning]

  • попробовал посмотреть, есть ли какие-нибудь словари. используется для кэширования, в ivars в NSBundle.

  • пытался увидеть, в GNUStep реализация NSBundle, но это отличается от того, что мы имеем в ios 6.0


То, что я не могу сделать (по определению):
- Я не могу swizzle [NSBundle localizableStringForKey: value: table]
- Я невозможно изменить макросы
- В общем, я не могу повлиять на исходный код проекта, только добавить что-то на шаге #4



Это только для целей развития. Поэтому мне не нужно публиковать его в AppStore или что-то еще, поэтому любые частные методы или решения в порядке.



Итак, вопрос в том. Может быть, кто-то знает, как это сделать, или кто-то, кто дает мне другие идеи, как это сделать? Спасибо.

682   1  

1 ответ:

Примечание: это решение использует частные 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
}

После очистки кэша пакетов используются новые ключи локализации. Так что теперь мне не нужно перезапускать приложение в симуляторе, чтобы увидеть изменения в локализуемых строках.

Comments

    Ничего не найдено.