我有一个Cocoa / Objective-C的应用程序,它嵌入了一个WebKit的web视图。我须要打开的数据库支持和本地存储。我知道这是能够作到-我有它在Safari中工做-但我没法找到如何设置这在我本身的应用程序的示例。 我发现这个(未回答)问题的SO它提供了一个例子,但正如原来不起做用。而事实上,(setDatabasesEnabled,setLocalStorageEnabled)没有在个人WebKit的定义。 (Xcode的3.2.5),尽管它们彷佛存在,若是我定义他们本身。 任何人均可以提供如何启用本地数据库存储的基于WebKit的Cocoa应用程序的例子吗?很是感谢 CodeGo.net,若是这样的! 更新:我有工做...我是经过“数据库”与“本地存储”,这显然是彻底不一样的东西。下面是工做的代码:javascript
WebPreferences* prefs = [webView preferences]; [prefs _setLocalStorageDatabasePath:@"~/Library/Application Support/MyApp"]; [prefs setLocalStorageEnabled:YES];
这样的做品,但它须要_setLocalStorageDatabasePath,没有App Store的因此我修正问题如今是:有没有办法,使这项工做不使用,我发如今这个答案的WebDatabaseDirectory首选项键,可控制数据库的地方去。但我没法找到相应的密钥本地存储在源的任何地方。或者是有没有办法迫使本地存储的数据库,因此WebDatabaseDirectory键?任何想法?
本文地址 :CodeGo.net/234678/ java
-------------------------------------------------------------------------------------------------------------------------
1. 我提交了这个代码在Mac App Store,苹果批准了:web
WebPreferences* prefs = [webView preferences]; [prefs _setLocalStorageDatabasePath:@"~/Library/Application Support/MyApp"]; [prefs setLocalStorageEnabled:YES];
他们是否会继续批准,我不知道,但他们容许它为个人应用程序为2011-01-29。更新:他们还批准了版本更新的应用程序,因此它已经经历了两次。
2. 我要采起的Javascript,以Objective-C的引桥和储存全部的核心数据。设置的localStorage为false,而后创建一个JS对象和实例“localStorage中”与个人JavaScript开发者不会知道其中的差异 CodeGo.net,并且我已经有作的事情与空气(基本)。还有另外一种方式离开localStorage的无缺,即便它实际上并无将它们存储在持久性数据库。该可经过在javascript中进行迭代,并从那里操纵,但我认为这将是干脆用本身的替换对象。
3. 通过了不少痛苦,我找到了一种方法,使本地存储,并将它坚持跨应用程序正常运行。这个解决方案是专门针对OSX,但它可能适用于iOS的为好。 下载并添加这个头文件到您的项目。它不包括在XCode中的Webkit分布。 点击下载WebStorageManagerPrivate.h 添加到它,下面几行:数据库
static NSString* _storageDirectoryPath(); + (NSString *)_storageDirectoryPath;
这容许您检索WebKit的本地存储轨迹数据库的目录位置。这是因为在WebKit的一个bug重要的,若是你不存储在目录中的轨迹数据库的localStorage中的WebView文件,它们都将被删除全部其余运行您的应用程序。我没有看到一个办法在WebStorageManager代码来更改此位置为单个应用程序。它老是从优先读出。 包括WebStorageManagerPrivate.h在你的AppDelegate。app
#include "WebStorageManagerPrivate.h"
您须要下载并包含在你的项目不包括在XCode中分布的另外一头。将其保存为WebPreferencesPrivate.h 点击下载WebPreferencesPrivate.h 包括WebPreferencesPrivate.h在你的AppDelegate。spa
#include "WebPreferencesPrivate.h"
在下面的applicationDidFinishLaunching处理程序中的代码来初始化并启用localStorage中。你有一个IBOutlet'web视图'为的WebView你的代码.net
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中正确固定。localstorage