我正在尝试将Firebase FCM集成到我的应用程序中,但是我收到消息 多次。
我通过云功能发送消息,每次向数据库添加通知时都会触发该功能:
union
这很好用,我可以检索设备令牌,发送消息,然后在我的消息服务中通过我的应用接收它。
import { DataSnapshot } from "firebase-functions/lib/providers/database";
import { EventContext } from "firebase-functions";
import * as admin from 'firebase-admin'
import { ResolvePromise } from "./misc";
export function doSendNoticeFCM(snapshot: DataSnapshot, context?: EventContext) {
const uid = context.params.uid;
const noticeid = String(context.params.noticeid);
const notice = snapshot.val();
return admin.database().ref('device-tokens').child(uid).child('0')
.on('value', (data) => {
const token = data.val();
if (token === null) {
return ResolvePromise();
}
const title = String(notice['Title']);
const body = String(notice['Body']);
console.log("Title: " + title);
console.log("Body: " + body);
const payload: admin.messaging.Message = {
data: {
notice_id: noticeid,
title: title,
body: body
},
android: {
ttl: 0
},
token: token
};
return admin.messaging().send(payload)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
});
}
当我注销我的应用程序然后再次登录时,再次出现我收到的相同通知的问题。我在我的应用程序中使用带有Firebase的Google身份验证,并且注销后从数据库中删除了设备令牌,并在再次登录时添加了当前令牌。这可能是问题吗?
根据我在Firebase日志中看到的内容,对于每个消息,云功能仅执行一次,因此我猜测客户端出现了问题。我在另一篇stackoverflow帖子中读到,将ttl设置为0可以解决此问题,但不会影响我所看到的任何东西。
是否有人遇到这个问题或对我做错了什么有任何想法? 我正在使用Xamarin.Firebase。* nugets的最新“稳定”版本。
答案 0 :(得分:0)
发现了我的问题。我应该在firebase函数中使用“ once”而不是“ on”,它解释了为什么在添加/删除设备令牌时触发了侦听器时多次发送该消息的原因