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

如何通过Firebase以编程方式发送用户间通知?能否复刻控制台功能?

当然可以!Firebase完全支持通过代码实现和控制台一模一样的定向通知发送功能——不管是给单个指定UID的用户、一组用户、订阅了特定主题的用户,还是全量用户推送,都能轻松搞定。下面我就分场景给你具体的实现方案:

一、核心工具:Firebase Admin SDK

要实现后端编程推送,你需要用到Firebase Admin SDK(前端因为权限限制,没法直接完成这类定向推送操作)。首先得在你的后端项目里初始化它,以Node.js为例,初始化代码大概是这样:

const admin = require('firebase-admin');
// 这里需要引入你的Firebase服务账号密钥文件
const serviceAccount = require('./path-to-your-service-account-key.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});
二、不同场景的代码实现

1. 给单个指定UID的用户发通知

要给特定UID的用户推送,首先得把用户的FCM令牌和UID关联存储起来(比如用户登录或设备token更新时,把token存到Firestore/实时数据库里)。因为FCM是通过token定位设备的,而UID是Firebase Auth的用户标识,两者需要绑定。

具体代码示例:

async function sendToSingleUser(uid, notificationTitle, notificationBody) {
  // 第一步:从数据库获取该用户的FCM令牌
  const userDoc = await admin.firestore().collection('users').doc(uid).get();
  if (!userDoc.exists) {
    console.log('找不到这个用户哦');
    return;
  }
  const fcmToken = userDoc.data().fcmToken;
  if (!fcmToken) {
    console.log('这个用户还没绑定推送令牌');
    return;
  }

  // 第二步:构造通知内容
  const message = {
    notification: {
      title: notificationTitle,
      body: notificationBody
    },
    token: fcmToken
  };

  // 第三步:发送通知
  try {
    const response = await admin.messaging().send(message);
    console.log(`通知发送成功啦!响应ID:${response}`);
  } catch (error) {
    console.log('发送失败了:', error);
  }
}

// 调用示例:给UID为"user_12345"的用户发通知
sendToSingleUser('user_12345', '你有新消息', '点击查看详情~');

2. 给一组用户(UID列表)发通知

如果是点击用户列表批量推送,就可以遍历UID获取对应的token,然后用批量发送方法提升效率:

async function sendToUserGroup(uidList, notificationTitle, notificationBody) {
  // 批量收集有效的FCM令牌
  const validTokens = [];
  for (const uid of uidList) {
    const userDoc = await admin.firestore().collection('users').doc(uid).get();
    if (userDoc.exists && userDoc.data().fcmToken) {
      validTokens.push(userDoc.data().fcmToken);
    }
  }

  if (validTokens.length === 0) {
    console.log('没有可用的推送令牌');
    return;
  }

  // 构造批量消息
  const multicastMessage = {
    notification: {
      title: notificationTitle,
      body: notificationBody
    },
    tokens: validTokens
  };

  // 发送批量通知
  try {
    const response = await admin.messaging().sendMulticast(multicastMessage);
    console.log(`成功发送${response.successCount}条,失败${response.failureCount}条`);
    // 可以顺便处理失效的令牌,比如从数据库移除
    response.responses.forEach((resp, index) => {
      if (!resp.success) {
        console.log(`令牌${validTokens[index]}失效,原因:${resp.error}`);
        // 这里可以加代码删除数据库里的无效令牌
      }
    });
  } catch (error) {
    console.log('批量发送失败:', error);
  }
}

// 调用示例:给多个UID用户发系统通知
sendToUserGroup(['user_123', 'user_456', 'user_789'], '系统维护提醒', '本周日凌晨2点将进行系统升级');

3. 给订阅主题的用户发通知

如果用户已经订阅了某个主题(比如"sports"、"news"),直接给主题发送即可,不需要管单个用户的token:

async function sendToTopic(topicName, notificationTitle, notificationBody) {
  const message = {
    notification: {
      title: notificationTitle,
      body: notificationBody
    },
    topic: topicName
  };

  try {
    const response = await admin.messaging().send(message);
    console.log(`主题通知发送成功!响应ID:${response}`);
  } catch (error) {
    console.log('主题通知发送失败:', error);
  }
}

// 调用示例:给订阅"daily_news"主题的用户发资讯
sendToTopic('daily_news', '今日热点', '最新科技资讯已上线');

4. 给全量用户发通知

全量推送的话,最推荐的方式是创建一个全局主题(比如"all_users"),让所有用户自动订阅这个主题,然后直接给该主题发送通知;如果用户量不大,也可以批量获取所有用户的token进行推送,但主题方式更高效稳定。

三、几个关键注意点
  • 权限安全:Admin SDK的服务账号密钥一定要保密,绝对不能暴露在前端代码里,只能放在后端服务器环境中。
  • 令牌有效性:FCM令牌可能会因为用户卸载APP、更换设备等原因失效,发送失败时记得及时清理数据库里的无效令牌,避免重复浪费资源。
  • 自定义配置:除了基础的标题和内容,你还可以配置通知的自定义声音、图标、跳转链接、自定义数据字段等,满足不同业务需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:59:38