Firefox 未在服务工作者中为推送消息打开 window

Firefox not opening window in service worker for Push message

Firebase 云消息传递

我已设置好所有内容,推送消息接收正常,当我单击它时,它会打开新的 window...但仅在 Chrome 中,在 Firefox 中它未打开。

我特别允许弹出窗口,但没有任何区别。

我刚调试了1个小时

self.addEventListener('notificationclick', function(e) {
    console.log("This is printed to console fine");
    clients.openWindow('https://example.com'); // this makes no error, nothing
});

有什么想法吗?

适用于 Firefox 47.0

不适用于 Firefox Quantum 60

订阅了一个错误。

我从 service worker 中删除:

const messaging = firebase.messaging();

它现在正在运行。

这简直是疯了。

找到原因了

仅当您(从服务器)这样发送消息有效负载时,Firebase.messaging 才是罪魁祸首:

{
  "notification": {
  //...
  }
}

notification 属性 的存在将阻止 notificationclick 由于某种原因在 firebase sdk 中传播。

您可以发送以下内容

{
  "data": {
      //...
  }
}

我也纠结过一段时间...

对于遇到问题的其他人,我想补充一点:

您仍然可以使用 firebase.messaging(),但您必须确保将其放在事件侦听器之后。

要明确这一点:

这不起作用(clients.openWindow 什么都不做):

const messaging = firebase.messaging();

// Add an event listener to handle notification clicks
self.addEventListener('notificationclick', function (event) {
    if (event.action === 'close') {
        event.notification.close();
    } else if (event.notification.data.target_url && '' !== event.notification.data.target_url.trim()) {
        clients.openWindow(event.notification.data.target_url);
    }
});

messaging.setBackgroundMessageHandler(function (payload) {
    // ... add custom notification handling ...
});

这确实有效(clients.openWindow 按预期打开 link):

// Add an event listener to handle notification clicks
self.addEventListener('notificationclick', function (event) {
    if (event.action === 'close') {
        event.notification.close();
    } else if (event.notification.data.target_url && '' !== event.notification.data.target_url.trim()) {
        clients.openWindow(event.notification.data.target_url);
    }
});

const messaging = firebase.messaging();

messaging.setBackgroundMessageHandler(function (payload) {
    // ... add custom notification handling ...
});

仍然不确定根本原因。我还怀疑 messaging() 弄乱了点击事件并使 Firefox 拒绝打开 window 因为它认为用户在通知时没有采取直接操作。

但至少我有一个解决方法并且可以继续前进。

希望对您有所帮助。