service worker notificationclick 事件不聚焦或在选项卡中打开我的网站
service worker notificationclick event doesn't focus or open my website in tab
我在我的网站上使用 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(
OS: Mac
firefox:63.0.3
reactjs:16.2.0
如果目标是在点击通知时打开特定 URL,可能有更简单的方法。您可以在 FCM 通知负载中发送 "click_action" 字段。
您的有效载荷看起来像这样:
"notification" : {
"body" : "Sample body",
"title" : "Sample title",
"click_action": "http://google.com"
}
并且当点击通知时,它会在这个例子中打开google.com。
将 notificationclick
处理程序移到 messaging = firebase.messaging();
代码行之前。 FCM JS SDK 安装了它自己的全局 notificationclick
处理程序,它的 e.waitUntil()
调用设法(以某种方式)破坏了 Firefox 事件对象。如果您先安装全局处理程序,那么它会先被调用,因此它会真正起作用。但是,它可能会以某种晦涩的方式破坏 FCM 处理程序。
在我看来,这是 Firefox 本身关于 Service Workers 而不是 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(相同的浏览器错误,不同的产品)
我在我的网站上使用 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(
OS: Mac firefox:63.0.3 reactjs:16.2.0
如果目标是在点击通知时打开特定 URL,可能有更简单的方法。您可以在 FCM 通知负载中发送 "click_action" 字段。
您的有效载荷看起来像这样:
"notification" : {
"body" : "Sample body",
"title" : "Sample title",
"click_action": "http://google.com"
}
并且当点击通知时,它会在这个例子中打开google.com。
将 notificationclick
处理程序移到 messaging = firebase.messaging();
代码行之前。 FCM JS SDK 安装了它自己的全局 notificationclick
处理程序,它的 e.waitUntil()
调用设法(以某种方式)破坏了 Firefox 事件对象。如果您先安装全局处理程序,那么它会先被调用,因此它会真正起作用。但是,它可能会以某种晦涩的方式破坏 FCM 处理程序。
在我看来,这是 Firefox 本身关于 Service Workers 而不是 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(相同的浏览器错误,不同的产品)