You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FCM消息分组与应用启动时批量关闭消息的实现方案咨询

FCM消息分组与应用启动时批量关闭消息的实现方案咨询

我已经成功实现了FCM推送消息的收发功能,用到的代码如下:

服务端代码

const admin = require('firebase-admin');
const message1 = {
   token: '<Token>',
   data: {
      title: "Test",
      body: "Test",
   },
   webpush: {
      fcmOptions: {
         link: '/',
      }
   }
};
const messages = [message1];

try {
   const result = await admin.messaging().sendEach(messages);
   console.log(result?.responses);
} catch (error) {
   console.log(error);
}

Service Worker 代码

importScripts('https://www.gstatic.com/firebasejs/10.13.2/firebase-app-compat.js');
importScripts('https://www.gstatic.com/firebasejs/10.13.2/firebase-messaging-compat.js');

const firebaseApp = firebase.initializeApp({
    <AUTHORISATION DATA>
});

const messaging = firebase.messaging();

messaging.onMessage((payload) => {
    console.log('Foreground Message recieved', payload);
});

messaging.onBackgroundMessage((payload) => {
    console.log('Background Message recieved', payload);

    const notificationTitle = payload.data.title;
    const notificationOptions = {
        body: payload.data.body,
        icon: '/images/icons-192.png',
        data: {
            url: "/"
        }
    }
    self.registration.showNotification(notificationTitle, notificationOptions);
});

self.addEventListener('notificationclick', function (event) {
    event.notification.close();

    event.waitUntil(
        clients.matchAll({
            type: "window"
        })
            .then(function (clientList) {
                for (var i = 0; i < clientList.length; i++) {
                    var client = clientList[i];
                    if (client.url == '/' && 'focus' in client)
                        return client.focus();
                }
                if (clients.openWindow) {
                    return clients.openWindow('/');
                }
            })
    );
});

现在我还有两个需求没搞明白怎么实现,想请教大家:

  • 对消息进行分组,避免用户被大量推送消息轰炸
  • 当应用打开时,自动关闭所有已显示的推送消息

关于消息分组的问题

我查了资料,知道这个功能应该和collapse_key标签有关,但官方文档没有给出具体的示例,而且我找到的一些实现方法似乎都是旧版FCM的,在当前版本里没法正常工作。

根据我的理解,collapse_key的作用是用同一个key来分组消息,这样用户不会收到多条独立的推送,而是会收到一条提示有X条新消息的汇总推送,这正是我想要的效果,但不知道在当前的代码里该怎么正确配置。


关于应用启动时关闭所有消息的问题

我猜测可能需要在应用打开时发送一条特定的推送消息,让Service Worker处理并关闭所有当前的推送,但我完全找不到相关的实现资料,不知道具体该怎么操作。

总结

这两个应该是比较常见的需求吧?有没有朋友能指点一下,或者告诉我该去哪里找对应的实现方案呢?

备注:内容来源于stack exchange,提问作者Alexander Mason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:38:10