服务工作者在 Chrome Android 上意外取消注册 - 服务工作者在 Chrome Android 上不是永久的
Posted
技术标签:
【中文标题】服务工作者在 Chrome Android 上意外取消注册 - 服务工作者在 Chrome Android 上不是永久的【英文标题】:Service worker unexpected unregistration on Chrome Android - Service worker is not permanent on Chrome Android 【发布时间】:2019-03-08 08:18:41 【问题描述】:在 nodejs 上运行服务器,因为我按照 google 的教程(并使用 'node-gcm' 包)跳转到 payload firebase notifications,一切正常。我的 android 手机(Android 8.0.0 上的 Galaxy A3 2017)上的注册工作正常,我确实收到了通知,但它不是永久性的。 几天后,我的机器没有注册了。它在桌面 chrome 上运行良好,所以我不会怀疑服务器端。
下面是客户端的代码
var reg;
navigator.serviceWorker.register('sw.js').then(function()
return navigator.serviceWorker.ready;
).then(function(serviceWorkerRegistration)
reg = serviceWorkerRegistration;
console.log('Service Worker is ready :^)', reg);
checkSubscription();
).catch(function(error)
console.log('Service Worker Error :^(', error);
);
;
function urlBase64ToUint8Array(base64String)
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding)
.replace(/-/g, '+')
.replace(/_/g, '/');
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (var i = 0; i < rawData.length; ++i)
outputArray[i] = rawData.charCodeAt(i);
return outputArray;
const vapidPublicKey = '<Your Public Key from generateVAPIDKeys()>';
const convertedVapidKey = urlBase64ToUint8Array(vapidPublicKey);
function subscribe()
if (reg)
reg.pushManager.getSubscription().then(function(pushSubscription)
if (pushSubscription==null)
reg.pushManager.subscribe(
userVisibleOnly: true,
applicationServerKey: convertedVapidKey
).then(function(pushSubscription)
var sub = pushSubscription;
console.log('Subscribed!', sub);
socket.emit("notification subscription payload",sub);
isSubscribed = true;
).catch(function(error)
alexUI.view.log.addLog(severity:"ERROR",clientSocketID,"Erreur de souscription");
alexUI.view.radioButton($("#subscription"),"Off");
);
else
var sub = pushSubscription;
// socket.emit("notification subscription",sub.endpoint);
socket.emit("notification subscription payload",sub);
isSubscribed = true;
;
).catch(function(e)
// to remove message later Alex
alexUI.view.log.addLog(severity:"ERROR",message:e,clientSocketID,"Notifications indisponibles");
alexUI.view.radioButton($("#subscription"),set:"Off");
);
else
alexUI.view.log.addLog(severity:"ERROR",clientSocketID,"Navigateur incompatible");
alexUI.view.radioButton($("#subscription"),"Off");
;
;
【问题讨论】:
【参考方案1】:清理我的手机存储后,问题就消失了。手机内存已满,Service Worker 无法正常加载。
【讨论】:
以上是关于服务工作者在 Chrome Android 上意外取消注册 - 服务工作者在 Chrome Android 上不是永久的的主要内容,如果未能解决你的问题,请参考以下文章
Cordova - 为啥 $http get 请求在 android 设备上失败但在 chrome 上工作
离子请求仅在 android 上返回 404,在 Chrome 中它工作正常
如何从 PWA 应用主屏幕链接中删除 Chrome 徽标(Android O 预览版)
Android Studio 在 Mac Catalina 测试版上意外退出