Firebase Messaging Unity上行消息无Send方法,求助解决方案
问题解决:Unity FCM Send/SendAsync方法不存在的问题
FCM上游消息(Upstream Messaging)功能已被官方弃用,Unity Firebase SDK中不再提供FirebaseMessaging.Send()或SendAsync()方法,这是你遇到问题的根本原因。以下是两种可行的替代方案:
方案1:使用Firebase Functions + FCM下游消息实现设备到服务端通信
通过Firebase Functions作为安全中间层,完成设备到服务端的消息传递:
- 设备端调用Firebase Functions的Callable函数,传递消息数据
- Functions接收数据后,利用Firebase Admin SDK发送FCM下游消息到目标端点
Unity端代码示例
using Firebase.Functions; using System.Collections.Generic; // 初始化Firebase Functions实例 FirebaseFunctions functions = FirebaseFunctions.DefaultInstance; // 构造待发送的消息数据 Dictionary<string, object> messageData = new Dictionary<string, object> { {"my_message", "Hello World"}, {"my_action", "SAY HELLO"} }; // 调用Callable函数发送消息 HttpsCallableReference sendMessageFunc = functions.GetHttpsCallable("sendFcmMessage"); var sendTask = sendMessageFunc.CallAsync(messageData); sendTask.ContinueWithOnMainThread(task => { if (task.IsFaulted) { // 处理发送错误 } else { // 发送成功逻辑 } });
Firebase Functions(Node.js)示例
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.sendFcmMessage = functions.https.onCall(async (data, context) => { // 可选:验证调用者身份 if (!context.auth) { throw new functions.https.HttpsError("unauthenticated", "用户未完成认证"); } // 构造FCM消息体 const fcmMessage = { data: { my_message: data.my_message, my_action: data.my_action }, token: "目标设备的FCM令牌" // 也可使用topic或condition指定接收方 }; // 发送FCM消息 const sendResult = await admin.messaging().send(fcmMessage); return { result: `消息已发送,ID:${sendResult}` }; });
方案2:使用Firebase Realtime Database/Firestore实现消息传递
直接将设备消息写入数据库,服务端监听数据变化来接收消息:
- 设备端将消息数据写入Realtime Database或Firestore的指定路径
- 服务端监听该路径的新增数据,获取消息后进行业务处理
Unity端Firestore写入示例
using Firebase.Firestore; // 初始化Firestore实例 FirebaseFirestore db = FirebaseFirestore.DefaultInstance; // 构造消息文档数据 Dictionary<string, object> messageDoc = new Dictionary<string, object> { {"my_message", "Hello World"}, {"my_action", "SAY HELLO"}, {"timestamp", FieldValue.ServerTimestamp()} }; // 写入到指定集合 DocumentReference newDocRef = db.Collection("device_messages").Document(); var writeTask = newDocRef.SetAsync(messageDoc); writeTask.ContinueWithOnMainThread(task => { if (task.IsFaulted) { // 处理写入错误 } else { // 写入成功逻辑 } });
服务端(Node.js)Firestore监听示例
const admin = require("firebase-admin"); admin.initializeApp(); const db = admin.firestore(); // 监听device_messages集合的新增文档 db.collection("device_messages").onSnapshot(snapshot => { snapshot.docChanges().forEach(change => { if (change.type === "added") { const receivedData = change.doc.data(); // 处理接收到的设备消息 console.log("收到设备消息:", receivedData); // 可选:处理完成后删除文档 change.doc.ref.delete(); } }); });
关于直接HTTP POST到FCM的说明
如果坚持使用HTTP请求发送FCM消息,必须在服务端执行(禁止在Unity客户端直接发送,否则会泄露服务端密钥引发安全风险):
- 请求URL:
https://fcm.googleapis.com/fcm/send - 请求头需包含:
Authorization: key=你的FCM服务端密钥(从Firebase控制台项目设置>云消息服务获取) - 标准请求体示例:
{ "to": "目标设备令牌", "data": { "my_message": "Hello World", "my_action": "SAY HELLO" } }
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

