Sé que puedo usar el cambio de estado para escuchar el estado instalado y luego pedirle al usuario que vea si desea actualizar.

Esto funciona muy bien siempre que el usuario diga SÍ en ese momento. Pero cuando el usuario dice que no o, por alguna razón, presiona el F5 para volver a cargar la página, no parece haber ninguna forma de verificar nuevamente para ver si hay una actualización en espera.

Estoy más interesado en hacer una verificación rápida justo después de que se cargue la página para ver si hay una actualización en espera y, si es necesario, volver a preguntar al usuario. El evento instalado no se activa en una recarga de página que obliga al usuario a cerrar el navegador y abrirlo nuevamente para instalar la actualización. Siento que me falta algo.

¡Gracias!

-1
Glenn J. Schworak 6 dic. 2019 a las 07:57

2 respuestas

La mejor respuesta

El truco consiste en preguntarle a ServiceWorkerRegistration sobre el trabajador en espera justo después del proceso de registro. Lo que conseguí para mí fue un código como este ...

En el alcance global de mi script que registra al Service Worker, creé una variable y una función para poder conectarme con el nuevo trabajador y preguntarle al usuario sobre la actualización.

var newWorker;

function promptToUpgrade()
{
    if(confirm('Upgrade to new version?'))
    {
        newWorker.postMessage("skipWaiting");
    }
}

En la función window.load del mismo script, almaceno la conexión con el trabajador en espera y, si no es NULL, llamo a mi función de solicitud.

navigator.serviceWorker.register('./sw.js',{'scope':'./'}).then(function(reg) {
        newWorker=reg.waiting;
        if(newWorker) promptToUpgrade();

En el Service Worker mismo, tengo varias funciones que el cliente podría llamar para hacer que el trabajador realice varias tareas. Una de esas tareas es omitir la espera y activar el nuevo trabajador. Este ejemplo solo muestra una tarea.

self.addEventListener("message", function(event) {
    switch(data)
    {
        case 'skipWaiting':
            self.skipWaiting();
            break;
    }
});

También llamo a la función promptToUpdate cuando se detecta el nuevo trabajador agregando un agente de escucha en el proceso de registro para el evento updatefound . Así ha sido todo el tiempo. Pero esto solo se dispara cuando el nuevo trabajador se instala por primera vez y luego nunca más. El código anterior me permite verificar al inicio del proceso de registro y luego llamar al promptToUpdate nuevamente cada vez que se vuelve a cargar la página.

0
Glenn J. Schworak 6 dic. 2019 a las 10:45

El evento de instalación del trabajador de servicio se emite solo cuando se instala un nuevo trabajador de servicio y se activa el evento de activación cuando se activa el trabajador de servicio instalado.

self.addEventListener('install',function(e){
    e.preventDefault();
    console.log('install')
    localStorage.setItem('ServiceWorkerWaitingForInstall','true');
});

self.addEventListener('activate',function(e){
    e.preventDefault();
    console.log('activate')
    localStorage.setItem('ServiceWorkerWaitingForInstall','false');
});

Puede verificar si el nuevo trabajador de servicio espera ser actualizado o no formarse llamando

    localStorage.getItem('ServiceWorkerWaitingForInstall');
0
Shirish Maharjan 6 dic. 2019 a las 05:24