有没有办法查询HTML5应用程序缓存?

时间:2013-01-20 10:46:22

标签: ios html5 application-cache nsurlcache

有没有办法查询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的缓存不相关:-cachedResponseForRequest:对于任何请求都返回nil,即使我可以看到URL在HTML5应用程序缓存中(使用Safari Web调试器)。

那么,是否有某种方法可以查询HTML5应用程序缓存的内容?如果答案使用Objective-C代码或Javascript,则无关紧要,因为我总能执行来自Objective-C的相关JS。

2 个答案:

答案 0 :(得分:2)

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

  1. AppCache更新操作是原子的,要么更新整个缓存,要么不更新
  2. 创建AppCache后,缓存中的所有文件都将从缓存中提供
  3. 最终结果是,对于任何给定版本的清单文件,其中列出的任何加载到浏览器中的文件都将与清单中列出的所有其他文件一致。您需要检查的是window.applicationCache.status,并检查它不是UNCACHED

    还有另一种可能性。如果您按照Dive Into HTML5中的描述“懒洋洋地”将文件添加到AppCache,则可能是您不确定缓存了哪些文件。在这种情况下,你可以调整detecting online state的一种方法,我不打算给你一个经过全面测试的解决方案,但这里是一般的想法:

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

答案 1 :(得分:1)

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