【问题标题】:Is there a way to query the HTML5 application cache?有没有办法查询 HTML5 应用程序缓存?
【发布时间】:2013-01-20 10:46:21
【问题描述】:

有没有办法查询 HTML5 应用缓存的内容?

我正在编写一个使用大量缓存 Web 内容的 iOS 应用程序。在应用离线时加载给定页面之前,我想检查该页面是否存在于缓存中。如果没有,我会通知用户他们必须在线才能看到该内容;如果有,我会继续加载它。

现在,iOS 有自己的 URL 缓存系统,我最初只是假设我可以通过这种方式检查缓存的内容:

if ([[NSURLCache sharedURLCache] cachedResponseForRequest:myRequest] != nil) {
    // go ahead and load the page
}
else {
    // notify the user that the content isn't available
}

我傻了。似乎 iOS 的缓存和 HTML5 的缓存是不相关的: -cachedResponseForRequest: 对任何请求都返回 nil,即使我可以看到 URL 在 HTML5 应用程序缓存中(使用 Safari Web 调试器)。

那么,有什么方法可以查询 HTML5 应用程序缓存的内容吗? 答案是使用 Objective-C 代码还是 Javascript 并不重要,因为我总是可以执行来自 Objective-C 的相关 JS。

【问题讨论】:

  • HTML5 应用程序缓存操作是原子的 - 如果文件在清单中列出,并且缓存存在,则保证文件在缓存中。在您的情况下,您是否希望将清单中未列出的文件添加到应用缓存中?
  • @robertc 谢谢。我不希望添加缓存,但清单会不时更改,并且缓存会适当更新。
  • 好的,还有一些其他因素值得一提,我会尽快写一个“正确”的答案。

标签: ios html application-cache nsurlcache


【解决方案1】:

HTML5 AppCache 有两个属性,这意味着在正常操作中不需要这样做:

  1. AppCache 更新操作是原子的,要么更新整个缓存,要么不更新
  2. 创建 AppCache 后,缓存中的所有文件都会从缓存中提供

最终结果是,对于任何给定版本的清单文件,其中列出的任何加载到浏览器中的文件都将与清单中列出的所有其他文件保持一致。您只需要检查window.applicationCache.status 并检查它是否不是UNCACHED

还有另一种可能。如果您按照Dive Into HTML5 中的描述将文件“延迟添加”到 AppCache,则可能是您不确定缓存了哪些文件。在这种情况下,您可以采用detecting online state 的一种方法,我不会为您提供经过全面测试的解决方案,但总体思路如下:

  1. 创建一个包含唯一标识符的网页,该标识符不可能正常出现在页面中。标识符可以在其他正常页面的隐藏内容中。
  2. 将此页面设置为清单中的通用 FALLBACK
  3. 使用 AJAX 请求页面。
  4. 扫描响应以获取唯一标识符,如果找到,则表明请求的页面不在 AppCache 中

【讨论】:

  • 感谢您抽出宝贵时间回答。这是一个混合 iOS 应用程序,其中原生部分是一个对内容知之甚少的容器。基于 Web 的内容被缓存,因此即使设备没有网络访问权限,应用程序也能正常工作。我可以很好地检测到丢失的连接,但我想通过防止未缓存的链接甚至首先加载来处理某些错误,例如来自未缓存内容的 404。我正在寻找一种方法来确定给定页面是否在缓存清单中,而不是自己下载和解析它。
  • @Caleb 我没有描述如何检测丢失的连接,我描述了如何检测丢失的文件。您不必解析文件,只需搜索您的唯一标识符即可。如果您按照我的建议进行设置,您将不会收到任何 404,只会收到后备页面。
【解决方案2】:

是的,缓存存储在 Application.db 中。

【讨论】:

    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2017-07-13
    • 1970-01-01
    相关资源
    最近更新 更多