未在多个标签

时间:2017-06-16 12:30:28

标签: javascript google-chrome push-notification service-worker web-push

我正在使用网络推送协议来发送推送通知。我已经注册了一个服务工作者,并在一个选项卡中成功订阅了pushManager。当我发送消息时,推送事件能够接收通知并在控制台中记录消息。

我正在打开相同的网址,同一服务工作人员正在注册并使用以下代码段返回相同的订阅。

serviceWorkerRegistration.pushManager.getSubscription()

但是当我发送消息时,第一个选项卡仅在控制台中记录消息。第二个选项卡不会在控制台中记录消息。

当我关闭第一个标签并发送消息时,现在我可以看到服务工作者记录的第二个标签控制台中的消息。

注意:两个标签都加载在同一个来源中。 示例:https://localhost:8080/WebPush

以下是我的服务工作者代码

    self.addEventListener('push', function(event) {
      if (event.data) {
         console.log('This push event has data: ', event.data.text());
      } 
      else {
         console.log('This push event has no data.');
      }
   });

在我尝试使用firebase的同时,我可以在两个标签中接收消息。

任何人都可以帮助我使用网络推送在两个标签上接收消息。

提前致谢。

2 个答案:

答案 0 :(得分:2)

我找到了实现此用例的一种可能方法。

触发推送事件后,使用服务工作者客户端API,我将找到相同来源的开放客户端数量并向所有客户端发布消息。

以下是需要在服务工作者中添加内部推送事件的代码段。

    clients.matchAll({
        type: 'window',
        includeUncontrolled: true
      })
      .then(function(windowClients)
      {   
        windowClients.forEach(function(windowClient){
        windowClient.postMessage({
          message: 'Received a push message.'+event.data.text(),
          time: new Date().toString()
        });
      });

});

添加服务工作者监听器。

    navigator.serviceWorker.addEventListener('message', function(event) {
      console.log('Received a message from service worker: ', event.data);
    });

这将有助于在多个标签页中接收推送消息。

答案 1 :(得分:0)

服务工作者将响应推送事件一次。这将发生在推送通知产生的线程中。它不会为每个浏览器选项卡启动。事实上,除了任何客户端使用的实例之外,它将是或应该是服务工作者的单独实例。推送通知的客户端是操作系统,如果你愿意,那就是无头客户端。

是的,您将看到记录的控制台消息。我怀疑Chrome的内部有线程寻找第一个打开的客户端,并带有一个控制台来传递这些消息。

我不能代表Chrome,FireFox,Opera,Samsung或Edge采用的实际线程模型,以了解不同的事件响应是如何进行线程化的,但它们在获取,推送和背景方面本质上应该是分开的同步。

我希望这可以帮助你理解这个概念,但你所看到的是我期望看到的,一个控制台记录来自推送的sw线程的消息。