Flutter项目中实现应用内创建Firebase Cloud Messaging通知的方案咨询
Flutter项目中实现应用内创建Firebase Cloud Messaging通知的方案咨询
嗨,这个需求我之前碰到过不少开发者问,其实核心点在于:FCM不允许直接从Flutter客户端发送通知——毕竟发送通知需要用到Firebase的服务账号密钥,放在客户端太不安全了。所以我们得通过后端或者Firebase自带的云函数来中转,我给你一步步梳理下最顺手的实现方案:
一、推荐方案:用Firebase Cloud Functions(和现有Firebase生态无缝集成)
这个方案不用额外搭服务器,直接用Firebase的无服务器函数来处理通知发送逻辑,非常适合中小型项目。
1.1 编写发送通知的云函数
首先你需要本地安装Firebase CLI,然后初始化Cloud Functions:
- 打开终端,运行
firebase init functions,跟着向导选择你的项目,选TypeScript或者JavaScript都可以(我这里用TypeScript举例子)。 - 进入
functions目录,打开index.ts,替换成下面的代码:
import * as functions from "firebase-functions"; import * as admin from "firebase-admin"; // 初始化Firebase Admin SDK admin.initializeApp(); // 创建可被前端调用的云函数 export const sendNotification = functions.https.onCall(async (data, context) => { // 可选但强烈推荐:验证用户身份,防止未授权的人滥用接口 if (!context.auth) { throw new functions.https.HttpsError('unauthenticated', '请先登录再发送通知'); } // 从前端接收通知内容和目标用户的FCM令牌 const { title, body, targetToken } = data; // 构造FCM通知消息 const message = { notification: { title: title, body: body }, token: targetToken // 目标设备的FCM令牌 }; try { const response = await admin.messaging().send(message); functions.logger.log('通知发送成功:', response); return { success: true, msg: '通知已发送' }; } catch (error) { functions.logger.error('通知发送失败:', error); throw new functions.https.HttpsError('internal', '发送通知时出错,请稍后重试'); } });
- 部署云函数:运行
firebase deploy --only functions,等部署完成后,云函数就可以被前端调用了。
1.2 Flutter前端调用云函数
接下来在Flutter项目里添加依赖,调用这个云函数:
- 在
pubspec.yaml里添加相关包:
dependencies: flutter: sdk: flutter cloud_functions: ^4.5.0 # 版本号可用最新稳定版 firebase_auth: ^4.10.0 # 用于用户身份验证(可选但推荐)
- 编写调用云函数的代码,比如用户在输入框填好通知标题和内容,点击发送按钮时执行:
import 'package:cloud_functions/cloud_functions.dart'; import 'package:firebase_auth/firebase_auth.dart'; // 假设你已经从Firestore获取到了目标用户的FCM令牌 Future<void> sendUserNotification(String title, String body, String targetToken) async { try { // 获取云函数实例 final HttpsCallable callable = FirebaseFunctions.instance.httpsCallable('sendNotification'); // 调用云函数并传递参数 final result = await callable.call({ 'title': title, 'body': body, 'targetToken': targetToken, }); // 给用户显示成功提示,比如用SnackBar或FlutterToast print('通知发送成功: ${result.data}'); } catch (e) { // 显示错误提示 print('发送失败: $e'); } }
二、备选方案:自己搭建后端服务(比如Node.js)
如果你已经有自己的后端服务器,也可以在后端集成Firebase Admin SDK来处理通知发送:
- 后端安装依赖:
npm install firebase-admin - 初始化Admin SDK(用你从Firebase控制台下载的服务账号JSON文件):
const admin = require('firebase-admin'); const serviceAccount = require('./serviceAccountKey.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount) });
- 写一个POST接口,接收前端传来的通知参数,调用FCM发送:
app.post('/send-notification', async (req, res) => { const { title, body, targetToken } = req.body; const message = { notification: { title, body }, token: targetToken }; try { const response = await admin.messaging().send(message); res.status(200).json({ success: true, response }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } });
- 前端用
http或者dio包调用这个接口即可。
三、关键细节补充
- 存储FCM令牌:用户登录后,你需要获取当前设备的FCM令牌,保存到Firestore/Realtime Database里,这样发送通知时才能拿到目标用户的令牌。获取令牌的代码:
import 'package:firebase_messaging/firebase_messaging.dart'; Future<String?> getDeviceFCMToken() async { String? token = await FirebaseMessaging.instance.getToken(); // 将token保存到Firestore,关联当前用户的UID return token; }
- 权限控制:不管用云函数还是自己的后端,都要加权限验证,比如只有管理员用户才能发送通知,或者用户只能发给自己的好友,避免接口被滥用。
- 批量发送:如果要给多个用户发通知,可以用
sendMulticast方法,接收一个tokens数组,比循环发送效率更高。
备注:内容来源于stack exchange,提问作者Semih Kaya
相关产品推荐
相关产品推荐

