Как включить локальное хранилище в приложении на базе WebKit? - PullRequest
11 голосов
/ 24 декабря 2010

У меня есть приложение Cocoa / Objective-C, в которое встроен WebKit WebView. Мне нужно включить поддержку базы данных и локальное хранилище. Я знаю, что это можно сделать - у меня это работает в Safari - но я не могу найти пример того, как настроить это в моем собственном приложении.

Я нашел этот (неотвеченный) ТАК вопрос , который дает пример, но, как упоминает оригинальный автор, не работает. И на самом деле методы, которые он использует (setDatabasesEnabled, setLocalStorageEnabled), не определены в моем WebKit.framework (Xcode 3.2.5), хотя, как мне кажется, они существуют, если я сам их определю.

Может ли кто-нибудь привести пример того, как включить локальное хранилище базы данных для приложения Cocoa на основе WebKit? Большое спасибо, если так!

Обновление: У меня что-то работает ... Меня смутили "базы данных" и "локальное хранилище", которые, по-видимому, совершенно разные вещи. Вот код, который работает:

WebPreferences* prefs = [webView preferences];
[prefs _setLocalStorageDatabasePath:@"~/Library/Application Support/MyApp"];
[prefs setLocalStorageEnabled:YES];

Так что это работает, но для этого требуется закрытый метод _setLocalStorageDatabasePath, что означает отсутствие App Store для меня. Итак, мои исправленные вопросы сейчас: есть ли способ заставить эту работу без с использованием частного метода? В этом ответе я обнаружил ключ предпочтения WebDatabaseDirectory , который определяет, куда базы данных идут. Но я не смог найти соответствующий ключ для локального хранилища в источниках. Или у меня есть способ заставить локальное хранилище использовать базу данных, и поэтому ключ WebDatabaseDirectory? Есть идеи?

Ответы [ 3 ]

11 голосов
/ 31 января 2011

Я отправил приложение с помощью этого кода в Mac App Store, и Apple одобрила его:

Objective-C

WebPreferences* prefs = [webView preferences];
[prefs _setLocalStorageDatabasePath:@"~/Library/Application Support/MyApp"];
[prefs setLocalStorageEnabled:YES];

Swift 3

var prefs: WebPreferences? = webView.preferences
prefs?._setLocalStorageDatabasePath("~/Library/Application Support/MyApp")
prefs?.localStorageEnabled = true

Будут ли они продолжать утверждать это, я не знаю, но они разрешили это для моего заявления на 2011-01-29. Обновление: Они также одобрили обновление версии для того же приложения, поэтому оно прошло дважды.

4 голосов
/ 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.

4 голосов
/ 07 января 2011

Я собираюсь взять подход от Javascript к мосту Objective-C и сохранить все в основных данных. Установите для localStorage значение false, затем создайте объект JS и экземпляр с именем «localStorage» теми же методами. Мои разработчики javascript не будут знать разницу, и мне уже приходилось делать то же самое с Air (в основном). Есть еще один способ оставить localStorage нетронутым, даже если он не хранит их в постоянной базе данных. Элементы можно перебирать в javascript и манипулировать оттуда, но я думаю, что будет лучше просто заменить объект своим собственным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...