注销/删除 Service Worker

Posted

技术标签:

【中文标题】注销/删除 Service Worker【英文标题】:Unregistering/Removing a Service Worker 【发布时间】:2018-09-19 07:45:56 【问题描述】:

我有一个不再更新的不良服务人员。我首先注意到 Chrome 中的问题。然后,我将以下代码放入 index.html 文件和 sw.js(服务工作者)文件中。在大多数情况下,它似乎工作正常。 Firefox 似乎是唯一没有移除 service worker 的浏览器。我使用下面的文章创建了注销脚本。

How do I uninstall a Service Worker?

我也使用了这篇文章和代码,得到了相同的结果。

How can I remove a buggy service worker, or implement a "kill switch"?

我还收到getRegistrations() 的错误消息,说它未定义。也不知道怎么解决。

非常感谢您对这两个问题的帮助。

<script>
navigator.serviceWorker.getRegistrations().then(function(registrations) 
 for(let registration of registrations) 
  registration.unregister();
 );</script>

【问题讨论】:

这能回答你的问题吗? How do I uninstall a Service Worker? 【参考方案1】:

下面的示例代码将检查在您的浏览器中注册的服务工作者并获取它。

registration.active.scriptURL 将为您提供所有服务人员的准确网址。

注册.unregister();将删除该服务人员。

链接:https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/unregister

if ('serviceWorker' in navigator) 
    navigator.serviceWorker.getRegistrations()
        .then(function(registrations) 
            for(let registration of registrations) 
               if(registration.active.scriptURL == 'http://localhost/my-push/myworker.js') registration.unregister(); 
            
        );

如果你想更新 service worker 代码而不是使用https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/update

【讨论】:

【参考方案2】:

我偶然发现了这个似乎比大多数解决方案更好的答案。

博文:https://medium.com/@nekrtemplar/self-destroying-serviceworker-73d62921d717

Github:https://github.com/NekR/self-destroying-sw

它用这段代码破坏自己:

self.addEventListener('install', function(e) 
  self.skipWaiting();
);

self.addEventListener('activate', function(e) 
  self.registration.unregister()
    .then(function() 
      return self.clients.matchAll();
    )
    .then(function(clients) 
      clients.forEach(client => client.navigate(client.url))
    );
);

这是对上述代码的更深入的解释和进一步的改进。 https://love2dev.com/blog/how-to-uninstall-a-service-worker/

【讨论】:

我必须将您的答案和 Akhilesh 结合起来。我在 sw.js 文件中添加了您在上面编写的脚本。我将此代码添加到 HTML 文件中:if ('serviceWorker' in navigator) navigator.serviceWorker.getRegistrations() .then(function(registrations) for(let registration of registrations) if(registration.active.scriptURL == 'http://localhost/my-push/myworker.js') registration.unregister(); ); 然后删除了旧的服务人员。感谢您的帮助! 我也有同样的问题。我应该添加什么文件名?

以上是关于注销/删除 Service Worker的主要内容,如果未能解决你的问题,请参考以下文章

安卓服务service全解,生命周期,前台服务后台服务,启动注销绑定解绑,注册

JWT 注销:在微服务架构中的服务之间共享被列入黑名单的无效令牌

注销后删除访问令牌

Java45旅游案例:数据回显,注销/退出,首页类别显示,精选

为啥 Node 中的 PassportJS 不会在注销时删除会话

注销和删除 Cookies [重定向到主页]