我通过使用带有“/”值的 Service-Worker-Allowed header 并在注册时指定范围来注册服务 worker 。
注册软件:
navigator.serviceWorker.register('/myapp/js/serviceWorker.js', {scope: '/'})
^ 这样就成功了
服务于 S/W:
res.setHeader('Service-Worker-Allowed', '/');
工作流程如下所示,myapp 不是直接调用的,而是在用户看不到实际 url 的情况下在后台完成的。
用户导航到
www.domain.com/otherapp?callmyapp=true
在幕后 myapp www.domain.com/myapp
是在我使用根范围进行上述注册的地方启动的。
一旦用户导航到
www.domain.com/otherapp/somethingelse&myapp=false
myapp 不可用于用户交互。
早些时候(虽然不使用根作用域)服务 worker 变得多余,但现在不是了。但是它被标记为已删除。
这次重定向后我没有收到任何推送事件。
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);
}
});
据我对范围的了解,如果我在根范围内注册服务 worker ,它应该仍然可以接收推送事件,而不是被标记为已删除。
我看到很多关于 service worker 和 angular 的帖子,可能值得一提的是 myapp 是老式的 backbone/vanilla/dust JS,而 otherapp 是 Angular。
回答:
问题是 otherApp 正在取消订阅所有服务人员。除非我知道。 :/即使在显式缓存 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 有一个标题:
Service-Worker-Allowed: /
Service Worker 非常基础:
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 以演示您遇到的问题?
关于javascript - Service Worker 被删除并且即使在注册时指定根范围后也不会收到推送事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54949523/