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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:52:56