Flutter应用基于Firestore如何实现向指定群组用户推送通知?
Flutter + Firestore 群组定向推送通知实现方案
前置准备
- 已完成Firebase核心服务在Flutter项目的接入,已集成
firebase_core、cloud_firestore、firebase_messaging依赖 - 所有用户登录时,已将自身的FCM令牌存储到用户专属文档的
fcmToken字段中 - 已开通Firebase Cloud Functions服务,本地已配置Firebase CLI部署环境
第一步:调整Firestore数据结构
现有GROUPS集合下的每个群组文档,新增members字段,类型为数组,存储该群组所有成员的用户UID。
群组的聊天消息统一存储在对应群组文档下的messages子集合中,新增消息时写入该子集合即可触发后续推送逻辑。
第二步:编写并部署Firebase云函数
通过云函数监听新消息写入事件,自动拉取群组成员令牌并推送通知,避免客户端直接推送带来的安全风险。
云函数代码示例如下:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.sendGroupNotification = functions.firestore .document("GROUPS/{groupId}/messages/{messageId}") .onCreate(async (snap, context) => { // 获取新消息内容与所属群组ID const newMessage = snap.data(); const groupId = context.params.groupId; // 拉取群组文档获取成员UID列表 const groupDoc = await admin.firestore().collection("GROUPS").doc(groupId).get(); const memberUids = groupDoc.data().members || []; if (memberUids.length === 0) return; // 批量查询所有成员的FCM令牌 const tokenQueryTasks = memberUids.map(uid => admin.firestore().collection("users").doc(uid).get() ); const userDocs = await Promise.all(tokenQueryTasks); // 过滤无效令牌 const validFcmTokens = userDocs .map(doc => doc.data()?.fcmToken) .filter(token => !!token); if (validFcmTokens.length === 0) return; // 构造通知与自定义参数 const pushPayload = { notification: { title: `收到新的群组消息`, body: `${newMessage.senderName}: ${newMessage.content.length > 50 ? newMessage.content.substring(0, 50) + '...' : newMessage.content}`, clickAction: "FLUTTER_NOTIFICATION_CLICK" }, data: { noticeType: "group_chat", groupId: groupId, senderUid: newMessage.senderUid } }; // 批量发送推送 await admin.messaging().sendEachForMulticast({ tokens: validFcmTokens, ...pushPayload }); });
代码编写完成后,执行
firebase deploy --only functions即可部署到Firebase云端生效。
第三步:Flutter客户端适配通知接收
- 前台接收通知:通过
FirebaseMessaging.onMessage.listen监听通知事件,可选择应用内弹出提示条 - 后台/终止状态点击通知唤醒应用:分别通过
FirebaseMessaging.onMessageOpenedApp.listen、FirebaseMessaging.instance.getInitialMessage()获取通知携带的参数,跳转到对应群组的聊天页面 - 用户退出登录时,需清空对应用户文档中的
fcmToken,避免推送无效通知
可选优化方案
- 非敏感群组可改用FCM主题订阅简化逻辑:每个群组对应唯一主题
group_${groupId},用户加入群组时订阅主题、退出时取消订阅,云函数直接向对应主题推送通知,无需拉取成员令牌。注意主题为公开可订阅,涉及隐私的私密群组不适用该方案 - 新增免打扰逻辑,用户开启免打扰的群组跳过推送
- 短时间内同群组多条消息可合并推送,避免频繁打扰用户
内容的提问来源于stack exchange,提问作者The Decoders
相关产品推荐
相关产品推荐

