【问题标题】: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); 
          }
      } 
      

      【讨论】:

        【解决方案4】:

        这对我有用:https://stackoverflow.com/a/8975014/146099 - 这与 Jeff 的回答略有不同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-03
          • 1970-01-01
          • 1970-01-01
          • 2015-05-22
          相关资源
          最近更新 更多