Локальное хранилище в WebView не является постоянным - PullRequest
6 голосов
/ 20 ноября 2011

Я пытаюсь заставить локальное хранилище работать в WebView в Какао.Я использовал код , показанный здесь в другом вопросе SO , но он не работает для меня должным образом.Локальное хранилище создается правильно и сохраняет его содержимое при перезагрузках, но всякий раз, когда приложение перезапускается, старое локальное хранилище немедленно удаляется.

Например, я создал новый проект и настроил WebView внутри окна,Затем я помещаю следующий код в мой AppDelegate.m:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    WebPreferences *prefs = [webView preferences];
    [prefs _setLocalStorageDatabasePath:@"~/Library/Application Support/Test"];
    [prefs setLocalStorageEnabled:YES];

    [webView setMainFrameURL:@"http://static.diveintojavascript.com/files/tutorials/web-storage-contacts/contacts.html"];
}

Локальное хранилище правильно хранится в правильной папке и остается там даже после выхода из приложения, но когда приложение запускается снова, старый локальныйхранилище удалено и создан новый файл.

Ответы [ 2 ]

9 голосов
/ 09 августа 2013

После долгих болей и разочарований я нашел способ включить локальное хранилище и обеспечить его постоянное хранение во всех приложениях. Это решение специально для 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.

5 голосов
/ 31 марта 2012

WebView в OS X не поддерживает localStorage в настоящее время. Лучший способ запросить эту функцию - отправить сообщение об ошибке на https://developer.apple.com/bugreporter/ и указать, что это дубликат # 11026838.

Вам придется хранить ваши данные с помощью API-интерфейсов Cocoa, чтобы сохранять их при каждом запуске приложения.

Для простых данных типа «предпочтение», NSUserDefaults является лучшим решением. Это простое хранилище ключей / значений, подобное тому, что предлагает localStorage.

Более сложные данные, которые вы можете посмотреть, используя NSKeyedArchiver и NSKeyedUnarchiver, см. Руководство по программированию архивов и сериализаций .

Для чрезвычайно сложных или высокопроизводительных данных вы можете использовать Базовые данные .

Для получения дополнительной информации о взаимодействии Objective-C и JavaScript см. Вызов методов Objective-C из JavaScript .

...