Flutter应用如何通过Cloud Functions实现Firestore字段更新触发云消息推送
实现方案
前置准备
- 已完成Firebase Cloud Functions环境初始化,安装
firebase-functions、firebase-admin依赖包 - 已在Firebase控制台开启Cloud Messaging服务
- 客户端已实现FCM令牌上报逻辑,所有用户的有效FCM令牌统一存储在Firestore的指定集合(例:
fcm_tokens集合,每个文档存储单个用户的令牌、有效期等字段)
步骤1:编写Firestore触发器函数
使用Firestore的onUpdate触发器监听目标集合的文档更新事件,判断price_change_pct字段是否满足触发条件,符合要求则批量推送消息给所有用户:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); // 替换为你实际需要监听的Firestore集合路径 const MONITORED_COLLECTION = "your_target_collection"; // 替换为存储用户FCM令牌的集合路径 const FCM_TOKEN_COLLECTION = "fcm_tokens"; exports.sendPriceDropAlert = functions.firestore .document(`${MONITORED_COLLECTION}/{docId}`) .onUpdate(async (change, context) => { // 提取更新前后的文档数据 const beforeValue = change.before.data(); const afterValue = change.after.data(); // 过滤非price_change_pct字段更新的场景,避免无效触发 if (beforeValue.price_change_pct === afterValue.price_change_pct) { return null; } // 不满足触发阈值直接终止执行 if (afterValue.price_change_pct >= -1) { return null; } // 拉取全量有效FCM令牌 const tokenDocs = await admin.firestore().collection(FCM_TOKEN_COLLECTION).get(); const validTokens = []; tokenDocs.forEach(doc => { const token = doc.data().token; if (token) validTokens.push(token); }); if (validTokens.length === 0) { functions.logger.info("无有效推送令牌,跳过推送"); return null; } // 构造推送消息内容,可根据业务需求自定义 const pushMessage = { notification: { title: "价格大幅下跌提醒", body: `你关注的商品价格跌幅已达${Math.abs(afterValue.price_change_pct).toFixed(2)}%,点击查看详情` }, tokens: validTokens }; // 批量发送推送 const sendResult = await admin.messaging().sendEachForMulticast(pushMessage); // 可选:自动清理无效令牌,减少后续无效请求 if (sendResult.failureCount > 0) { const invalidTokens = []; sendResult.responses.forEach((resp, index) => { if (!resp.success) invalidTokens.push(validTokens[index]); }); const batch = admin.firestore().batch(); for (const token of invalidTokens) { const invalidTokenDocs = await admin.firestore().collection(FCM_TOKEN_COLLECTION).where("token", "==", token).get(); invalidTokenDocs.forEach(doc => batch.delete(doc.ref)); } await batch.commit(); functions.logger.info(`已清理${invalidTokens.length}个无效FCM令牌`); } return null; });
步骤2:部署函数
在Firebase项目根目录执行部署命令即可上线:firebase deploy --only functions:sendPriceDropAlert
注意事项
- 若用户量级超过500,建议对令牌做分批推送,避免触发FCM配额限制
- 可额外添加防抖逻辑,避免短时间内价格反复波动触发重复推送
- 可在推送消息中添加
click_action参数,指定用户点击通知后跳转的应用页面
内容的提问来源于stack exchange,提问作者srikanth
相关产品推荐
相关产品推荐

