Aquí está el proceso que me gustaría desarrollar:
Comportamiento :
Ahora me gustaría que si el usuarioA modifica la página:
pero parece que:
entonces mi pregunta es:
En otras palabras: en la actualización de la página, serviceWorker ordena al suscriptor que vuelva a cargar
dicho código de trabajador de servicio falla:
if (client.url == self.registration.scope && 'focus' in client) { client.postMessage('reload'); // DOESN'T WORK return client.focus(); }Código de error en Android/Chrome para setinterval:
setInterval(async function(){ const response = await fetch('/lastupdatetimestamp', { method: 'get', headers: { 'Content-Type': 'application/json' } }); const json= await response.json(); if(LASTUP<json.up.lastdate){ window.location.reload() LASTUP=json.up.lastdate } }, 30000);Alguna idea ?
Finalmente encontré un primer paso:
servidor enviar push -> serviceworker mostrar notificación -> hacer clic en notificación -> abre ventana y vuelve a cargar
en el serviceWorker.js
self.addEventListener('push', function (event) { ... } self.addEventListener('notificationclick', async function(event) { event.notification.close(); await event.waitUntil(clients.matchAll({ type: "window", includeUncontrolled: true }).then(function(clientList) { for (var i = 0; i < clientList.length; i++) { var client = clientList[i]; if (client.url == self.registration.scope && 'focus' in client) { // client.postMessage('reload'); // <= TRIGGER 'RELOAD' EVENT HERE return client.focus(); } } if (clients.openWindow) { return clients.openWindow(self.registration.scope); } })); });en la aplicación.js
function initPostMessageListener() { console.log("event listener message") navigator.serviceWorker.addEventListener('message', function(e) { var message = e.data; console.log("ON A UN MESSAGE") switch (message) { case 'reload': window.location.reload(true); break; default: console.warn("Message '" + message + "' not handled."); break; } }); }llame a initPostMessageListener() en app.js donde está registrado el SW
Entonces, SW.js maneja la notificación. Haga clic, luego abra la ventana del navegador, si existe, y vuelva a cargarla.