【问题标题】:in a PWA, is there a way to check for a waiting service worker upgrade?在 PWA 中,有没有办法检查等待的服务人员升级?
【发布时间】:2019-12-06 04:57:21
【问题描述】:

我知道我可以使用 statechange 来监听已安装状态,然后提示用户查看是否要升级。

只要用户当时说“是”,它就可以很好地工作。但是当用户拒绝或出于某种原因按下 F5 重新加载页面时,似乎没有任何方法可以再次检查是否有等待升级。

我最感兴趣的是在页面加载后立即进行快速检查,看看是否有等待升级,如果需要,重新提示用户。页面重新加载时不会触发已安装事件,这会强制用户关闭浏览器并再次打开以安装升级。我觉得我一定是错过了什么。

谢谢!

【问题讨论】:

    标签: service-worker progressive-web-apps


    【解决方案1】:

    service worker install 事件仅在安装新的 service worker 时触发,而 activate 事件在已安装的 service worker 被激活时触发。

    self.addEventListener('install',function(e){
        e.preventDefault();
        console.log('install')
        localStorage.setItem('ServiceWorkerWaitingForInstall','true');
    });
    
    self.addEventListener('activate',function(e){
        e.preventDefault();
        console.log('activate')
        localStorage.setItem('ServiceWorkerWaitingForInstall','false');
    });
    

    您可以通过调用检查是否有新的服务人员等待更新或不形成

        localStorage.getItem('ServiceWorkerWaitingForInstall');
    

    【讨论】:

    • 这确实让我知道有一个新的工人正在等待,但它让我无法激活它。我想出了一个真正符合我需求的解决方案。
    • 你可以使用 ServiceWorkerRegistration.update() 来更新 service worker
    • 我没有尝试检查更新。在我的案例中已经检查了更新,并且已经提示用户一次。但是,如果浏览器保持打开状态并且用户按 F5 重新加载页面,则旧的 service worker 会激活,而新的 service worker 仍处于“等待”状态。只要浏览器保持打开状态,这将永远持续下去。因此,在用户重新启动或强制关闭浏览器之前,他们将无法获得新版本。这主要出现在几乎不会关闭电源或浏览器内存不足的手机上。
    • 这篇文章可能对你有帮助 davidwalsh.name/service-worker-claim
    • 谢谢,我自己弄清楚了这个过程并接受了上面的答案。当软件注册时,您可以询问是否有替换升级等待接管。
    【解决方案2】:

    诀窍是在注册过程之后立即向 ServiceWorkerRegistration 询问等待的工作人员。我为我工作的是这样的代码......

    在注册 Service Worker 的脚本的全局范围内,我创建了一个变量和函数,以便我可以连接到新的 Worker 并提示用户进行升级。

    var newWorker;
    
    function promptToUpgrade()
    {
        if(confirm('Upgrade to new version?'))
        {
            newWorker.postMessage("skipWaiting");
        }
    }
    

    在同一脚本的 window.load 函数中,我将连接存储到等待的工作人员,如果它不为 NULL,我调用我的提示函数。

    navigator.serviceWorker.register('./sw.js',{'scope':'./'}).then(function(reg) {
            newWorker=reg.waiting;
            if(newWorker) promptToUpgrade();
    

    在 Service Worker 本身中,我有几个函数,客户端可能会调用这些函数来让 Worker 执行各种任务。其中一项任务是跳过等待并激活新的工作人员。此示例仅显示一项任务。

    self.addEventListener("message", function(event) {
        switch(data)
        {
            case 'skipWaiting':
                self.skipWaiting();
                break;
        }
    });
    

    我还通过在 updatefound 事件的注册过程中添加侦听器检测到新工作人员时调用 promptToUpdate 函数。这就是我一直以来的做法。但这仅在新工作人员首次安装时才会触发,然后再也不安装。上面的代码允许我在注册过程开始时检查,然后在页面重新加载时再次调用 promptToUpdate。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多