Flutter Firebase聊天APP:用户发消息时推送通知实现方案咨询
关于Flutter+Firebase聊天应用消息推送的实现方案
能否仅用Dart代码实现?
可以,不需要额外编写其他语言的后端代码。有两种可行方案:
- Firebase Cloud Functions(Dart版本):这是生产环境推荐的安全方案,目前Firebase支持用Dart编写云函数,完全满足全Dart开发需求。
- Flutter客户端直接调用FCM API:仅适合测试场景,因为需要暴露FCM服务器密钥,存在严重安全风险,绝对不能用于生产。
实现流程(推荐Cloud Functions方案)
前置条件
- 你的Firebase项目已启用Cloud Functions,并且完成Dart云函数的环境配置(按Firebase官方指引即可)。
- 聊天消息存储在Firestore中,每条消息需包含
senderId(发送者ID)、receiverId(接收者ID)、content(消息内容)等核心字段。 - 已在Firestore的
users集合中为每个用户保存FCM令牌(字段名比如fcmToken)。
步骤1:编写Dart云函数监听消息新增
当Firestore中新增聊天消息时触发函数,自动给接收者推送通知:
import 'package:firebase_functions/firebase_functions.dart'; import 'package:firebase_admin/firebase_admin.dart'; import 'package:firebase_admin/firestore.dart'; void main() { FirebaseFunctions.instance.firestore .document('chats/{chatId}/messages/{messageId}') .onCreate((snapshot, context) async { // 提取消息数据 final msgData = snapshot.data()! as Map<String, dynamic>; final receiverId = msgData['receiverId'] as String; final senderId = msgData['senderId'] as String; final content = msgData['content'] as String; // 获取接收者的FCM令牌 final userDoc = await FirebaseAdmin.instance.firestore() .collection('users') .doc(receiverId) .get(); final fcmToken = userDoc.data()?['fcmToken'] as String?; if (fcmToken == null) { print('接收者未绑定FCM令牌,无法推送'); return; } // 构建FCM通知 final notification = { 'title': '新消息', 'body': content, }; // 构建推送消息(可附加自定义数据用于跳转) final pushMessage = { 'token': fcmToken, 'notification': notification, 'data': { 'senderId': senderId, 'chatId': context.params['chatId'] as String, } }; // 发送通知 await FirebaseAdmin.instance.messaging().send(pushMessage); }); }
步骤2:在Flutter客户端保存FCM令牌
用户登录或应用启动时,获取并更新用户的FCM令牌到Firestore:
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; Future<void> updateUserFcmToken(String userId) async { final fcmToken = await FirebaseMessaging.instance.getToken(); if (fcmToken == null) return; await FirebaseFirestore.instance .collection('users') .doc(userId) .set({'fcmToken': fcmToken}, SetOptions(merge: true)); }
步骤3:部署云函数
用Firebase CLI部署编写好的Dart云函数:
firebase deploy --only functions
测试用客户端直连方案(不推荐生产)
如果只是快速测试,可以在Flutter端直接调用FCM HTTP API,但务必注意服务器密钥不能硬编码在客户端:
import 'package:http/http.dart' as http; import 'dart:convert'; Future<void> sendTestNotification(String receiverToken, String message) async { const serverKey = '你的FCM服务器密钥'; const fcmUrl = 'https://fcm.googleapis.com/fcm/send'; final response = await http.post( Uri.parse(fcmUrl), headers: { 'Content-Type': 'application/json', 'Authorization': 'key=$serverKey', }, body: jsonEncode({ 'to': receiverToken, 'notification': { 'title': '新消息', 'body': message, }, }), ); if (response.statusCode != 200) { print('推送失败:${response.body}'); } }
内容的提问来源于stack exchange,提问作者Selim Sayeh
相关产品推荐
相关产品推荐

