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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:46:33