如何在FirebaseMessagingService的onMessageReceived中获取数据推送ID?
如何在Firebase Messaging的onMessageReceived中获取实时数据库的pushId以删除数据?
这个问题我之前也碰到过,其实解决起来很简单——你只需要在Cloud Functions推送消息的时候,把那个关键的pushId也一起放进payload里就行了!
问题根源
你当前的Cloud Functions代码只把from_user和to_user放进了推送的data payload,但实际上在触发函数的event参数里,已经包含了你需要的pushId(就是实时数据库里那个自动生成的节点key,比如你示例里的-L7grmlClxCd4ebzaSdo),只是你没把它传送给客户端而已。
解决方案步骤
1. 修改Cloud Functions代码,添加pushId到推送数据
在你的pushData函数里,把event.params.pushId加入到推送的data对象中,修改后的代码如下:
exports.pushData = functions.database.ref('/Datas/{pushId}').onWrite(event => { console.log('Push data event triggered'); /* Grab the current value of what was written to the Realtime Database */ var valueObject = event.data.val(); /* Create a notification and data payload. They contain the notification information, and message to be sent respectively */ const data = { data: { from_user: valueObject.from_user, to_user: valueObject.to_user, push_id: event.params.pushId // 新增这一行,把pushId传送给客户端 } }; // 这里你应该还有后续的推送逻辑(比如调用admin.messaging().sendToDevice之类的),记得把这个data传进去 });
2. 客户端在onMessageReceived中获取pushId并删除数据
现在客户端通过remoteMessage.getData()就能拿到push_id字段了,之后就可以用这个值定位到实时数据库中的对应节点并删除:
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // 获取推送的数据 Map<String, String> data = remoteMessage.getData(); String pushId = data.get("push_id"); String fromUser = data.get("from_user"); String toUser = data.get("to_user"); // 删除对应的数据库节点 if (pushId != null) { FirebaseDatabase.getInstance().getReference("Datas") .child(pushId) .removeValue() .addOnSuccessListener(aVoid -> { // 删除成功后的逻辑 }) .addOnFailureListener(e -> { // 删除失败的处理 }); } }
补充说明
event.params.pushId是Cloud Functions监听路径/Datas/{pushId}时自动解析出来的路径参数,完全对应你实时数据库里那个自动生成的节点key,不需要额外的查询或处理。- 确保你在Cloud Functions中后续的推送调用(比如
sendToDevice)确实把这个包含push_id的data对象传了进去,否则客户端还是拿不到。
内容的提问来源于stack exchange,提问作者MareCieco
相关产品推荐
相关产品推荐

