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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:45:00