是否可以缓存 iPhone UIWebView 中加载的资源?

Is it possible to cache resources loaded in an iPhone UIWebView?

提问人:kevin 提问时间:12/6/2008 最后编辑:Unheiligkevin 更新时间:12/19/2016 访问量:29737

问:

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

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

[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

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

那个 yui 研究是差不多一年前的,我猜只针对移动野生动物园。

这是在本机 iPhone 应用程序中使用。UIWebView

iOS iPhone Cocoa-Touch 缓存 UIWebView

评论


答:

1赞 seanb 12/6/2008 #1

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

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

2赞 unwesen 12/22/2008 #2

你总是可以手动执行请求,尽管这会很棘手 - 然后你可以随心所欲地缓存内容。生成一个启动请求的 ,缓存结果,并使用 UIWebView 更新视图。UIWebViewDelegatewebView:shouldStartLoadWithRequest:navigationType:loadHTMLString:baseURL:

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

7赞 Denis 7/29/2009 #3

正如我所看到的,这个问题的一种解决方法是

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。

评论

10赞 Orr Matarasso 2/11/2010
天才,虽然很令人不安。
0赞 eagle.dan.1349 10/18/2013
做错的最好方法。伙计,我们在这里寻找至少更方便的解决方案
0赞 abbood 11/13/2013
@eagle.dan.1349 为什么做错是最好的方法?在没有“更方便的解决方案”的情况下,这是最方便的解决方案
0赞 David 12/19/2019
嘿,有人暗示这个解决方案吗?它有效吗?
4赞 rage 8/6/2010 #4

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

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

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

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

评论

0赞 Kevin Zych 8/22/2013
嘿@rage,你能建议任何 ASIWebPageRequest 的替代品吗?
0赞 rage 8/23/2013
AFNetworking相当不错。还有MKNetworking。公众尚未决定哪一个将成为下一个事实上的标准。我不确定它们中的任何一个是否支持完整的网页下载。
0赞 Kevin Zych 8/23/2013
谢谢@rage。我使用 AFNetworking 进行我的 api 调用,但不用于完整的网页下载/缓存。我正在编写一个容器应用程序,该应用程序在 UIWebview 中包含一个 Backbone Web 应用程序,我正在寻找使其加载速度更快的方法。
5赞 RandyMcMillan 7/11/2011 #5

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];

评论

1赞 Aatish Molasi 4/30/2013
我认为链接已损坏
0赞 Palimondo 10/17/2012 #6

您应该能够将其子类化并替换 Cocoa with Love 文章中所述的共享缓存:将本地数据替换为远程 UIWebView 请求NSURLCacheUIWebView

对于另一种方法,请查看 UIWebView(和 NSURLProtocol)的插入式脱机缓存