我希望能够使用html5缓存清单在iPhone上本地存储图像,该iPhone通过应用内的UIWebView
访问该页面。
我已经设置了一个我认为符合规格的样本,并且似乎适用于safari 4和移动版Safari,但不适用于我的应用UIWebView
。
示例html设置为http://bynomial.com/html5/clock3.html
。
这与HTML5 draft standard
中提供的示例非常相似。
以下是我用于测试的示例应用程序的完整(非模板)代码:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// I thought this might help - I don't see any difference, though.
NSURLCache* cache = [NSURLCache sharedURLCache];
[cache setDiskCapacity:512*1024];
CGRect frame = [[UIScreen mainScreen] applicationFrame];
UIWebView* webView = [[UIWebView alloc] initWithFrame:frame];
[window addSubview:webView];
NSString* urlString = @"http://bynomial.com/html5/clock3.html";
NSURL* url = [NSURL URLWithString:urlString];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
[window makeKeyAndVisible];
}
我已经回顾了一些有关stackoverflow的相关问题,但它们似乎没有提供解决此问题的信息。例如,我很确定我尝试缓存的文件不是太大,因为它们只是几个小文本文件(方式< 25k)。
有关如何使其发挥作用的任何想法?
答案 0 :(得分:26)
我在UIWebView中使用.manifest文件工作。我在Apple开发者论坛上发现了这个技巧。
您必须为清单文件提供正确的mime类型:它必须是“text / cache-manifest”类型 - 如果是其他任何内容,那么您将无法缓存文件。
您可以在http://web-sniffer.net/使用网络嗅探器查看服务器返回的标头。
如果您在Web服务器上使用.htaccess文件,则将以下行添加到.htaccess文件中:
AddType text/cache-manifest .manifest
确保在进行此更改后清除浏览器缓存以查看效果。
HTH 标记
编辑:仅在iOS 4.0及更高版本上支持此功能。您需要为iOS 2.x和3.x实现自己的缓存机制: - (
答案 1 :(得分:3)
您可以在NSURLRequest上使用cachePolicy参数。
request = [NSURLRequest requestWithURL:[NSURL URLWithString:reqString] cachePolicy:NSURLRequestReturnCacheDataDontLoad timeoutInterval: 10.0];
记录here。
答案 2 :(得分:2)
UIWebView
不能(或不会)使用HTML5 appcache。他们只是没有。也许在iPhone OS 4.0中。
但你可以做的是通过网络调用自己获取所有文件(或者只是将它们放在你的应用程序包中)并使用指向本地HTML文件的本地URL加载webview,该文件可以具有本地的相对URL资产。
然而,没有超级简单的“它只是工作”的方式来实现这一目标。
答案 3 :(得分:1)
您是否尝试过按照文档中的建议创建自定义的NSURLCache对象并使用setSharedURLCache:方法:
“具有更多特定需求的应用程序可以创建自定义NSURLCache对象,并使用setSharedURLCache将其设置为共享缓存实例:”
答案 4 :(得分:1)
我遇到了同样的问题。虽然我用过:
[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30.0];
它似乎不想使用缓存数据。这意味着它不断向我的web服务请求检索最新内容,从而使缓存无用。
我确实找到了解决办法。在UIWebView中加载URL时,请使用以下代码:
NSString *html = [NSString stringWithFormat:@"<html><head><script type=\"text/javascript\">location.href='%@';</script></head><body></body></html>", [[currentURLRequest URL] absoluteString]];
[self.webView loadHTMLString:html baseURL:nil];
这已经在OS 4.2上进行了测试,因为我使用清单来处理缓存(HTML5)。它很可能无法在OS 2.x / 3.x上运行,您需要确认。
使用此方法的缺点是您无法根据请求发送任何POST数据。
希望这有助于任何人。
您仍然需要使用'cachePolicy:NSURLRequestReturnCacheDataElseLoad'发送请求,否则它仍然无效。