5

I have a bad service worker that is no longer updating. I noticed the issue in Chrome first. I then put the following code in the index.html file and in the sw.js (service worker) file. For the most part it seems to be working fine. Firefox seems to be the only browser that is not removing the service worker. I used the article below to create the unregister script.

How do I uninstall a Service Worker?

I have also used this article and code and got the same results.

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

I am also receiving an error message for getRegistrations() saying it is undefined. Not sure how to fix that either.

Help with both of these issues would be greatly appreciated.

<script>
navigator.serviceWorker.getRegistrations().then(function(registrations) {
 for(let registration of registrations) {
  registration.unregister();
} });</script>
RainJ9
  • 55
  • 1
  • 1
  • 6
  • Does this answer your question? [How do I uninstall a Service Worker?](https://stackoverflow.com/questions/33704791/how-do-i-uninstall-a-service-worker) – Kevin Cox Nov 03 '20 at 12:46

2 Answers2

10

Below sample code will check for service worker registered in your browser and fetch it.

registration.active.scriptURL will provide you exact url of all service workers.

registration.unregister(); will remove that service worker.

LINK: 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(); }
            }
        });
}

If you want to update service worker code than use https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/update

Akhilesh Kumar
  • 849
  • 1
  • 15
  • 28
4

I stumbled across this answer which seemed a better-than-most solution.

Blog Post: https://medium.com/@nekrtemplar/self-destroying-serviceworker-73d62921d717

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

It destroys itself with this code:

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))
    });
});

Here's an even more in-depth explanation and further improvement on the above code. https://love2dev.com/blog/how-to-uninstall-a-service-worker/

narfie
  • 493
  • 1
  • 7
  • 16
  • I had to do a combination of your answer and Akhilesh. I added the script you wrote above in the sw.js file. I added this code to the HTML file: `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(); } } }); }` Then the old service worker was removed. Thank you for the help! – RainJ9 Apr 11 '18 at 16:06
  • I've the same issue.. What file name should I add this code? – javiens Jan 16 '21 at 13:07