如何在基于WebKit的应用程序中启用本地存储?
我有一个embeddedWebKit WebView的Cocoa / Objective-C应用程序。 我需要打开数据库支持和本地存储。 我知道这是可以做到的 – 我已经在Safari上工作了 – 但我找不到如何在我自己的应用程序中设置的例子。
我发现这个(未答复的)SO问题提供了一个例子,但是,正如原来的海报所提到的,这个问题不起作用。 事实上,他使用的方法(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的我。 所以我现在修改的问题是:有没有办法使这个工作, 而不使用私人方法? 我在这个答案中find了WebDatabaseDirectory首选项 ,它控制着数据库的位置 。 但是我找不到源中任何位置的本地存储的相应密钥。 或者有没有办法让我强制本地存储使用数据库,所以WebDatabaseDirectory的关键? 有任何想法吗?
我提交了一个应用程序使用这个代码到Mac App Store,苹果公司批准它:
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年1月29日起允许我申请。 更新:他们也批准了一个版本更新到同一个应用程序,所以它经历了两次。
我将采用Javascript到Objective-C的桥接方式,并将所有内容存储在核心数据中。 将localStorage设置为false,然后使用相同的方法构build一个名为“localStorage”的JS对象和一个实例。 我的JavaScript开发人员不知道差异,我已经不得不做空气(基本上)同样的事情。 还有另一种方法可以让localStorage保持完整,即使它并没有实际存储在一个持久数据库中。 元素可以在javascript中迭代并从那里操作,但是我认为用我自己的方法replace对象会更好。
在经历了很多痛苦和挫折之后,我发现了一种启用本地存储的方法,并且在应用程序正常运行的过程中持续存在。 该解决scheme专门用于OSX,但也可能适用于iOS。
下载并将此头文件添加到您的项目。 它不包含在XCode Webkit发行版中。
点击下载WebStorageManagerPrivate.h
添加到它,以下行:
static NSString* _storageDirectoryPath(); + (NSString *)_storageDirectoryPath;
这些允许您检索WebKit本地存储跟踪器数据库的目录位置。 这很重要,因为由于WebKit中的一个错误,如果您不将LocalStorage WebView文件与跟踪器数据库存储在同一个目录中,则每隔一次运行应用程序时都会将其删除。 我没有看到在WebStorageManager代码中更改单个应用程序的位置。 它总是从用户偏好中读取。
在您的appDelegate中包含WebStorageManagerPrivate.h。
#include "WebStorageManagerPrivate.h"
您需要下载并在您的项目中包含另一个未包含在XCode分发中的头文件。 将其保存为WebPreferencesPrivate.h
点击下载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中正确解决问题。