【问题标题】:get and show push data from serviceworker in chrome在 chrome 中获取并显示来自 serviceworker 的推送数据
【发布时间】:2016-11-04 13:08:44
【问题描述】:

我使用 pushwoosh 在我的网络应用程序中接收推送通知。 每件事都运行良好并在 serviceworker 监听器中收到推送消息,但我想从 serviceworker 提供推送消息数据并在另一个 js 类中处理它

main.js 像这样:

if ('serviceWorker' in navigator) {
  console.log('Service Worker is supported');
  navigator.serviceWorker.register('sw.js').then(function() {
    return navigator.serviceWorker.ready;
  }).then(function(reg) {
    console.log('Service Worker is ready :^)', reg);
      // TODO
  }).catch(function(error) {
    console.log('Service Worker error :^(', error);
  });
}

// get push message data in main.js and process it

这样的服务工作者:

self.addEventListener('push', function(event) {
  console.log('Push message', event);

  var title = 'Push message';

  event.waitUntil(
    self.registration.showNotification(title, {
      'body': 'The Message',
      'icon': 'images/icon.png'
    }));
});

【问题讨论】:

  • 为此使用 service 工作者似乎很奇怪。为什么不是标准工人?
  • pushwoosh sdk 使用 serviceworker
  • 我在他们的网站上找不到这方面的证据,但无论如何。大概如果他们这样做,他们有一个理由。

标签: javascript service-worker pushwoosh


【解决方案1】:

正如我在评论中提到的,对于服务工作者而不是标准工作者来说,这似乎是一个有点奇怪的用例,但是:

您可以让您的服务工作者在收到推送给它的消息时向所有连接的客户端发送消息。

This answer 展示了一个服务工作者与客户交谈的完整示例,但从根本上讲:

  1. 它管理的页面监听消息:

    navigator.serviceWorker.addEventListener('message', event => {
        // use `event.data`
    });
    
  2. Service Worker 像这样发送给他们:

    self.clients.matchAll().then(all => all.forEach(client => {
        client.postMessage(/*...message here...*/);
    }));
    

或者使用 ES5 和更早的语法(但我认为任何支持服务工作者的浏览器都不支持箭头功能):

页面监听:

navigator.serviceWorker.addEventListener('message', function(event) {
    // use `event.data`
});

工人发送:

self.clients.matchAll().then(function(all) {
    all.forEach(function(client) {
        client.postMessage(/*...message here...*/);
    });
});

【讨论】:

  • 感谢您的响应。我将第一个代码放在 html 页面中,然后将代码放在 self.addEventListener('push', function(event) 但客户端(html 页面)没有从 serviceworker 提供任何消息
  • @Roox:上述方法确实有效,但您必须记住服务工作者的生命周期,特别是安装工作者的页面不会成为工作者的客户端,直到/除非它被刷新。我仍然不确定服务人员是否正确,但这取决于你。
  • clients.matchAll() 返回一个空数组
  • @Roox:很明显,当工人收到推送时,没有客户附加到工人身上。同样,为此使用服务人员是没有意义的。我什至根本没有看到对网络工作者的需求。
  • 对我来说,此代码不起作用。 event.data 始终为空。
猜你喜欢
  • 1970-01-01
  • 2019-02-06
  • 2015-12-06
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
相关资源
最近更新 更多