是否有可能caching加载在iPhone UIWebView中的资源?

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

问题是,caching似乎不起作用:

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

在这个远程页面(css,图像,外部JavaScript文件)中引用的任何东西都不会被caching(请求永远不会发送If-Modified-Since标头或其他任何以caching控制的方式)。

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

我的整个页面(页面及其参考资源)都是89K左右压缩的。这在某些地方比3G慢,在EDGE上更差。 传入的请求至less表明它接受压缩( accept-encoding=gzip, deflate ),所以这很好,我想。

我读了这个yui的研究 ,这似乎表明,iPhone将caching每件25k。 唯一被引用超过25k的未压缩是jquery(打包但未压缩 – 它是30k)。 其他一切应该可caching。 取出页面中引用的任何内容的请求都不会触发服务器端的304。

那个研究是从一年前开始的,我只是在用移动探险的方式进行猜测。

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

这个问题的一个解决方法,我看到的是

1)下载HTML代码

2)将其存储在string中

3)在其中find所有的外部链接

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

4)全部下载

5)用embedded的Base64编码版本replace它们

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

6)最终存储完整的HTML与embedded式图像,只要你想。

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

您现在可以通过所有看到互动来尝试ASIWebPageRequest

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

我只能build议大家使用Ben Copsey伟大的库来进行各种HTTP操作。

更新 :本已经停止ASIHTTPRequest。 我不再build议使用它。

你可以随时手动执行请求,虽然这会很棘手 – 然后你可以caching你的内容。 构build一个在webView:shouldStartLoadWithRequest:navigationType:中启动请求的UIWebViewDelegate webView:shouldStartLoadWithRequest:navigationType:caching结果,并使用UIWebView的loadHTMLString:baseURL:来更新视图。

这将是丑陋的,事情将不会像你想要的那样顺利,但是对于你所需要的,它可能是足够好的。

与普通电脑相比,iPhone的caching容量有限。 它将未压缩的caching项目限制为25k。

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

你应该能够NSURLCache并将其replace为UIWebView所使用的共享caching,就像这篇cocoa爱文章中所描述的那样: 将本地数据replace为远程UIWebView请求

对于另一种方法,请查看UIWebView(和NSURLProtocol)的Drop-in脱机caching 。