javascript - 有没有办法拦截和禁用默认后台 FCM 通知并在 firebase 消息传递服务工作者中显示自定义通知
问题描述
我一直在尝试在用户收到 FCM 后台通知时显示自定义通知,但是每次用户收到新通知时我都会收到两个通知,一个是默认的 Firebase SDK,另一个是来自我的服务工作者代码的自定义通知。
有没有办法禁用默认通知或在它出现后立即隐藏它,以便用户只能获得自定义通知?
我已经尝试了所有以前的解决方案,但它们都没有工作,因为很多功能,如 SetBackgroundHandler 已被弃用。 如果浏览器在后台,FCM 推送通知会到达两次
请参阅下面的代码 -
self.addEventListener('push', function(event) {
// console.log('Received a push message', event);
var body,title,tag,icon;
messaging.onBackgroundMessage((payload)=>{
title = payload.notification.title;
body = payload.data.order_id;
icon = "/images/logo.png';
tag = 'simple-push-demo-notification-tag';
event.waitUntil(
self.registration.showNotification(title, {
body: body,
// icon: icon,
tag: tag,
})
);
});
});
解决方案
这个问题困扰了我2天。我阅读了有关 firebase 消息传递和 service worker 的所有信息,现在终于找到了解决方案,所以我很高兴能把它写下来。
如果你只是想要结论,你可以跳到最后。
通过使用 chrome 的控制台工具,运行
getEventListeners(self).push[0]
在 firebase-messaging-sw.js 上,这个方法可以让我知道 'push' 事件的事件处理程序列表,这应该是 firbase 消息传递使用的机制。我可以通过运行来运行该功能
getEventListeners(self).push[0].listener()
. 因为有en错误,所以我跳转到firebase-messaging.js->sw-controller.ts->onPush(event: PushEvent),发现如果来自firebase的消息包含通知属性,这个事件处理程序由firebase创建将显示通知。
因此,停止默认通知弹出的简单方法是,不要发送带有通知属性的消息。(如果你在firebase项目控制台上测试消息发送,消息会包含notification属性,所以你最好用另一种方式测试发送。)
然后您现在可以通过 onBackgroundMessage() 进行自定义处理。
推荐阅读
- python - 在显示面上管理多个 Tkinter Windows 的大小
- php - 如何在 Eloquent 中加入关系?
- javascript - HTML 按钮不适用于内联 javascript
- apache - macos mamp 上的虚拟主机 ERR_CONNECTION_REFUSED
- tensorflow - 当我更改输出层的激活函数时,模型不会学习
- javascript - 孩子到父母到另一个孩子之间的Vue通信
- android - 如何将函数中的字符串类型参数传递给 Flutter 中的 IconData
- powerbi - 导入excel文件时Power Bi日期错误
- javascript - 如何从嵌入在 MongoDB 对象数组中的数组中提取值?
- angular - Angular / Rxjs如何订阅具有不同参数的循环中的函数