4

有没有办法查询 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。

4

2 回答 2

2

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

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

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

还有另一种可能。如果您按照Dive Into HTML5中的描述将文件“延迟添加”到 AppCache,那么您可能不确定哪些文件被缓存。在这种情况下,您可以采用一种方法来检测在线状态,我不会为您提供经过全面测试的解决方案,但这里是一般的想法:

  1. 创建一个包含唯一标识符的网页,该标识符不可能正常出现在页面中。标识符可以在其他正常页面的隐藏内容中。
  2. 将此页面设置为FALLBACK清单中的通用页面。
  3. 使用 AJAX 请求页面。
  4. 扫描唯一标识符的响应,如果找到它,那么您知道请求的页面不在 AppCache 中
于 2013-01-20T17:12:39.933 回答
1

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

于 2013-02-20T03:56:35.063 回答