После долгих болей и разочарований я нашел способ включить локальное хранилище и обеспечить его постоянное хранение во всех приложениях. Это решение специально для OSX, но может быть применимо и к iOS.
Скачайте и добавьте этот заголовочный файл в ваш проект. Он не включен в дистрибутив XCode Webkit.
нажмите, чтобы загрузить WebStorageManagerPrivate.h
Добавьте к этому следующие строки:
static NSString* _storageDirectoryPath();
+ (NSString *)_storageDirectoryPath;
Они позволяют вам получить местоположение каталога базы данных трекера локального хранилища WebKit. Это важно, потому что из-за ошибки в WebKit, если вы не храните файлы LocalStorage WebView в том же каталоге, что и база данных трекера, они удаляются при каждом запуске приложения. Я не видел способа в коде WebStorageManager изменить это местоположение для отдельного приложения. Он всегда читается из пользовательских настроек.
Включите WebStorageManagerPrivate.h в ваше приложение Delegate.
#include "WebStorageManagerPrivate.h"
Вам необходимо скачать и включить в свой проект другой заголовок, не включенный в дистрибутив XCode. Сохраните его как WebPreferencesPrivate.h
нажмите, чтобы загрузить WebPreferencesPrivate.h
Включите WebPreferencesPrivate.h в ваше приложение Delegate.
#include "WebPreferencesPrivate.h"
Теперь используйте код ниже в вашем обработчике applicationDidFinishLaunching для инициализации и включения LocalStorage. Код предполагает, что у вас есть IBOutlet с именем «webView» для используемого вами WebView.
NSString* dbPath = [WebStorageManager _storageDirectoryPath];
WebPreferences* prefs = [self.webView preferences];
NSString* localDBPath = [prefs _localStorageDatabasePath];
// PATHS MUST MATCH!!!! otherwise localstorage file is erased when starting program
if( [localDBPath isEqualToString:dbPath] == NO) {
[prefs setAutosaves:YES]; //SET PREFS AUTOSAVE FIRST otherwise settings aren't saved.
// Define application cache quota
static const unsigned long long defaultTotalQuota = 10 * 1024 * 1024; // 10MB
static const unsigned long long defaultOriginQuota = 5 * 1024 * 1024; // 5MB
[prefs setApplicationCacheTotalQuota:defaultTotalQuota];
[prefs setApplicationCacheDefaultOriginQuota:defaultOriginQuota];
[prefs setWebGLEnabled:YES];
[prefs setOfflineWebApplicationCacheEnabled:YES];
[prefs setDatabasesEnabled:YES];
[prefs setDeveloperExtrasEnabled:[[NSUserDefaults standardUserDefaults] boolForKey: @"developer"]];
#ifdef DEBUG
[prefs setDeveloperExtrasEnabled:YES];
#endif
[prefs _setLocalStorageDatabasePath:dbPath];
[prefs setLocalStorageEnabled:YES];
[self.webView setPreferences:prefs];
}
Я надеюсь, что это помогает другим бороться или все еще борется с этой проблемой, пока она не будет исправлена должным образом в WebKit.