【问题标题】:Is it possible to cache resources loaded in an iPhone UIWebView?是否可以缓存 iPhone UIWebView 中加载的资源?
【发布时间】:2010-09-25 14:48:31
【问题描述】:

我有一个简单的应用程序在UIWebView 中加载针对 iPhone 优化的网站。

问题是,缓存似乎不起作用:

[webView loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString: url]
                                       cachePolicy: NSURLRequestUseProtocolCachePolicy
                                   timeoutInterval: 60.0]];

此远程页面中引用的任何内容(css、图像、外部 javascript 文件)永远不会被缓存(请求永远不会发送 If-Modified-Since 标头或任何其他缓存控制方式。)

有可能吗?似乎对于常规的 Cocoa WebView,有一个委托方法可以为每个资源请求和后加载 (-didFinishLoadingFromDataSource:) 调用,您可以使用它来滚动您自己的缓存.. 但这在这里似乎不适用。

我的整个页面(页面及其引用的资源)压缩到大约 89K.. 在某些地方这比 3G 慢,甚至比 EDGE 更糟。传入的请求至少表明它接受压缩 (accept-encoding=gzip, deflate),所以我想这很好。

我阅读了this yui study,这似乎表明 iPhone 将缓存每个项目 25k。唯一引用超过 25k 未压缩的是 jquery(打包但未压缩 - 它是 30k)。其他一切都应该是可缓存的。对获取的页面中引用的任何内容的请求都不会在服务器端触发 304。

那项 yui 研究是差不多一年前的事了,我猜只是移动 safari。

这是在原生 iPhone 应用程序中使用 UIWebView

【问题讨论】:

    标签: ios iphone cocoa-touch caching uiwebview


    【解决方案1】:

    据我所知,此问题的一种解决方法是

    1) 下载 HTML 代码

    2) 将其存储在字符串中

    3) 找到里面的所有外部链接

    <img src="img.gif" width="..." height="..." />
    

    4) 全部下载

    5) 用嵌入式 Base64 编码版本替换它们

    <img src="data:image/gif;base64,R0lGODlhUAAPA...JADs= " width="..." height="..." />
    

    6) 最后根据需要存储带有嵌入图像的完整 HTML。

    【讨论】:

    • 天才,虽然很令人不安。
    • 做错事的最好办法。伙计,我们正在这里寻找至少更方便的解决方案
    • @eagle.dan.1349 为什么这是做错的最好方法?在没有“更方便的解决方案”的情况下,这最方便的解决方案
    • 嘿,有人实施这个解决方案吗?有用吗?
    【解决方案2】:

    来自https://github.com/phonegap/phonegap-iphone/issues/148

    NSURLCache* cache = [NSURLCache sharedURLCache];
    [cache setMemoryCapacity:4 * 1024 * 1024];
    [cache setDiskCapacity:512*1024];
    
    [NSURLRequest requestWithURL:appURL
                     cachePolicy:NSURLRequestReturnCacheDataElseLoad
                 timeoutInterval:10.0];
    

    【讨论】:

    • 我认为链接已损坏
    【解决方案3】:

    您现在可以试试 All Seeing Interactive 的 ASIWebPageRequest

    ASIWebPageRequest 是 ASIHTTPRequest 系列的一个新的实验性补充。它可用于在单个请求中下载完整的网页,包括图像和样式表等外部资源。 下载网页后,请求将解析内容,查找外部资源,下载它们,然后使用 Data URIS 将它们直接插入到 html 源中。然后,您可以获取响应并将其直接放入 Mac 上的 UIWebView / WebView 中。

    无论如何,我只能建议大家使用 Ben Copsey 的出色库进行各种 HTTP 操作。

    更新:Ben 已停止 ASIHTTPRequest。我不再建议使用它。

    【讨论】:

    • 嘿@rage,你能推荐任何替代 ASIWebPageRequest 的方法吗?
    • AFNetworking 很不错。还有MKNetworking。公众尚未决定哪一个将成为下一个事实上的标准。我不确定它们是否支持完整的网页下载。
    • 谢谢@rage。我将 AFNetworking 用于我的 api 调用,但不用于完整的网页下载/缓存。我正在编写一个容器应用程序,该应用程序在 UIWebview 中包含一个 Backbone Web 应用程序,我正在寻找使其加载速度更快的方法。
    【解决方案4】:

    您始终可以手动执行请求,尽管这会很棘手 - 然后您可以将内容缓存到您的内心深处。构建一个UIWebViewDelegate,在webView:shouldStartLoadWithRequest:navigationType: 中启动请求,缓存结果,并使用UIWebView 的loadHTMLString:baseURL: 更新视图。

    它会很丑,事情不会像你想要的那样顺利,但它可能足以满足你的需要。

    【讨论】:

      【解决方案5】:

      与普通计算机相比,ihone 的缓存容量有限。它将 未压缩 缓存项限制为 25k。

      这里有很好的信息:http://yuiblog.com/blog/2008/02/06/iphone-cacheability/

      【讨论】:

        【解决方案6】:

        您应该能够继承 NSURLCache 并将其替换为 UIWebView 使用的共享缓存,如这篇 Cocoa with Love 文章中所述:Substituting local data for remote UIWebView requests

        有关另一种方法,请查看Drop-in offline caching for UIWebView (and NSURLProtocol)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-31
          • 1970-01-01
          • 2016-12-16
          • 1970-01-01
          • 2016-02-27
          • 1970-01-01
          • 1970-01-01
          • 2021-10-31
          相关资源
          最近更新 更多