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

Flutter项目中实现应用内创建Firebase Cloud Messaging通知的方案咨询

Flutter项目中实现应用内创建Firebase Cloud Messaging通知的方案咨询

嗨,这个需求我之前碰到过不少开发者问,其实核心点在于:FCM不允许直接从Flutter客户端发送通知——毕竟发送通知需要用到Firebase的服务账号密钥,放在客户端太不安全了。所以我们得通过后端或者Firebase自带的云函数来中转,我给你一步步梳理下最顺手的实现方案:

一、推荐方案:用Firebase Cloud Functions(和现有Firebase生态无缝集成)

这个方案不用额外搭服务器,直接用Firebase的无服务器函数来处理通知发送逻辑,非常适合中小型项目。

1.1 编写发送通知的云函数

首先你需要本地安装Firebase CLI,然后初始化Cloud Functions:

  1. 打开终端,运行firebase init functions,跟着向导选择你的项目,选TypeScript或者JavaScript都可以(我这里用TypeScript举例子)。
  2. 进入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', '发送通知时出错,请稍后重试');
  }
});
  1. 部署云函数:运行firebase deploy --only functions,等部署完成后,云函数就可以被前端调用了。

1.2 Flutter前端调用云函数

接下来在Flutter项目里添加依赖,调用这个云函数:

  1. 在pubspec.yaml里添加相关包:
dependencies:
  flutter:
    sdk: flutter
  cloud_functions: ^4.5.0 # 版本号可用最新稳定版
  firebase_auth: ^4.10.0 # 用于用户身份验证(可选但推荐)
  1. 编写调用云函数的代码,比如用户在输入框填好通知标题和内容,点击发送按钮时执行:
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来处理通知发送:

  1. 后端安装依赖:npm install firebase-admin
  2. 初始化Admin SDK(用你从Firebase控制台下载的服务账号JSON文件):
const admin = require('firebase-admin');
const serviceAccount = require('./serviceAccountKey.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});
  1. 写一个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 });
  }
});
  1. 前端用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:55:27