即使在注册时指定根范围,Service Worker也会被删除并且不会收到推送事件

问题描述 投票:1回答:1

我正在使用带有'/'值的Service-Worker-Allowed标头注册服务工作者,并在注册时指定范围。

注册S / W:

navigator.serviceWorker.register('/ myapp / js / serviceWorker.js',{scope:'/'})

^这是成功的。

服务S / W:

res.setHeader('Service-Worker-Allowed','/');

工作流程如下所示,myapp不是直接调用,而是在幕后完成而无需用户看到实际的URL。

用户导航到

呜呜呜.domain.com/other app?call没有app=true

并在幕后启动myapp www.domain.com/myapp,我在上面注册了根作用域。

用户导航到

呜呜呜.domain.com/other app/something else&没有app=false

myapp无法供用户进行交互。

早些时候(虽然不使用根范围)服务工作者变得多余,但现在却没有。但它被标记为已删除。

这次重定向后我没有收到任何推送事件。

serviceWorker.js

self.addEventListener("push", function (event) {
    console.log('sw push event');
    if (event.data) {
        const notificationData = JSON.parse(event.data.text());
        self.registration.showNotification(notificationData.title, notificationData);
    }
});

根据我对范围的理解,如果我使用根范围注册服务工作者,它仍应可用于接收推送事件而不会被标记为已删除。

我看到很多关于服务工作者和有角度的帖子,可能值得一提的是myapp是旧学校骨干/香草/尘埃JS,而otherapp是Angular。

回答:

问题是其他应用程序未订阅所有服务工作者。只有我知道。 :/即使在显式缓存myApp文件之后,我还需要一段时间来调试并从日志中结束。

javascript angular push-notification google-chrome-devtools service-worker
1个回答
1
投票

目前尚不清楚“幕后”或“用户无法进行交互”的含义。获得这些问题帮助的最佳方法是创建一个简化的示例,就像在某些内容中演示了删除所有不相关内容的错误。

我试图重新创建你正在谈论的系统。 https://glitch.com/edit/#!/sw-scope-example?path=server.js:22:0

如果你访问https://sw-scope-example.glitch.me/install-service-worker/它会调用:

navigator.serviceWorker.register('/deep/path/to/sw.js', { scope: '/' });

该服务工作者有一个标题:

Service-Worker-Allowed: /

服务人员非常基本:

addEventListener('fetch', (event) => {
  event.respondWith(new Response('This is a response from the service worker.'));
});

它注册很好。现在,如果您访问原点上的任何URL,例如https://sw-scope-example.glitch.me/other-app/whatever,您将看到来自服务工作者的响应。

这很好用,所以你的例子与我的一些关键区别。你可以将上面的Glitch重新混音,这样可以证明你所看到的问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.