Come posso disinstallare un Service Worker?


161

Dopo aver eliminato /serviceworker.jsdalla mia directory principale, Chrome esegue ancora il servizio di assistenza che ho rimosso dal mio webroot. Come posso disinstallare il tecnico dell'assistenza dal mio sito Web e da Chrome in modo da poter accedere nuovamente al mio sito Web?

Ho rintracciato il problema fino al meccanismo della cache di Service Work e voglio rimuoverlo per ora fino a quando non avrò il tempo di eseguirne il debug. Lo script di accesso che sto utilizzando reindirizza ai server di Google per consentire loro di accedere al proprio account Google. Ma tutto quello che ottengo dalla pagina login.php è un ERR_FAILEDmessaggio.


2
Ho lo stesso problema in Firefox.
Costa

Risposte:


309

Rimozione dei lavoratori dell'assistenza a livello di codice

È possibile rimuovere gli operatori del servizio a livello di codice in questo modo:

navigator.serviceWorker.getRegistrations().then(function(registrations) {
 for(let registration of registrations) {
  registration.unregister()
} })

Documenti: getRegistrations , annulla registrazione

Rimozione dei lavoratori dell'assistenza tramite l'interfaccia utente

Puoi anche rimuovere i lavoratori dell'assistenza nella scheda Applicazione in Chrome Devtools.


2
Ho dovuto aggiungere "usa rigoroso"; prima di questo codice per farlo funzionare.
codeKonami,

8
C'è un tempo basato su questo tempo? Supponiamo che un utente abbia visitato una volta, registrato il lavoratore e non sia più tornato da allora, devo conservare questo frammento nel nostro codice per sempre, per ogni evenienza?
loganfsmyth,


10
Ho un post sul blog che esamina questo e altri servizi di rimozione / disinstallazione opzioni love2dev.com/blog/how-to-uninstall-a-service-worker
Chris Love

3
Come sarebbe d'aiuto? La pagina è già memorizzata nella cache dal lavoratore installato e il tuo nuovo script non verrà mai recuperato dagli utenti.
riv

107

Puoi anche andare all'URL: chrome: // serviceworker-internals / e annullare la registrazione di un serviceworker da lì.


9
Puoi digitare questo nella console di sviluppo per annullare la registrazione di tutti in un colpo solo. document.querySelectorAll(".unregister").forEach(item=>item.click())
senbon,

Tuttavia, se hai altri visitatori che devi annullare la registrazione (amici, utenti, project manager, ecc.), La risposta sopra (di Daniel Herr) è più di una soluzione efficace. Hai anche Firefox, Edge e Safari, anche in versioni di iOS, Android, macOS, Windows 10 per ognuno da testare.
Steven Ventimiglia,

$$ ('. unregister'). forEach (item => item.click ())
Travnikov.dev

37

È possibile farlo attraverso Chrome Developer Tool così come Programatically .

  1. Trova tutte le istanze in esecuzione o il lavoratore del servizio digitando

    chrome: // ServiceWorker-internals /

    in una nuova scheda, quindi selezionare il tecnico dell'assistenza che si desidera annullare la registrazione.

  2. Apri Strumenti per sviluppatori (F12) e seleziona Applicazione. Quindi entrambi

    Selezionare Cancella memoria -> Annulla registrazione addetto all'assistenza

    o

    Seleziona Service Workers -> Scegli Update on Reload

  3. programatically

if(window.navigator && navigator.serviceWorker) {
  navigator.serviceWorker.getRegistrations()
  .then(function(registrations) {
    for(let registration of registrations) {
      registration.unregister();
    }
  });
}


22

In Google Chrome, puoi andare su Strumenti per sviluppatori (F12) -> Applicazione -> Addetto all'assistenza e annullare la registrazione degli addetti all'assistenza dall'elenco per quel dominio specifico.

Immagine dello schermo

Questo metodo è efficace nella modalità di sviluppo di un sito e per lo più vengono eseguiti su localhostciò che potrebbe essere necessario per lo sviluppo di altri progetti.


5

Dovresti rilevare due API nei tuoi dispositivi: getRegistrations e getRegistration . Il lavoratore dell'assistenza non ha un set univoco di API in tutte le piattaforme. Ad esempio, alcuni browser hanno solo un navigator.serviceWorker.getRegistration, no navigator.serviceWorker.getRegistrations. Quindi dovresti considerare entrambi.


3

Cordiali saluti, nel caso in cui si utilizzi il browser MacOS Safari , esiste un modo per annullare la registrazione forzata di un operatore del servizio (passaggi e immagini per Safari 12.1):

  1. Safari> Preferenze ...> Privacy> Gestisci dati sito Web ... Preferenze di Safari: Privacy

  2. Inserisci il nome di dominio (es. "Localhost"), fai clic su "Rimuovi" Preferenze di Safari: Privacy: gestisci i dati del sito web

Nota: oltre agli addetti all'assistenza, questo cancellerà anche tutte le cache, i cookie e i database per questo dominio.


Sembra che questo non funzioni se i lavoratori del servizio sono stati installati tramite una finestra privata.
Aris,

3

Oltre alle risposte già corrette fornite, se si desidera eliminare anche la cache SW è possibile richiamare il seguente metodo:

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


Maggiori informazioni in questo articolo (paragrafo: "Annullare la registrazione di un lavoratore dell'assistenza")


Un'altra possibilità, tramite il browser, è l'accesso alla sezione "Archiviazione cache" e fare clic sul pulsante "Cancella dati sito":

inserisci qui la descrizione dell'immagine


0

disinstallare in modo sicuro Service Worker

if ('serviceWorker' in navigator) {
      navigator.serviceWorker.getRegistrations().then(function (registrations) {
        for (const registration of registrations) {
          // unregister service worker
          console.log('serviceWorker unregistered');
          registration.unregister();
        }
      });
    }

0

per rilevare il lavoratore dell'assistenza:

navigator.serviceWorker.controller

Codice per la cancellazione del lavoratore dell'assistenza:

navigator.serviceWorker.getRegistrations()
  .then(registrations => {
    registrations.forEach(registration => {
      registration.unregister();
    })
  });

  navigator.serviceWorker.getRegistrations().then(function(registrations) {
   for(let registration of registrations) {
    registration.unregister()
  } })

  if(window.navigator && navigator.serviceWorker) {
    navigator.serviceWorker.getRegistrations()
    .then(function(registrations) {
      for(let registration of registrations) {
        registration.unregister();
      }
    });
  }

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

  if ('serviceWorker' in navigator) {
        navigator.serviceWorker.getRegistrations().then(function (registrations) {
          for (const registration of registrations) {
            // unregister service worker
            console.log('serviceWorker unregistered');
            registration.unregister();

            setTimeout(function(){
              console.log('trying redirect do');
              window.location.replace(window.location.href); // because without redirecting, first time on page load: still service worker will be available
            }, 3000);
          }
        });
      }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.