40

在实现 chrome 推送通知时,我们正在从我们的服务器获取最新的更改。这样做时,服务人员会显示带有消息的额外通知

本站已在后台更新

已经尝试过这里发布的建议 https://disqus.com/home/discussion/html5rocks/push_notifications_on_the_open_web/
但到目前为止找不到任何有用的东西。有什么建议吗?

4

6 回答 6

31

我遇到了同样的问题,但经过长时间的研究,我知道这是因为 PUSH 事件和 self.registration.showNotification() 之间发生了延迟。我只在 self.registration.showNotification() 之前错过了 return 关键字

所以你需要实现以下代码结构来获取通知:

var APILINK = "https://xxxx.com";
 self.addEventListener('push', function(event) {
      event.waitUntil(
          fetch(APILINK).then(function(response) {

        return response.json().then(function(data) {
                  console.log(data);
                  var title = data.title;
                  var body = data.message;
                  var icon = data.image;
                  var tag = 'temp-tag';
                  var urlOpen = data.URL;

                return  self.registration.showNotification(title, {
                      body: body,
                      icon: icon,
                      tag: tag
                  })
              });
          })
      );
  });
于 2015-08-19T11:57:53.183 回答
18

我过去遇到过这个问题。根据我的经验,原因通常是以下三个问题之一:

  1. 您没有显示响应推送消息的通知。每次您在设备上收到推送消息时,当您完成事件处理后,通知必须在设备上保持可见。这是由于订阅了该userVisibleOnly: true选项(尽管请注意这不是可选的,并且不设置它会导致订阅失败。
  2. 您不是event.waitUntil()在响应处理事件时调用。应将一个 Promise 传递给此函数,以向浏览器指示它应等待 Promise 解决,然后再检查是否显示通知。
  3. 出于某种原因,您在event.waitUntil显示通知之前解决了传递给的承诺。请注意,这self.registration.showNotification是一个 Promise 和 async,因此您应该确保它在 Promise 传递给 resolve 之前已经event.waitUntil解决。
于 2016-01-04T14:02:53.373 回答
16

通常,一旦您收到来自 GCM(Google Cloud Messaging)的推送消息,您就必须在浏览器中显示推送通知。这里的第三点提到了这一点:

https://developers.google.com/web/updates/2015/03/push-notificatons-on-the-open-web#what-are-the-limitations-of-push-messaging-in-chrome-42

因此,您可能会以某种方式跳过推送通知,尽管您收到了来自 GCM 的推送消息,并且您收到了带有一些默认消息的推送通知,例如“此站点已在后台更新”。

于 2015-07-02T09:41:42.953 回答
4

这有效,只需复制/粘贴/修改。用下面的代码替换“return self.registration.showNotification()”。第一部分是处理通知,第二部分是处理通知的点击。但是不要感谢我,除非你感谢我在谷歌上搜索答案的时间。

说真的,所有的感谢都归功于developer.google.com上的 Matt Gaunt

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

  var title = 'Yay a message.';
  var body = 'We have received a push message.';
  var icon = 'YOUR_ICON';
  var tag = 'simple-push-demo-notification-tag';
  var data = {
    doge: {
        wow: 'such amaze notification data'
    }
  };

  event.waitUntil(
    self.registration.showNotification(title, {
      body: body,
      icon: icon,
      tag: tag,
      data: data
    })
  );
});

self.addEventListener('notificationclick', function(event) {
  var doge = event.notification.data.doge;
  console.log(doge.wow);
});
于 2018-02-21T08:14:11.347 回答
3

我试图理解为什么 Chrome 要求服务人员在收到推送通知时必须显示通知。我相信原因是即使在用户关闭网站的选项卡后,推送通知服务人员也会继续在后台运行。所以为了防止网站在后台偷偷运行代码,Chrome 要求它们显示一些信息。

Chrome 中推送消息的限制是什么?

...

  • 当您收到推送消息时,您必须显示通知。

...

为什么不使用 Web Sockets 或服务器发送事件 (EventSource)?

使用推送消息的好处是,即使您的页面关闭,您的 service worker 也会被唤醒并能够显示通知。当页面或浏览器关闭时,Web Sockets 和 EventSource 的连接也会关闭。

于 2020-01-22T14:44:49.297 回答
2

如果您在接收推送通知事件时需要发生更多事情,showNotification()则返回一个Promise. 所以你可以使用经典的链接。

const itsGonnaBeLegendary = new Promise((resolve, reject) => {
    self.registration.showNotification(title, options)
        .then(() => {
            console.log("other stuff to do");

            resolve();
        });
});

event.waitUntil(itsGonnaBeLegendary);
于 2018-09-05T15:14:36.913 回答