服务工作者在 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 测试版上意外退出

意外的 Chrome 自动填充行为 [禁用 chrome 自动填充]

keyup 无法在 Android 上的 Chrome 上运行