有没有办法拦截和禁用默认的后台 FCM 通知并在 firebase 消息传递服务工作者中显示自定义通知

Posted

技术标签:

【中文标题】有没有办法拦截和禁用默认的后台 FCM 通知并在 firebase 消息传递服务工作者中显示自定义通知【英文标题】:Is there a way to intercept and disable the default background FCM notification and show custom notification in the firebase messaging service worker 【发布时间】:2021-04-06 06:37:34 【问题描述】:

我一直在尝试在用户收到 FCM 后台通知时显示自定义通知,但每次用户收到新通知时我都会收到两个通知,一个是默认 Firebase SDK,另一个是来自我的服务工作者的自定义通知代码。

有没有办法禁用默认通知或一出现就隐藏它,以便用户只能获得自定义通知?

我已经尝试了所有以前的解决方案,但它们都没有工作,因为许多功能,如 SetBackgroundHandler 已被弃用。 FCM Push notifications arrive twice if the browser is in background

在下面查看我的代码 -

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,
      )
    );
  );
  );

【问题讨论】:

你找到解决办法了吗? 你找到解决办法了吗? 【参考方案1】:

这个问题让我困惑了 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() 进行自定义处理了。

【讨论】:

以上是关于有没有办法拦截和禁用默认的后台 FCM 通知并在 firebase 消息传递服务工作者中显示自定义通知的主要内容,如果未能解决你的问题,请参考以下文章

禁用 FCM firebase 推送通知声音

FCM点击应用处于后台状态时如何打开用户指定的活动而不是默认活动

在后台模式下不调用 FCM 通知方法

FCM 后台通知在 iOS 中不起作用

FCM 点击如何在应用程序处于后台状态时打开用户指定的活动而不是默认活动

Slack:有没有办法禁用所有@channel 通知