React Native应用如何向其他设备推送通知?原Firebase API已失效
解决方案
方案1:使用Firebase Admin SDK + 自建后端(推荐)
FCM的v1 API要求的访问令牌需要服务账号权限,无法在客户端安全存储密钥,因此必须通过后端中转推送请求。
步骤:
- 获取Firebase服务账号密钥
登录Firebase控制台,进入项目设置 → 服务账号 → 生成新的私钥,下载JSON格式的密钥文件。 - 搭建后端服务(以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'));
- 初始化Node.js项目,安装依赖:
- 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生态内完成推送逻辑。
步骤:
- 初始化Cloud Functions
本地安装Firebase CLI并初始化:npm install -g firebase-tools firebase login firebase init functions - 编写云函数
两种触发方式可选:- 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 }); } });
- Firestore触发器:动态写入数据库时自动推送
- 部署云函数
firebase deploy --only functions - React Native客户端调用
对于HTTP触发器,直接调用云函数的公开URL即可,逻辑和方案1客户端一致。
关键注意事项
- 设备令牌存储:用户启动应用时,获取FCM设备令牌并保存到Firestore/Realtime Database的用户文档中,方便后续推送。
- 安全性:禁止在React Native客户端存储Firebase服务账号密钥或服务器密钥,避免泄露导致滥用。
- Legacy API说明:FCM旧版Legacy API(用服务器密钥)目前仍可使用,但官方已宣布2024年6月停止支持,不建议长期依赖。
内容的提问来源于stack exchange,提问作者Divyata Chauhan
相关产品推荐
相关产品推荐

