【问题标题】:Implementing a WebView database quota delegate实现 WebView 数据库配额委托
【发布时间】:2008-12-09 18:52:34
【问题描述】:
如何实现此方法(见下文)?我是 Objective-C 的新手,但我没有做对。
发件人:http://lists.apple.com/archives/Webkitsdk-dev/2008/Apr/msg00027.html
默认情况下,数据库的配额为 0;必须先增加此配额,然后才能将任何数据库存储在磁盘上。
WebKit 客户端应实现 WebUIDelegate 方法- webView:frame:exceededDatabaseQuotaForSecurityOrigin:database:,并在调用该方法时根据需要增加配额。此方法在 WebUIDelegatePrivate.h 中定义。它在上一个发布周期中添加得太晚,无法使其成为非私有标头。提交一个关于将此调用移动到 WebUIDelegate.h 的错误是值得的,以便它成为官方 API 的一部分。
约翰
【问题讨论】:
标签:
objective-c
cocoa
webkit
【解决方案1】:
在您定义为 WebView 委托的任何类中,您需要实现该方法,如下所示:
- (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(WebSecurityOrigin *)origin database:(NSString *)databaseIdentifier {
unsigned long long newQuotaBytes = 10 * 1024 * 1024;
[origin setQuota:newQuotaBytes];
// origin also responds to -usage method to return current size for all databases in this origin
}
【解决方案2】:
从讨论区获得了一些帮助:
WebKit 中似乎包含此方法的实现
WebKitTools 在他们的公共 SVN 中。 (该类名为 UIDelegate)。
http://trac.webkit.org/browser/trunk/WebKitTools/DumpRenderTree/mac/U...
我假设您已经为您的 WebKit 视图创建了一个委托。在那里面
委托类,创建一个带有签名的方法:
- (void)webView:(WebView *)sender frame:(WebFrame *)frame
exceededDatabaseQuotaForSecurityOrigin:(WebSecurityOrigin *)origin
database:(NSString *)databaseIdentifier;
您可能可以使用 UIDelegate 实现的修改版本:
- (void)webView:(WebView *)sender frame:(WebFrame *)frame
exceededDatabaseQuotaForSecurityOrigin:(WebSecurityOrigin *)origin
database:(NSString *)databaseIdentifier
{
static const unsigned long long defaultQuota = 5 * 1024 * 1024;
[origin setQuota:defaultQuota];
}
这个我没试过,所以YMMV。
乔恩
【解决方案3】:
这是最终答案。
我使用的是 MiniBrowser 示例应用程序。
在 MyDocument.m 中我添加了这个函数:
- (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(id)origin database:(NSString *)databaseIdentifier
{
static const unsigned long long defaultQuota = 5 * 1024 * 1024;
if ([origin respondsToSelector: @selector(setQuota:)]) {
[origin setQuota: defaultQuota];
} else {
NSLog(@"could not increase quota for %@", defaultQuota);
}
}