UIWebView中的Html5缓存清单?

时间:2009-10-08 20:30:57

标签: iphone caching html5 uiwebview

我希望能够使用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)。

有关如何使其发挥作用的任何想法?

5 个答案:

答案 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'发送请求,否则它仍然无效。