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

如何基于Firestore文档变动通过Cloud Functions触发Firebase In-App Messaging?

可行,实现方法如下

Firebase In-App Messaging本身没有内置的Cloud Functions触发器,但可以通过Cloud Functions监听Firestore文档变化结合Firebase In-App Messaging的REST API来实现你的需求,具体步骤:

1. 配置Cloud Functions监听Firestore文档变化

创建Cloud Functions触发器,监听目标Firestore集合的文档更新/写入事件,当文档满足特定条件(比如状态字段变更)时触发后续逻辑。

2. 调用In-App Messaging REST API发送消息

在触发的函数中,通过Google服务账号获取访问令牌,调用FCM的REST API发送In-App消息(In-App Messaging属于FCM的功能分支)。

代码示例(Node.js)

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const axios = require('axios');
const { GoogleAuth } = require('google-auth-library');

admin.initializeApp();

// 监听Firestore文档更新事件
exports.sendInAppOnFirestoreChange = functions.firestore
  .document('tasks/{taskId}')
  .onUpdate(async (change, context) => {
    // 检查是否满足触发条件(比如任务状态变为"completed")
    const newTask = change.after.data();
    const oldTask = change.before.data();
    if (newTask.status !== 'completed' || oldTask.status === 'completed') {
      return null;
    }

    // 从文档中获取目标用户UID
    const targetUserId = newTask.assignedTo;
    if (!targetUserId) {
      functions.logger.warn('未找到目标用户UID');
      return null;
    }

    // 获取服务账号访问令牌
    const auth = new GoogleAuth({
      credentials: admin.app().options.credential.getCredential(),
      scopes: ['https://www.googleapis.com/auth/firebase.messaging'],
    });
    const accessToken = await auth.getAccessToken();

    // 构造In-App消息内容
    const inAppMessage = {
      message: {
        // 定向到目标用户(需确保客户端已关联该UID的FCM令牌)
        token: await getFcmTokenForUser(targetUserId), 
        inAppMessage: {
          title: { text: '任务更新' },
          body: { text: `你负责的「${newTask.title}」已完成` },
          action: {
            openApp: {} // 点击消息打开应用
          }
        }
      }
    };

    // 调用FCM REST API发送消息
    try {
      await axios.post(
        `https://fcm.googleapis.com/v1/projects/${process.env.GCLOUD_PROJECT}/messages:send`,
        inAppMessage,
        {
          headers: {
            'Authorization': `Bearer ${accessToken}`,
            'Content-Type': 'application/json'
          }
        }
      );
      functions.logger.info('In-App消息已成功触发');
    } catch (error) {
      functions.logger.error('触发In-App消息失败:', error.response?.data || error.message);
    }

    return null;
  });

// 辅助函数:根据用户UID获取对应的FCM令牌(需提前在Firestore存储用户令牌)
async function getFcmTokenForUser(userId) {
  const userDoc = await admin.firestore().collection('users').doc(userId).get();
  return userDoc.data()?.fcmToken;
}

关键注意事项

  • 客户端集成:必须在应用中集成Firebase In-App Messaging SDK,否则无法接收和展示消息。
  • 权限配置:确保Cloud Functions使用的服务账号拥有Firebase Messaging Admin角色,同时在Google Cloud Console启用Firebase Cloud Messaging API。
  • 消息展示时机:In-App消息仅在用户打开应用时展示,如果用户离线,消息会在下次启动应用时触发。
  • 令牌存储:需要提前将用户的FCM令牌存储在Firestore或Realtime Database中,以便在函数中获取并定向到目标用户。

内容的提问来源于stack exchange,提问作者Arunachalam Ganesan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 18:45:00