1

我们正在尝试将混合应用程序从 UIWebView (iOS < 8) 迁移到 WKWebView (iOS 8),但在尝试使用DOM WebDatabase API(即“web sql 数据库”)存储内容时出现 SecurityErrors。

如果 index.html 已从应用程序的捆绑文件中加载,则以下内容会引发错误

// throws SecurityError: DOM Exception 18
var db = openDatabase('mydb', '1.0', 'key value store', 1);

相同的代码适用于 UIWebView。出于某种原因,我可以回退到使用本地存储,但是使用 WebSQL 数据库是不行的。我只能推测这与同源政策或相关的东西有关。

有趣的是从网络加载 index.html 工作正常:-/

关于我如何解决这个问题的任何线索?在修复它的 WKWebView 上设置的任何选项?

这是我们加载网络相关内容的方式:

NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSURL *baseURL = [NSURL fileURLWithPath:htmlPath];
NSURLRequest *request = [NSURLRequest requestWithURL:baseURL];

WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
[config.userContentController addScriptMessageHandler:self.myCallbacks name:@"NativeApp"];

self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:config];

[self.webView loadRequest:request];

html 文件只是加载一个具有相对路径“myCode.js”的 javascript 文件。

4

3 回答 3

1

iOS 8.0(和 8.1 B1,我认为)中的 WKWebView存在一个问题(OpenRadar),它阻止它加载本地文件。它也可能会影响本地存储。有关更多详细信息,请参阅此问题

于 2014-09-30T14:32:19.783 回答
1

您可以通过将以下方法添加到 WKWebView 的 UIDelegate 来解决此问题。

- (void)                        _webView:(WKWebView *)webView
    decideDatabaseQuotaForSecurityOrigin:(WKSecurityOrigin *)securityOrigin
                            currentQuota:(unsigned long long)currentQuota
                      currentOriginUsage:(unsigned long long)currentOriginUsage
                    currentDatabaseUsage:(unsigned long long)currentUsage
                           expectedUsage:(unsigned long long)expectedUsage
                         decisionHandler:(void (^)(unsigned long long newQuota))decisionHandler {
    decisionHandler(1024*1024*50); //default to 50MB
}

它为所有数据库提供 50MB 的配额,而不是允许打开它们的默认值 0。这种行为没有记录在案,所以我不知道 Apple 对此持何态度。

此外,这个问题似乎将在 iOS 10 中得到修复。

于 2016-07-27T10:09:25.150 回答
0

我制作了一个“插件”,允许您在 WKWebView 中使用 WebSQL(更多是它的实现)。在这里能找到它

https://github.com/ajwhiteway/WKWebSQL

import WKWebSQL
.
.
.
var webView = WKWebView(frame: view.frame, configuration: WKWebViewConfiguration())
WKWebSQL.LoadPlugin(webView)

让它加载到页面中。目前并不真正支持版本控制。随意添加它。

于 2015-12-17T13:15:29.260 回答