有没有一种方法可以查询HTML5应用程序缓存?

4
有没有一种方法可以查询HTML5应用程序缓存的内容?
我正在编写一个使用大量缓存网络内容的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的缓存没有关系:即使我可以在Safari网络调试器中看到URL在HTML5应用程序缓存中,-cachedResponseForRequest:对于任何请求都会返回nil。

那么,有没有一种方法可以查询HTML5应用程序缓存的内容?答案使用Objective-C代码或Javascript都可以,因为我可以从Objective-C执行相关JS。


HTML5应用程序缓存操作是原子性的 - 如果文件在清单中列出,并且缓存存在,则保证该文件在缓存中。在您的情况下,您是否期望未在清单中列出的文件被添加到应用程序缓存中? - robertc
@robertc 谢谢你。我不期望缓存有所添加,但清单会不时更改,缓存会相应地更新。 - Caleb
好的,还有一些值得一提的因素,我会很快写出一个“正式”的答案。 - robertc
2个回答

2
HTML5 AppCache有两个特性,这意味着在正常操作中不需要这样做:
  1. AppCache更新操作是原子的,要么整个缓存被更新,要么没有被更新
  2. 一旦创建了一个AppCache,那么所有在缓存中的文件都将从缓存中提供
因此,对于清单文件的任何给定版本,加载到浏览器中的任何列出的文件都将与清单中列出的所有其他文件一致。您只需要检查window.applicationCache.status并检查它不是UNCACHED
另外还有一种可能性。如果您像Dive Into HTML5中描述的那样“懒惰地添加”文件到AppCache中,那么您可能不确定哪些文件被缓存了。在这种情况下,您可以采用检测在线状态的方法之一,我不会给您提供一个完全测试过的解决方案,但是这里是一般的思路:
  1. 创建一个包含唯一标识符的网页,该标识符在页面中通常不会出现。该标识符可以在通常页面中隐藏的内容中。
  2. 将此页面设置为清单中的通用FALLBACK
  3. 使用AJAX请求页面。
  4. 扫描响应以查找唯一标识符,如果找到,则知道所请求的页面未在AppCache中。

感谢您抽出时间回答。这是一个混合iOS应用程序,其中本地部分是一个容器,对内容了解不多。基于Web的内容被缓存,以便在设备没有网络访问权限时应用程序仍然可以工作。我可以很好地检测到丢失的连接,但我希望通过防止未缓存的链接首先加载来处理某些错误,例如来自未缓存内容的404。我正在寻找一种确定给定页面是否在缓存清单中的方法,而无需自己下载和解析它。 - Caleb
@Caleb 我没有描述如何检测缺失的连接,我描述了如何检测缺失的文件。您不必解析文件,只需搜索其中的唯一标识符即可。如果您按照我的建议设置,您将不会收到任何404错误,而是会得到备用页面。 - robertc

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接