Merge pull request 'service worker stuff' (#40) from v.1.2.7 into main
Reviewed-on: #40
This commit was merged in pull request #40.
This commit is contained in:
@@ -3,47 +3,48 @@
|
||||
|
||||
const serviceWorkerVersion = '{{flutter_service_worker_version}}';
|
||||
|
||||
if ('serviceWorker' in navigator) {
|
||||
window.addEventListener('load', function () {
|
||||
const serviceWorkerUrl = 'flutter_service_worker.js?v=' + serviceWorkerVersion;
|
||||
|
||||
// Manually register here so we can attach custom update listeners
|
||||
navigator.serviceWorker.register(serviceWorkerUrl).then((reg) => {
|
||||
if (reg.waiting) {
|
||||
showUpdatePrompt(reg);
|
||||
}
|
||||
// 1. Let Flutter handle the service worker registration cleanly via its native loader
|
||||
_flutter.loader.load({
|
||||
serviceWorkerSettings: {
|
||||
serviceWorkerVersion: serviceWorkerVersion
|
||||
}
|
||||
});
|
||||
|
||||
reg.addEventListener('updatefound', () => {
|
||||
const newWorker = reg.installing;
|
||||
// 2. Safely monitor the registration generated by Flutter without double-registering
|
||||
if ('serviceWorker' in navigator) {
|
||||
navigator.serviceWorker.ready.then((reg) => {
|
||||
// If an updated worker is already waiting in the background
|
||||
if (reg.waiting) {
|
||||
showUpdatePrompt(reg);
|
||||
}
|
||||
|
||||
// Listen for new updates found while the user has the app open
|
||||
reg.addEventListener('updatefound', () => {
|
||||
const newWorker = reg.installing;
|
||||
if (newWorker) {
|
||||
newWorker.addEventListener('statechange', () => {
|
||||
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
|
||||
showUpdatePrompt(reg);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
let refreshing = false;
|
||||
navigator.serviceWorker.addEventListener('controllerchange', () => {
|
||||
if (!refreshing) {
|
||||
refreshing = true;
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Guard against infinite reload loops when the controller shifts
|
||||
let refreshing = false;
|
||||
navigator.serviceWorker.addEventListener('controllerchange', () => {
|
||||
if (!refreshing) {
|
||||
refreshing = true;
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function showUpdatePrompt(reg) {
|
||||
if (confirm('A new version of MIH is available. Refresh now to update?')) {
|
||||
reg.unregister().then(function () {
|
||||
window.location.reload(); // Bypass cache and reload
|
||||
window.location.reload(); // Unregister and reload to force clear the browser's cache
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize Flutter and pass the service worker version
|
||||
_flutter.loader.load({
|
||||
serviceWorkerSettings: {
|
||||
serviceWorkerVersion: serviceWorkerVersion
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user