提问人:kevin 提问时间:12/6/2008 最后编辑:Unheiligkevin 更新时间:12/19/2016 访问量:29737
是否可以缓存 iPhone UIWebView 中加载的资源?
Is it possible to cache resources loaded in an iPhone UIWebView?
问:
我有一个简单的应用程序,加载了一个针对 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
答:
与普通计算机相比,ihone 的缓存容量有限。它将未压缩的缓存项限制为 25k。
这里的好信息: http://yuiblog.com/blog/2008/02/06/iphone-cacheability/
你总是可以手动执行请求,尽管这会很棘手 - 然后你可以随心所欲地缓存内容。生成一个启动请求的 ,缓存结果,并使用 UIWebView 更新视图。UIWebViewDelegate
webView:shouldStartLoadWithRequest:navigationType:
loadHTMLString:baseURL:
它会很丑陋,事情不会像你想要的那样顺利,但它可能足以满足你的需求。
正如我所看到的,这个问题的一种解决方法是
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。
评论
您现在可以尝试 All Seeing Interactive 的 ASIWebPageRequest
:
ASIWebPageRequest 是 ASIHTTPRequest 系列的新增实验性新增功能。它可用于在单个请求中下载完整的网页,包括图像和样式表等外部资源。 下载网页后,请求将解析内容,查找外部资源,下载它们,并使用 Data URIS 将它们直接插入到 html 源代码中。然后,您可以获取响应并将其直接放入 Mac 上的 UIWebView / WebView 中。
无论如何,我只能建议大家使用 Ben Copsey 的出色库进行各种 HTTP 操作。
更新:Ben 已停止 ASIHTTPRequest。我不再建议使用它。
评论
从 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];
评论
您应该能够将其子类化并替换 Cocoa with Love 文章中所述的共享缓存:将本地数据替换为远程 UIWebView 请求NSURLCache
UIWebView
对于另一种方法,请查看 UIWebView(和 NSURLProtocol)的插入式脱机缓存。
评论