如何妥善处理PWA-服务人员生命周期终止

时间:2019-10-03 10:06:53

标签: service-worker progressive-web-apps

例如我们有一个PWA应用程序在服务器上运行了一年,现在我们计划停止该服务(关闭服务器并删除DNS条目)

但是,当我们只是关闭服务器时,客户端浏览器仍将缓存PWA,并且用户在执行任何操作时都会看到错误消息,指出无法访问服务器。

我们如何优雅地处理这种情况?

更多详细信息:

  • 当新用户访问该页面时(服务器停止后),没关系:他们看到This site can’t be reached
  • 以前已经访问过该页面的
  • 用户将看到过时的PWA,该PWA似乎已损坏,因为无法访问服务器
    • 即使用户刷新浏览器页面,他们也会看到过时的PWA
  • 我们曾考虑过将域保留一段时间并将其重定向到另一个页面,但这也无济于事(此外,我们使用了https和HSTS-因此无法进行重定向)
  • ServiceWorker LifeCycle没有提到使用寿命终止

1 个答案:

答案 0 :(得分:2)

您可以在关闭服务器之前发布新的网站版本吗?
您不仅可以在其中删除SW,还可以取消其缓存:

// Unregister the SW
navigator.serviceWorker.getRegistration()
   .then(function(registration) {
       if(registration){
          registration.unregister()
          .then(
               function(success) {
                 // if success = true, unregister was successful
                });
          }
    });


 // Delete SW Cache
if ('caches' in window) {
    caches.keys()
      .then(function(keyList) {
          return Promise.all(keyList.map(function(key) {
              return caches.delete(key);
          }));
      })
}

如果您想看看它,我写了一篇有关Service Workers and caching strategies的文章。

当然,所有已经拥有软件支持并且不会在关闭门户之前访问您的门户的用户仍将使用旧版本,但是为此,我认为您没有太多控制权。


更新

我进一步检查了一些文档,但是找不到有关定时寿命的任何信息(甚至在MDN docs上也找不到)。因此,似乎无法从软件内部定义时间限制。

问题在于,一旦在客户端上安装了服务工作者,服务工作者便会在其线程上独立运行。因此,除非您允许安装新的软件,否则您将无法对其进行控制。 也许可能的解决方案是将当前URL地址重定向到特定的应用程序,只需下载新的SW(将其卸载并删除缓存)即可。