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
相关产品推荐
相关产品推荐

