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

标签 javascript angular push-notification google-chrome-devtools service-worker

我通过使用带有“/”值的 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/

相关文章:

javascript - Firebase 和 javascript - 将项目从一个列表排除到另一个列表

testing - angular2 测试 : Can't bind to 'ngModel' since it isn't a known property of 'input'

没有装饰器的类中的 Angular 2 服务注入(inject)

ios - iOS 是否会限制预定的本地推送通知?

ios - 如何使用 Swift 获取推送通知状态?

javascript - 将 span 的额外文本换行到下一行

javascript - Android:如何在加载资源时显示动画启动画面

java - 在没有 Firebase 控制台的情况下向所有设备发送推送通知

javascript - 如何仅在一个国家和操作系统中运行 javascript 函数?

angular - 无法使用 IE 11 和 Angular 4 在 ArcgisMap 上拖动