【问题标题】:Html5 cache manifest in a UIWebView?UIWebView 中的 Html5 缓存清单?
【发布时间】:2010-12-05 03:27:12
【问题描述】:

我希望能够使用 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 的相关问题,但它们似乎没有提供解决此问题的信息。例如,我很确定我要缓存的文件不会太大,因为它们只是几个小文本文件(

关于如何让它发挥作用的任何想法?

【问题讨论】:

  • 泰勒,您选择的答案不再相关。如果可以的话,您应该将您的选择更新为@iPixFolio 的答案。
  • 可以在 iOS7 和 6 中使用。为什么不能在 ios8 中使用?

标签: iphone caching html uiwebview


【解决方案1】:

我遇到了同样的问题。虽然我用过:

[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30.0];

它似乎不想使用缓存的数据。这意味着它不断向我的网络服务发出请求以检索最新内容,从而使缓存变得无用。


我确实找到了解决方法。在 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' 发送请求,否则它仍然无法工作。

【讨论】:

  • 如果我从预生成的 html 正文 NSString 加载 UIWebView,它引用了我需要缓存的文件,我需要做什么?基本上我认为它可能是一个不同的Java调用?有什么想法吗?
【解决方案2】:

我使用 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 实现你自己的缓存机制:-(

【讨论】:

  • 非常酷,但是对于许多开发人员来说,现在需要 iOS4 仍然是个大问题。但肯定是朝着正确方向迈出的一步。
  • 对任何搜索的人的额外提示:您不需要网络嗅探器。只需启动一个终端会话并发出这个:curl -I http://YOUR_DOMAIN/PATH/TO/CACHE_MANIFEST
  • 这不再是一个交易破坏者。
【解决方案3】:

UIWebView 不能(或不会)使用 HTML5 应用缓存。他们只是没有。也许在 iPhone OS 4.0 中。

但是您可以做的是自己通过网络调用获取所有文件(或者只是将它们放在您的应用程序包中)并使用指向本地 HTML 文件的本地 URL 加载 webview,该文件可以具有本地的相对 URL资产。

但是,没有超级简单的“它只是有效”的方式来实现这一点。

【讨论】:

  • 经过大量调查,我同意根本没有简单的方法可以解决这个问题。我能得到的最接近的是实现我自己的 NSURLCache 子类并将其设置为缓存。然而,即便如此,我发现我的缓存结果经常被操作系统拒绝,原因对我来说是不透明的。无论我尝试什么缓存策略或其他参数调整,操作系统似乎都对接受缓存响应非常挑剔。合作起来非常令人沮丧!
【解决方案4】:

您是否尝试过按照文档中的建议创建自定义的 NSURLCache 对象并使用 setSharedURLCache: 方法:

"有更具体需求的应用可以创建自定义的 NSURLCache 对象,并使用 setSharedURLCache 将其设置为共享缓存实例:"

【讨论】:

  • 是的,我有。它不会导致缓存清单工作,尽管您可以使用该技术尝试创建自己的缓存 - 但这比听起来更棘手,因为 NSURL 框架会出于未知原因拒绝一些缓存的响应。
  • 我注意到了同样的事情。这很挑剔。
【解决方案5】:

您可以在 NSURLRequest 上使用 cachePolicy 参数。

request = [NSURLRequest requestWithURL:[NSURL URLWithString:reqString] cachePolicy:NSURLRequestReturnCacheDataDontLoad timeoutInterval: 10.0];

记录在here。

【讨论】:

  • 这不起作用。我是这样知道的:我用缓存清单构建了一个示例文件,并在 3 个浏览器中加载了这个文件:(1) Firefox (2) 移动 Safari,(3) 使用 NSURLRequestReturnCacheElseLoad 的 UIWebView(如果我使用 DontLoad 那么它 从不加载)。然后我修改服务器上的缓存图像。 Firefox 和 Safari 都正确显示旧图像;我的 UIWebView 获取了新图像。
猜你喜欢
  • 1970-01-01
  • 2013-04-16
  • 2012-10-23
  • 2012-02-20
  • 1970-01-01
  • 2010-09-21
  • 2011-01-04
  • 2016-07-04
  • 2011-11-27
相关资源
最近更新 更多