我正在使用带有'/'值的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文件之后,我还需要一段时间来调试并从日志中结束。
目前尚不清楚“幕后”或“用户无法进行交互”的含义。获得这些问题帮助的最佳方法是创建一个简化的示例,就像在某些内容中演示了删除所有不相关内容的错误。
我试图重新创建你正在谈论的系统。 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重新混音,这样可以证明你所看到的问题吗?