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

React Native应用如何向其他设备推送通知?原Firebase API已失效

解决方案

方案1:使用Firebase Admin SDK + 自建后端(推荐)

FCM的v1 API要求的访问令牌需要服务账号权限,无法在客户端安全存储密钥,因此必须通过后端中转推送请求。

步骤:

  1. 获取Firebase服务账号密钥
    登录Firebase控制台,进入项目设置 → 服务账号 → 生成新的私钥,下载JSON格式的密钥文件。
  2. 搭建后端服务(以Node.js为例)
    • 初始化Node.js项目,安装依赖:
      npm install firebase-admin express
      
    • 初始化Admin SDK并编写推送接口:
      const admin = require('firebase-admin');
      const express = require('express');
      const app = express();
      app.use(express.json());
      
      // 初始化Admin SDK
      const serviceAccount = require('./path/to/serviceAccountKey.json');
      admin.initializeApp({
        credential: admin.credential.cert(serviceAccount)
      });
      
      // 推送接口
      app.post('/send-notification', async (req, res) => {
        const { targetTokens, title, body } = req.body;
        const message = {
          notification: { title, body },
          tokens: targetTokens
        };
      
        try {
          const response = await admin.messaging().sendMulticast(message);
          res.status(200).json({ success: true, response });
        } catch (error) {
          res.status(500).json({ success: false, error: error.message });
        }
      });
      
      app.listen(3000, () => console.log('Server running on port 3000'));
      
  3. React Native客户端调用
    用户发布动态时,先获取需要推送的目标设备令牌(比如关注该用户的其他用户令牌,需提前存在数据库),再调用后端接口:
    const sendNotification = async (targetTokens, title, body) => {
      try {
        await fetch('https://your-backend-url/send-notification', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ targetTokens, title, body })
        });
      } catch (error) {
        console.error('推送失败:', error);
      }
    };
    
    // 发布动态时触发
    const postDynamic = async () => {
      // 先完成动态存储逻辑
      // ...
      const targetTokens = await getFollowersDeviceTokens();
      await sendNotification(targetTokens, '新动态', '用户XXX发布了新内容');
    };
    

方案2:使用Firebase Cloud Functions(无自建后端)

如果不想搭建独立后端,可借助Firebase的Serverless云函数,在Firebase生态内完成推送逻辑。

步骤:

  1. 初始化Cloud Functions
    本地安装Firebase CLI并初始化:
    npm install -g firebase-tools
    firebase login
    firebase init functions
    
  2. 编写云函数
    两种触发方式可选:
    • Firestore触发器:动态写入数据库时自动推送
      const functions = require("firebase-functions");
      const admin = require("firebase-admin");
      admin.initializeApp();
      
      exports.sendNotificationOnPost = functions.firestore
        .document('dynamics/{dynamicId}')
        .onCreate(async (snap, context) => {
          const dynamicData = snap.data();
          const authorId = dynamicData.authorId;
          // 获取关注该作者的用户设备令牌
          const followersSnapshot = await admin.firestore().collection('users').where('following', 'array-contains', authorId).get();
          const targetTokens = [];
          followersSnapshot.forEach(doc => {
            const token = doc.data().deviceToken;
            if (token) targetTokens.push(token);
          });
      
          if (targetTokens.length === 0) return null;
      
          const message = {
            notification: {
              title: '新动态',
              body: `${dynamicData.authorName}发布了新内容`
            },
            tokens: targetTokens
          };
      
          return admin.messaging().sendMulticast(message);
        });
      
    • HTTP触发器:客户端主动调用触发推送
      exports.sendNotification = functions.https.onRequest(async (req, res) => {
        const { targetTokens, title, body } = req.body;
        if (!targetTokens || !title || !body) {
          return res.status(400).send('缺少必要参数');
        }
      
        const message = {
          notification: { title, body },
          tokens: targetTokens
        };
      
        try {
          const response = await admin.messaging().sendMulticast(message);
          res.status(200).json({ success: true, response });
        } catch (error) {
          res.status(500).json({ success: false, error: error.message });
        }
      });
      
  3. 部署云函数
    firebase deploy --only functions
    
  4. React Native客户端调用
    对于HTTP触发器,直接调用云函数的公开URL即可,逻辑和方案1客户端一致。

关键注意事项

  • 设备令牌存储:用户启动应用时,获取FCM设备令牌并保存到Firestore/Realtime Database的用户文档中,方便后续推送。
  • 安全性:禁止在React Native客户端存储Firebase服务账号密钥或服务器密钥,避免泄露导致滥用。
  • Legacy API说明:FCM旧版Legacy API(用服务器密钥)目前仍可使用,但官方已宣布2024年6月停止支持,不建议长期依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:01:12