11

我有一个简单的应用程序加载一个针对 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 study,这似乎表明 iPhone 将缓存每个项目 25k。唯一引用超过 25k 未压缩的是 jquery(打包但未压缩 - 它是 30k)。其他一切都应该是可缓存的。对获取的页面中引用的任何内容的请求都不会在服务器端触发 304。

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

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

4

6 回答 6

7

如我所见,此问题的一种解决方法是

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。

于 2009-07-28T18:25:36.827 回答
5

From 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];
于 2011-07-10T21:33:02.857 回答
4

您现在可以ASIWebPageRequest通过 All Seeing Interactive 进行尝试:

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

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

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

于 2010-08-06T10:40:25.443 回答
2

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

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

于 2008-12-22T14:21:27.587 回答
1

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

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

于 2008-12-05T23:28:09.163 回答
0

您应该能够继承NSURLCache并替换它使用的共享缓存,UIWebView如这篇 Cocoa with Love 文章中所述:用本地数据替换远程 UIWebView 请求

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

于 2012-10-17T11:42:39.203 回答