7

我在我的网站中使用 FCM 推送通知,我希望用户可以在他或她点击推送通知时进入我的网站。请注意,用户可能在其他应用程序或其他浏览器选项卡中,我希望当用户收到 fcm 通知时,用户将能够通过单击 Firefox 浏览器中的通知进入我的网站。出于这个原因,我使用了 service worker 中可用的 notificationclick 事件。我使用的代码是这样的:

self.addEventListener('notificationclick', event => {
  console.log('On notification click: ', event.notification.tag);
  event.notification.close();

  // This looks to see if the current is already open and
  // focuses if it is
  event.waitUntil(
    clients
      .matchAll({
        type: 'window'
      })
      .then(clientList => {
        for (let i = 0; i < clientList.length; i++) {
          const client = clientList[i];
          if (client.url === '/' && 'focus' in client) return client.focus();
        }
        if (clients.openWindow) return clients.openWindow('/');
      })
  );
});

它不会打开窗口或专注于我的网站选项卡。为了调试代码,我打印了 clientList 变量,它是一个长度为零的数组。

我在浏览器中得到的错误是这个

On notification click: 
InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable firebase-messaging-sw.js:92

上面的错误是指这行代码:

event.waitUntil(

操作系统:Mac firefox:63.0.3 reactjs:16.2.0

4

2 回答 2

14

使用 . 在代码行之前移动notificationclick处理程序messaging = firebase.messaging();。FCM JS SDK 安装了自己的全局notificationclick处理程序,并且它的e.waitUntil()调用设法(以某种方式)破坏了 Firefox 事件对象。如果您首先安装全局处理程序,那么它会首先被调用,因此它会真正起作用。但是,它可能会以某种晦涩的方式破坏 FCM 处理程序。

IMO,这是 Firefox 本身关于 Service Worker 而不是 FCM 的错误,但 FCM 肯定会导致问题。

相关的:

https://github.com/firebase/quickstart-js/issues/282(相同的 FCM 错误)

https://bugzilla.mozilla.org/show_bug.cgi?id=1468935(相同的 FCM + Firefox 错误,错误修复)

https://bugzilla.mozilla.org/show_bug.cgi?id=1313096(Firefox开发团队没有办法在其 Service Worker 测试套件中测试回调,这使得 Firefox 的这部分漏洞已经成熟)

https://bugzilla.mozilla.org/show_bug.cgi?id=1489800(相同的浏览器错误,不同的产品)

于 2019-01-08T22:00:57.767 回答
1

如果目标是在单击通知时打开特定 URL,则可能有更简单的方法。您可以在 FCM 通知负载中发送“click_action”字段。

你的有效载荷看起来像这样:

  "notification" : {
    "body" : "Sample body",
    "title" : "Sample title",
    "click_action": "http://google.com"
  }

在这个例子中,当点击通知时,它会打开 google.com。

于 2018-12-20T22:19:27.747 回答