WebView中的本地存储不是持久的

时间:2011-11-20 00:19:22

标签: objective-c cocoa webview local-storage

我正在尝试让本地存储在Cocoa中的WebView中工作。我使用了代码shown here in another SO question,但它对我不起作用。正确创建本地存储并使其内容保持重新加载,但无论何时重新启动应用程序,都会立即删除旧的本地存储。

例如,我创建了一个新项目并在窗口中设置了一个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 个答案:

答案 0 :(得分:9)

经过很多痛苦和挫折之后,我找到了一种启用本地存储的方法,并让它在应用程序运行中保持正常运行。此解决方案专门针对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中正确修复它。

答案 1 :(得分:5)

OS X上的

WebView目前不支持localStorage。要求此功能的最佳方式是在 https://developer.apple.com/bugreporter/提交错误,并提及它与#11026838的副本。

您必须使用Cocoa API存储数据,以便在应用程序启动时保留它。

对于像数据这样简单的“首选项”,NSUserDefaults是最佳解决方案。它是一个简单的键/值存储,类似于localStorage提供的。

对于更复杂的数据,您可能需要查看NSKeyedArchiverNSKeyedUnarchiver,请参阅Archives and Serializations Programming Guide

对于极其复杂或高性能的数据,您可以使用Core Data

有关互操作Objective-C和JavaScript的更多信息,请参阅Calling Objective-C Methods From JavaScript