Objective c 如何在基于WebKit的应用程序中启用本地存储?
我有一个Cocoa/Objective-C应用程序,它嵌入了WebKit WebView。我需要打开数据库支持和本地存储。我知道这是可以做到的——我让它在Safari中工作——但我找不到一个如何在我自己的应用程序中设置它的示例 我发现这提供了一个例子,但正如最初的海报所提到的,不起作用。事实上,他使用的方法(setDatabasesEnabled、setLocalStorageEnabled)并没有在我的WebKit.framework(Xcode 3.2.5)中定义,尽管如果我自己定义它们,它们似乎是存在的 有人能举个例子说明如何为基于WebKit的Cocoa应用程序启用本地数据库存储吗?非常感谢 更新:我有些东西在工作……我被“数据库”和“本地存储”弄糊涂了,它们显然是完全不同的东西。以下是有效的代码:Objective c 如何在基于WebKit的应用程序中启用本地存储?,objective-c,ios,webkit,local-storage,Objective C,Ios,Webkit,Local Storage,我有一个Cocoa/Objective-C应用程序,它嵌入了WebKit WebView。我需要打开数据库支持和本地存储。我知道这是可以做到的——我让它在Safari中工作——但我找不到一个如何在我自己的应用程序中设置它的示例 我发现这提供了一个例子,但正如最初的海报所提到的,不起作用。事实上,他使用的方法(setDatabasesEnabled、setLocalStorageEnabled)并没有在我的WebKit.framework(Xcode 3.2.5)中定义,尽管如果我自己定义它们,它
WebPreferences* prefs = [webView preferences];
[prefs _setLocalStorageDatabasePath:@"~/Library/Application Support/MyApp"];
[prefs setLocalStorageEnabled:YES];
这是可行的,但它需要私有方法setLocalStorageDatabasePath,这意味着我没有应用商店。因此,我现在要修正的问题是:有没有一种不使用私人方法就能实现这一目标的方法?我找到了,它控制着数据库的去向。但是我在源代码中的任何地方都找不到本地存储的对应密钥。或者我有没有办法强制本地存储使用数据库,从而使用WebDatabaseDirectory键?有什么想法吗?我将采用Javascript到Objective-C桥接的方法,并将所有内容存储在核心数据中。将localStorage设置为false,然后使用相同的方法构建一个JS对象和一个名为“localStorage”的实例。我的javascript开发人员不会知道这两者之间的区别,我已经对Air做了同样的事情(基本上)。还有另一种方法可以保持本地存储完好无损,即使它实际上并不将它们存储在持久数据库中。这些元素可以在javascript中迭代并从那里进行操作,但我认为最好是简单地用我自己的对象替换对象 我向Mac app Store提交了一个使用此代码的应用程序,苹果批准了它: 目标-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日起允许我申请更新:他们还批准了对同一应用程序的版本更新,因此已经进行了两次。在经历了许多痛苦和挫折之后,我找到了一种方法来启用本地存储,并使其在应用程序正常运行时保持不变。此解决方案专门针对OSX,但也可能适用于iOS 下载此头文件并将其添加到项目中。它不包括在XCode Webkit发行版中 添加以下行:
static NSString* _storageDirectoryPath();
+ (NSString *)_storageDirectoryPath;
这些允许您检索WebKit本地存储跟踪器数据库的目录位置。这一点很重要,因为由于WebKit中存在一个bug,如果您没有将LocalStorage WebView文件存储在与tracker数据库相同的目录中,则每隔运行一次应用程序时,它们就会被删除。我在WebStorageManager代码中没有看到为单个应用程序更改此位置的方法。它总是从用户首选项中读取
在appDelegate中包含WebStorageManagerPrivate.h
#include "WebStorageManagerPrivate.h"
#include "WebPreferencesPrivate.h"
您需要下载并在项目中包含XCode发行版中未包含的另一个标头。另存为WebPreferencesPrivate.h
在appDelegate中包含WebPreferencesPrivate.h
#include "WebStorageManagerPrivate.h"
#include "WebPreferencesPrivate.h"
现在,在ApplicationIDFinishLaunching处理程序中使用下面的代码来初始化和启用LocalStorage。代码假定您使用的webView有一个名为“webView”的IBMOutlet
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中被正确修复。这听起来是一个有趣的解决方案(苹果不会对此加以标记)。我真的希望看到一些代码:)这种方法唯一的问题是,如果使用sqlite,查询将异步运行,因此
alert(localStorage.getItem('a')代码>不起作用。我在哪里可以找到这种方法的示例?如果能打开此桥的源代码,那就太好了。您是如何用自己的Windows.localStorage替换的?我成功地实现了一个LocalStorage对象,但是我无法分配给window.LocalStorage.Finally来清除最后一组环,我的应用程序现在也在商店里。你把它放在哪里了@实施H感谢您的澄清。。为愚蠢感到抱歉…一般来说,苹果会批准大多数WebKit私有方法,因为WebKit本身是开源的。这个问题最近一次出现是在将近一年前,所以苹果可能已经取消了对\u setLocalStorageDatabasePath:
和setLocalStorageEnabled:
方法的支持,因为我找不到在任何地方使用它们的方法,但是,如果您知道支持仍然存在,我将如何在代码中获得对这些方法的支持,以便使用它们?您如何在Swift中做到这一点?您遇到了什么问题?错误?不储蓄?我已经在10.7下测试过了,很好。在10.11下(El Capitan),这不再有效。为了保存和加载操作,我不得不求助于桥接到本机代码。为了最小化Javascript的更改,您可以覆盖Storage.prototype中的标准“set”和“get”函数,并调用桥接函数。苹果公司在使用本地文件引用为Webkit应用程序存储本地存储的安全处理方面填补了空白。