如何在基于WebKit的应用程序中启用本地存储?

时间:2010-12-24 18:59:21

标签: objective-c ios webkit local-storage

我有一个嵌入WebKit WebView的Cocoa / Objective-C应用程序。我需要打开数据库支持和本地存储。我知道它可以完成 - 我在Safari中工作 - 但我找不到如何在我自己的应用程序中设置它的示例。

我发现this (unanswered) SO question提供了一个例子,但正如原始海报所提到的那样,它不起作用。事实上,他使用的方法(setDatabasesEnabled,setLocalStorageEnabled)没有在我的WebKit.framework(Xcode 3.2.5)中定义,尽管如果我自己定义它们似乎存在。

任何人都可以提供一个如何为基于WebKit的Cocoa应用程序启用本地数据库存储的示例吗?非常感谢,如果是这样的话!

更新:我有一些工作......我对“数据库”与“本地存储”感到困惑,这显然是完全不同的东西。这是有效的代码:

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

这样可行,但它需要私有方法_setLocalStorageDatabasePath,这意味着我没有App Store。所以我现在修改过的问题是:有没有办法让这个工作没有使用私有方法?我找到了WebDatabaseDirectory preference key in this answer,它控制数据库的去向。但我无法在源中的任何位置找到相应的本地存储密钥。或者有没有办法强制本地存储使用数据库,所以WebDatabaseDirectory键?有什么想法吗?

3 个答案:

答案 0 :(得分:11)

我使用此代码将应用程序提交到Mac App Store,Apple批准了它:

<强>目标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,他们已将其用于我的申请。 更新:他们还批准对同一个应用进行版本更新,因此已经过两次。

答案 1 :(得分:4)

我将采用Javascript到Objective-C桥接方法并将所有内容存储在核心数据中。将localStorage设置为false,然后使用相同的方法构建JS对象和名为“localStorage”的实例。我的javascript开发人员不会知道差异,我已经不得不用Air(基本上)做同样的事情。还有另一种方法可以保持localStorage完好无损,即使它实际上并没有将它们存储在持久数据库中。元素可以在javascript中迭代并从那里进行操作,但我认为用自己的方法替换对象会更好。

答案 2 :(得分:4)

经过很多痛苦和挫折之后,我找到了一种启用本地存储的方法,并让它在应用程序运行中保持正常运行。此解决方案专门针对OSX,但也可能适用于iOS。

下载此标题文件并将其添加到您的项目中。它不包含在XCode Webkit发行版中。

click to download WebStorageManagerPrivate.h

添加到它,以下行:

static NSString* _storageDirectoryPath();
+ (NSString *)_storageDirectoryPath;

这些允许您检索WebKit本地存储跟踪器数据库的目录位置。这很重要,因为由于WebKit中的错误,如果您不将LocalStorage WebView文件存储在与跟踪器数据库相同的目录中,则每次运行应用程序时都会删除它们。我没有在WebStorageManager代码中看到为单个应用程序更改此位置的方法。它总是从用户首选项中读取。

在appDelegate中包含WebStorageManagerPrivate.h。

#include "WebStorageManagerPrivate.h"

您需要在项目中下载并包含XCode发行版中未包含的其他标头。将其另存为WebPreferencesPrivate.h

click to download WebPreferencesPrivate.h

在appDelegate中包含WebPreferencesPrivate.h。

#include "WebPreferencesPrivate.h"

现在在applicationDidFinishLaunching处理程序中使用以下代码初始化并启用LocalStorage。该代码假定您有一个名为“webView”的IBOutlet用于您正在使用的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中正确修复它。