4

我正在开发一个带有离线模式的小型移动 WebApp。如果清单文件已更改,有什么方法可以防止自动更新?如果用户的互联网连接不好,他不应该被迫下载所有文件,而是应该收到一条消息,以便他以后可以更新文件。

我试过

window.addEventListener('load', function(e) {    
  window.applicationCache.addEventListener('ondownloading', function(e) {
      window.applicationCache.abort();
  }, false);
}, false);

但它不起作用。在 Safari 6.0.2 和 Chrome Canary 中都没有。

只有当用户使用以下代码手动单击我的“更新”按钮时,应用程序才应该更新文件:

var appCache = window.applicationCache;
appCache.update();

if (appCache.status == window.applicationCache.UPDATEREADY) {
  appCache.swapCache();  // The fetch was successful, swap in the new cache.
}
4

2 回答 2

2

雅法的回答不起作用。(至少在铬)。

无论我们做什么,appcache 都会自动更新,因此控制客户端何时从服务器获取更新的唯一方法是在每个客户端(每个浏览器)的基础上管理每个缓存清单。

浏览器将需要创建一个 BrowserID GUID 并将其存储在 localStorage 中。当它请求缓存清单时,它应该在 URL 中包含 browserID。当服务器发送缓存清单时,它会将其缓存在服务器端。对清单的每个后续请求都会返回缓存的版本。

当用户按下 Sync 按钮时,浏览器会发送一个包含浏览器 ID 的 Cache Bust 请求。这会导致具有该 BrowserID 的下一个缓存清单请求返回更新的清单,而不是缓存的版本。

于 2014-07-28T20:30:16.610 回答
1

您不需要将downloading addEventListener调用包装在window load事件中,applicationCache对象从一开始就在那里。

你正在监听一个ondownloading事件,但没有一个名为那个的事件,你不需要on.

checking但是,您可能希望通过事件更快地捕获更新过程。您也不必打电话abort,因为该checking事件是可以取消的。

var blockUpdates = true;

window.applicationCache.addEventListener('updating', function(event) {
    if (blockUpdates) {
        event.preventDefault();
    }
}, false);

function updateButtonPressed() {
    blockUpdates = false;
    window.applicationCache.update();
}

window.applicationCache.addEventListener('updateready', function() {
    // but what do we do here?
}, false);

但是当你有更新时你应该怎么做?swapCache将使用更新的缓存,但仅适用于新请求,您可能已经在页面上获得了旧文件。用新资产替换旧资产的最简单方法是重新加载页面。您可以自动执行此操作,但这可能会对用户造成干扰,最好告诉他们有更新准备好,并提供一个重新加载页面的按钮。

于 2012-12-13T14:13:07.210 回答