如何通过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
相关产品推荐
相关产品推荐

