2008-12-05 73 views
11

我有一个简单的应用程序加载在UIWebView iPhone优化的网站。是否可以缓存加载在iPhone UIWebView中的资源?

问题是,缓存似乎不工作:

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

在这个偏远的页面(CSS,图片,外部JavaScript文件)引用的任何东西永远不会获取缓存(请求从未发送IF-改进释放由于头或任何缓存控制的其他方式。)

这可能吗?看起来有一个常规的Cocoa WebView有一个代理方法,可以调用每个资源请求和后期加载(-didFinishLoadingFromDataSource:),您可以使用它来推出自己的缓存..但这在这里似乎不适用。

我的整个页面(页面及其引用的资源)约为89K压缩..这是在一些景点缓慢通过3G,甚至超过EDGE更糟。传入的请求至少表明它接受压缩(accept-encoding=gzip, deflate),所以这很好,我想。

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

那衣的研究是从差不多一年前,而我只用移动Safari浏览器的猜测。

这是一个原生iPhone应用程序使用UIWebView

回答

2

您可以随时手动执行的请求,尽管这会是棘手 - 然后你可以缓存的东西到你的心脏的内容。构建一个UIWebViewDelegate,在webView:shouldStartLoadWithRequest:navigationType:中启动请求,缓存结果,并使用UIWebView的loadHTMLString:baseURL:更新视图。

这将是丑陋的,事情不会那样顺利,你可能想工作,但它可能是配不上你所需要的。这个问题的

7

一个解决办法,因为我看到的是

1)下载HTML代码

2)它存储字符串

3)中找到它所有的外部链接像

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

4)下载他们所有

5)与嵌入式底座替换它们64编码版本

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

6)最后存储与嵌入图像完整的HTML,只要你想。

+10

天才,虽然相当令人不安。 – 2010-02-11 15:18:29

+0

做错的最好方法。男人,我们在这里寻找至少更方便的解决方案 – 2013-10-18 07:38:27

+0

@ eagle.dan.1349为什么这是做错的最好方法?在没有“更方便的解决方案”的情况下,*是最方便的解决方案 – abbood 2013-11-13 14:43:18

4

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

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

我只能建议大家使用Ben Copsey伟大的库来处理各种HTTP操作。

UPDATE:本已经停止ASIHTTPRequest。我不再建议使用它。

相关问题