我有一个简单的应用程序,可以在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的研究是从差不多一年前开始的,我猜测只有移动游猎。
这是在原生iPhone应用中使用UIWebView
。
答案 0 :(得分: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。
答案 1 :(得分: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];
答案 2 :(得分:4)
您现在可以通过All Seeing Interactive尝试ASIWebPageRequest
:
ASIWebPageRequest是ASIHTTPRequest系列的新增实验。它可用于在单个请求中下载完整的网页,包括图像和样式表等外部资源。 下载网页后,请求将解析内容,查找外部资源,下载它们,并使用Data URIS将它们直接插入到html源代码中。然后,您可以将响应直接放入Mac上的UIWebView / WebView中。
我只能建议大家使用Ben Copsey的优秀库来进行各种HTTP操作。
更新:Ben已停止使用ASIHTTPRequest。我不再建议使用它。
答案 3 :(得分:2)
您可以随时手动执行请求,虽然这很棘手 - 然后您可以将内容缓存到内心。构建一个UIWebViewDelegate
,在webView:shouldStartLoadWithRequest:navigationType:
中启动请求,缓存结果,并使用UIWebView的loadHTMLString:baseURL:
更新视图。
这将是丑陋的,事情不会像你想要的那样顺利地运作,但它可能足以满足你的需要。
答案 4 :(得分:1)
与普通电脑相比,iphone的缓存容量有限。它将未压缩的缓存项限制为25k。
这里有好消息:http://yuiblog.com/blog/2008/02/06/iphone-cacheability/
答案 5 :(得分:0)
您应该能够继承NSURLCache
并将其替换为{Cone with Love文章中描述的UIWebView
使用的共享缓存:Substituting local data for remote UIWebView requests
对于另一种方法,请查看Drop-in offline caching for UIWebView (and NSURLProtocol)。