Bellow ist, wie ich meine Serviceworker registrieren:Serviceworker `onupdatefound` nicht ausgelöst auf mobilen
if ('serviceWorker' in navigator) {
window.addEventListener('load',() => {
function updateOnlineStatus() {
SnackBar.show({
text: navigator.onLine ? onlineMsg : offlineMsg,
backgroundColor: '#000000',
actionText: close,
actionTextColor: '#d2de2f',
customClass: 'custom-snackbar',
});
}
window.addEventListener('online', updateOnlineStatus);
window.addEventListener('offline', updateOnlineStatus);
navigator.serviceWorker.register('sw.js').then((reg) => {
reg.onupdatefound =() => {
const installingWorker = reg.installing;
installingWorker.onstatechange =() => {
switch (installingWorker.state) {
case 'installed':
if (navigator.serviceWorker.controller) {
SnackBar.show({
text: refreshMsg,
backgroundColor: '#000000',
actionText: refresh,
actionTextColor: '#d2de2f',
onActionClick:() => { location.reload(); },
customClass: 'custom-snackbar',
});
} else {
console.info(availableMsg);
}
break;
case 'redundant':
console.info(redundantMsg);
break;
default:
break;
}
};
};
}).catch((e) => {
console.error(errorMsg, e);
});
});
}
Diese Serviceworker wird durch Workbox während Build erzeugt.
ich ein wenig besorgt bin, weil diese Benachrichtigungen auf meinem Computer (ubuntu + chrome 59.0.3071.115
) jedoch nie auf meinem Handy (android 6.0.1
+ chrome 59.0.3071.125
)
Nach der Analyse mit Remote-Debugging-Funktion angezeigt werden, sieht es aus wie onupdatefound
nie ist ausgelöst auf meinem Handy.
Ich fühle mich sehr schlecht über UX, über die Besucher auf mobilen denken, die nicht, dass eine neue Version der Website wissen würde aussteht ...
vorschläge oder Beratung wird
geschätzt werden Edit 1: Ich habe weitere Details zum Abschnitt "Browser-Kompatibilität" auf dieser Webseite gefunden: https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/onupdatefound. Es scheint, dass die Unterstützung dieser Funktion von Chrome für Android nicht bekannt ist.
Haben Sie eine Art Fallback/Workaround, wenn der Browser onupdatefound
Event nicht unterstützt?
Edit 2: Als Antwort auf Jeff,
sw.js
Header wird in .htaccess
Datei verwaltet:
<Files sw.js>
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</Files>
, die produziert:
accept-ranges: bytes
cache-control: max-age=0, no-cache, no-store, must-revalidate
content-encoding: br
content-language: fr-FR
content-length: 1636
content-type: application/javascript; charset=utf-8
date: Fri, 21 Jul 2017 13:04:06 GMT
expires: Wed, 11 Jan 1984 05:00:00 GMT
last-modified: Tue, 18 Jul 2017 02:58:30 GMT
pragma: no-cache
In Bezug auf workbox Feinabstimmung Sie vorschlagen, ich habe noch keine Zeit gefunden, um zu graben, also benutze ich den einfachen workbox-build
in einer Schluckdatei. Aber ich werde hoffentlich :)
// Service Worker generation
gulp.task('bundle-sw', gulp.series('generate-sitemap',() => {
return wbBuild.generateSW({
globDirectory: gulpOutputDir,
swDest: `${gulpOutputDir}/sw.js`,
globPatterns: ['**/*.{html,png,xml,css,ico,txt,json,svg,js,map,gif,jpeg,jpg,bmp,cur,webp,woff2}'],
skipWaiting: true,
clientsClaim: true,
})
.then(() => {
console.warn('Service worker generated.');
})
.catch((err) => {
console.error(`[ERROR] This happened: ${err}`);
});
}));
Glauben Sie, es durch skipWaiting: true
verursacht werden könnten?
bearbeiten 3: mit BroadcastChannel
navigator.serviceWorker.register('/sw.js').then((reg) => {
console.log('test');
const updateChannel = new BroadcastChannel('precache-updates');
updateChannel.addEventListener('message', event => {
console.log(`Cache updated: ${event.data.payload.updatedUrl}`);
});
}).catch((e) => {
console.error(errorMsg, e);
});
Versuch
Auch wenn test
in Protokoll auf Chrome, mobile outputed ist, oder firefox, Nachrichten aktualisieren werden auf Chrome
https://developers.google .com/web/basicals/instant-and-offline/service-worker/lifecycle # handling_updates Sie möchten Ihren Beobachter nach der Überprüfung der Dokumente möglicherweise überarbeiten. –