我的目标是在用户发送消息时发送推送通知。我试图通过从Firestore数据库中检索所有推送令牌,并在实时数据库添加新消息时使用这些令牌发送多播消息来实现这一目标。
工作
第一个示例有效。没有令牌检索,令牌是硬编码的。我确实收到了通知。
exports.notifyUsers = functions.database.ref('/messages/{messageId}').onCreate((liveSnapshot, context) => {
const name = context.params.messageId;
const message = liveSnapshot.val().toString();
const tokens = [
"e6erA_qM...",
"ePU9p_CI...",
];
const payload = {
notification: {
title: `New message from ${name}`,
body: message,
badge: '1',
sound: 'default'
},
tokens: tokens,
}
const res = admin.messaging().sendMulticast(payload);
console.log(`response: ${res}`);
无法工作
这个功能无法工作,我没有收到任何通知。
exports.notifyUsers = functions.database.ref('/messages/{messageId}').onCreate(async (liveSnapshot, context) => {
const name = context.params.messageId;
const message = liveSnapshot.val().toString();
const snapshot = await admin.firestore().collection('users').get();
const tokens = snapshot.docs.map(doc => doc.data().token);
const payload = {
notification: {
title: `New message from ${name}`,
body: message,
badge: '1',
sound: 'default'
},
tokens: tokens,
}
const res = await admin.messaging().sendMulticast(payload);
console.log(`response: ${res}`);
我已经使用下面的代码验证了从数据库中检索到的令牌与硬编码的令牌相同。
exports.notifyUsers = functions.database.ref('/messages/{messageId}').onCreate(async (liveSnapshot, context) => {
const hardcodedTokens = [
"e6erA_qM...",
"ePU9p_CI...",
];
const snapshot = await admin.firestore().collection('users').get();
const tokens = snapshot.docs.map(doc => doc.data().token);
let same = true;
hardcodedTokens.forEach(el => {
if (!tokens.includes(el)) {
same = false;
}
});
console.log(same);
})
这将在Firebase云函数控制台中记录true
。
该函数使用Node 12。
getMessaging()
,似乎是一种过时的方法。我刚刚使用了以下负载:{ notification: { title: "title", body: "body" }, content_available: true, tokens: [...] }
并且它按预期工作。 - Josh Mathews