我正在尝试让本地存储在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"];
}
本地存储正确存储在正确的文件夹中,即使在退出应用程序后也会保留在那里,但是当应用程序再次启动时,旧的本地存储将被删除并创建一个新文件。
答案 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)
WebView
目前不支持localStorage
。要求此功能的最佳方式是在 https://developer.apple.com/bugreporter/提交错误,并提及它与#11026838的副本。
您必须使用Cocoa API存储数据,以便在应用程序启动时保留它。
对于像数据这样简单的“首选项”,NSUserDefaults是最佳解决方案。它是一个简单的键/值存储,类似于localStorage提供的。
对于更复杂的数据,您可能需要查看NSKeyedArchiver
和NSKeyedUnarchiver
,请参阅Archives and Serializations Programming Guide。
对于极其复杂或高性能的数据,您可以使用Core Data。
有关互操作Objective-C和JavaScript的更多信息,请参阅Calling Objective-C Methods From JavaScript。