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

Flutter聊天应用发送消息时如何向指定token发送Firebase推送通知

结论

你的需求完全可以实现,但不能直接在客户端(用户侧应用)调用FCM接口发送通知,必须经过后端中转,核心原因是FCM发送通知需要用到项目的服务端密钥,该密钥一旦泄露到客户端会被恶意用户反编译获取,进而批量给所有用户推送垃圾通知、耗尽项目配额,造成严重安全问题。

实现流程

你可以按照以下逻辑完成开发,最终可以封装出和你预期几乎一致的调用方式:

  • 客户端点击发送消息按钮时,把接收方设备token、通知标题、通知内容三个参数传给你的自有后端接口
  • 后端拿到参数后,用保存在服务端的FCM服务端密钥,调用FCM官方接口推送通知
  • 后端将发送结果返回给客户端

代码封装示例

客户端侧(安卓Kotlin为例)

你可以直接封装成你想要的调用形式:

// 封装好的通知发送方法
fun sendNotification(receiverToken: String, title: String, description: String) {
    val requestParam = mapOf(
        "to_token" to receiverToken,
        "title" to title,
        "description" to description
    )
    // 调用自有后端中转接口
    OkHttpClient().newCall(
        Request.Builder()
            .url("https://你的后端服务地址/send_fcm_notification")
            .post(RequestBody.create(MediaType.parse("application/json"), JSONObject(requestParam).toString()))
            .build()
    ).enqueue(object : Callback {
        override fun onFailure(call: Call, e: IOException) {
            // 自行处理发送失败逻辑
        }
        override fun onResponse(call: Call, response: Response) {
            // 自行处理发送成功逻辑
        }
    })
}

// 实际调用和你预期的格式完全匹配
sendNotification(
    receiverToken = "目标用户的设备token",
    title = "新聊天消息",
    description = "你有一条来自好友的新消息"
)

后端侧(Node.js为例)

你只需要简单开发一个中转接口即可:

const admin = require('firebase-admin');
const express = require('express');
const app = express();

// 初始化FCM服务端SDK,服务端密钥仅在服务端存储,不会泄露
admin.initializeApp({
  credential: admin.credential.applicationDefault()
});

app.use(express.json());
app.post('/send_fcm_notification', async (req, res) => {
  const { to_token, title, description } = req.body;
  const fcmMessage = {
    notification: {
      title: title,
      body: description
    },
    token: to_token
  };
  try {
    const sendResult = await admin.messaging().send(fcmMessage);
    res.json({ code: 0, message: "发送成功", data: sendResult });
  } catch (err) {
    res.json({ code: 1, message: "发送失败", error: err.message });
  }
});

app.listen(3000, () => console.log("服务启动成功"));

内容的提问来源于stack exchange,提问作者Andrei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:42:03