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

如何在应用内通过Firebase Cloud Messaging向指定用户发送消息

核心问题说明

你调用的FirebaseMessaging.instance.sendMessage()是上行消息专用API,作用是将客户端数据发送到你自行对接的FCM服务端,不支持客户端直接向其他用户发送下游推送通知,这是Firebase的安全限制,避免服务端密钥泄露,所以无论你怎么调整参数都无法实现需求,调用报错本质是API使用场景错配。

正确实现逻辑

Firebase FCM要求所有下游推送通知必须通过服务端(Admin SDK/HTTP API)发送,结合你已经在使用Firestore存储消息的场景,最适配的方案是通过Firebase Cloud Functions触发自动推送:

  • 第一步:提前将每个用户的有效FCM Token存储在Firestore对应用户文档中,保证可以通过用户ID查询到其接收推送的Token
  • 第二步:编写云函数,配置Firestore触发器,监听收件箱集合的新文档创建事件,触发时自动调用FCM Admin SDK发送推送
  • 第三步:部署云函数到你的Firebase项目即可,后续所有新消息写入Firestore时都会自动触发推送

云函数示例代码

const functions = require("firebase-functions");
const admin = require("firebase-admin");
// 初始化Admin SDK,云函数环境下会自动读取项目配置,无需手动传入密钥
admin.initializeApp();

// 监听指定收件箱路径下的新消息创建事件
exports.sendNewMsgNotification = functions.firestore
  .document("inboxes/{receiveUserId}/messages/{msgId}")
  .onCreate(async (snapshot, context) => {
    // 获取新写入的消息内容
    const msgData = snapshot.data();
    // 获取接收消息的用户ID
    const receiveUid = context.params.receiveUserId;
    // 查询用户对应的FCM Token
    const userSnap = await admin.firestore().collection("users").doc(receiveUid).get();
    const userFcmToken = userSnap.data()?.fcmToken;
    // 没有有效Token直接终止
    if (!userFcmToken) return null;

    // 构造FCM推送消息
    const fcmMsg = {
      notification: {
        title: "新消息提醒",
        body: msgData.content || "你收到了一条新消息"
      },
      // 可选添加数据字段,客户端点击通知时可以拿到对应参数跳转
      data: {
        msgId: context.params.msgId,
        senderId: msgData.senderId
      },
      token: userFcmToken
    };

    // 发送推送
    await admin.messaging().send(fcmMsg);
    return null;
  });

注意事项

  • Firebase要求使用云函数调用第三方API(含FCM API)需要升级到Blaze付费计划,没有其他绕过方式
  • 需要补充异常处理逻辑,当推送返回Token无效/过期的错误时,删除对应用户文档中存储的无效Token
  • 如果不想使用云函数,也可以替换为自有后端服务:客户端发送消息时先请求自有后端接口,由后端调用FCM HTTP API完成推送,逻辑完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:36:00