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

如何通过Firebase Cloud Function正确发送消息?官方方法使用遇阻

问题描述

我正在学习Firebase官方文档,但始终没法正确掌握相关内容。我想通过Cloud Function给手机发送通知,目前只能用文档里未提及的sendToDevice函数实现功能(可运行代码如下)。我了解到文档要求使用getMessaging().send(message)方法,但该方法无法正常运行。

可成功发送通知的旧版代码

const functions = require("firebase-functions");
const admin = require("firebase-admin");
// eslint-disable-next-line max-len
const tokens = ["REDACTED_TOKEN"];

admin.initializeApp();

exports.onCreate = functions.firestore
    .document("chat/{docId}")
    .onCreate((snapshot, context) => {
      console.log(snapshot.data());
      console.log("fake data");
    });

exports.onUpdate = functions.firestore
    .document("chat messages/{docId}")
    .onCreate( (snapshot, context) => {
      const payload = {
        // eslint-disable-next-line max-len
        notification: {title: "Push Title", body: "Push Body", sound: "default"},
        // eslint-disable-next-line max-len
        data: {click_action: "FLUTTER_NOTIFICATION_CLICK", message: "Sample Push Message"},
      };

      try {
        admin.messaging().sendToDevice(tokens, payload);
        console.log("NOTIFICATION SEND SUCCESFULLY");
      } catch (e) {
        console.log("ERROR SENDING NOTIFICATION");
        console.log(e);
      }
    });
解决方案

问题原因

getMessaging().send方法仅适用于发送单条消息到单个设备、主题或条件设备组,如果你需要给多个设备批量发送通知,应该使用sendMulticast方法(对应旧版的sendToDevice)。直接用send传入多个token会不符合API格式要求,导致运行失败。

替换为新版API的代码示例

将旧版的sendToDevice调用替换为sendMulticast,同时注意Cloud Function需要处理异步操作,添加async/await确保函数正确完成:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
const tokens = ["REDACTED_TOKEN"];

admin.initializeApp();

exports.onCreate = functions.firestore
    .document("chat/{docId}")
    .onCreate((snapshot, context) => {
      console.log(snapshot.data());
      console.log("fake data");
    });

exports.onUpdate = functions.firestore
    .document("chat messages/{docId}")
    .onCreate(async (snapshot, context) => {
      const message = {
        tokens: tokens,
        notification: {
          title: "Push Title",
          body: "Push Body",
          sound: "default"
        },
        data: {
          click_action: "FLUTTER_NOTIFICATION_CLICK",
          message: "Sample Push Message"
        }
      };

      try {
        const response = await admin.messaging().sendMulticast(message);
        console.log(`成功发送 ${response.successCount} 条通知`);
        console.log(`失败 ${response.failureCount} 条通知`);
        
        // 可选:处理发送失败的设备
        if (response.failureCount > 0) {
          const failedDevices = response.responses.map((resp, index) => {
            if (!resp.success) {
              return { token: tokens[index], error: resp.error };
            }
          }).filter(item => item !== undefined);
          console.log("发送失败的设备信息:", failedDevices);
        }
      } catch (e) {
        console.log("发送通知出错");
        console.log(e);
      }
    });

关键说明

  • 异步处理:Cloud Function的触发器函数包含异步操作时,必须返回Promise。使用async/await能确保函数等待通知发送完成后再结束,避免提前终止导致的异常。
  • API格式差异:旧版sendToDevice(tokens, payload)将token数组与通知内容分离,新版sendMulticast(message)要求把所有信息整合到同一个message对象中,tokens字段用于指定目标设备数组。
  • 结果反馈:sendMulticast会返回包含成功/失败计数的响应,可借此处理发送失败的设备,比如移除无效token,优化后续通知发送效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:45:37