Estoy tratando de hacer una sincronización de bg periódica donde el trabajador del servicio actualiza la insignia. Cuando ejecuto mi página y la pruebo a través de Chrome DevTools, el trabajador del servicio procesa la solicitud. Pero cuando la página está cerrada, no hace nada. Lo mismo en el teléfono móvil.
En mi página (esta parte funciona y la salida en la consola es periodic update set ):
navigator.permissions.query({name:'periodic-background-sync'}).then(function(result) { if (result.state === 'granted') { console.log('periodic background granted'); navigator.serviceWorker.ready.then(function(registration){ if ('periodicSync' in registration) { try { registration.periodicSync.register('update-badge', { minInterval: 60 * 60 * 1000, }).then(function(ret){ console.log('periodic update set'); }); } catch (error) { console.log('Periodic background sync cannot be used.'); } } }); } });Trabajador del servicio:
async function updateBadge() { const unreadCount = 5; //fixed value for testing navigator.setAppBadge(unreadCount).catch((error) => { console.log('Error setting badge.'); }); } self.addEventListener('periodicsync', (event) => { if (event.tag === 'update-badge') { event.waitUntil(updateBadge()); } });Entonces, cuando disparo manualmente la sincronización en segundo plano desde DevTools, la insignia se configura, pero no automáticamente en segundo plano como pensé que funcionaría.
El intervalo específico en el que se activa el evento de sincronización periodicsync varía; lo que he visto en, por ejemplo, las aplicaciones web de Android instaladas es que obtendrá una sincronización periodicsync una vez al día. Puede ser diferente en las plataformas de escritorio (y solo sucederá si su navegador se está ejecutando en ese momento).
¿Ha esperado un día completo más o menos después de instalar su PWA y ver si se dispara?
No puedo encontrar nada malo con el código. He visto variantes en las que solicita sincronización de fondo periódica después de navigator.serviceWorker.ready, pero creo que ambas funcionan (especialmente porque puede activar el evento registrado manualmente).
Creo que el problema es que no todas las condiciones para que se active la sincronización periódica en segundo plano son ciertas. Estas son las condiciones de la implementación inicial en Chrome (2019):
En su caso, creo que su código es correcto y funciona, pero no ha interactuado lo suficiente con su aplicación de forma continua durante 36 horas, por lo que se purga el compromiso y se cancela el temporizador de sincronización periódica (si ha instalado su PWA).
Para el registro, aquí hay una demostración de trabajo completa (registro de eventos) (y código sw ).