FirebaseMessaging.onMessage.listen仅触发通知消息 HTTP发数据消息无响应咨询
问题解答:Flutter iOS端FCM HTTP数据消息无法触发onMessage回调问题
核心疑问解答
FirebaseMessaging.onMessage 不是仅支持处理Firebase控制台发送的通知消息,无论是控制台发送的通知/数据消息,还是通过HTTP接口发送的通知/数据消息,只要格式符合FCM规范、端侧配置正确,都可以正常触发该回调。
问题出现的原因
你的Java代码构造的FCM载荷存在多余嵌套错误,不符合FCM接口的格式要求:
你当前的载荷结构为:
{ "to": "[目标token]", "data": { "data": { "action": "show_message", "title": "showMessageFunction", ... } } }
而FCM要求纯数据消息的自定义内容直接挂载在顶层的data字段下,不需要额外嵌套一层data,错误的嵌套结构会导致FCM解析异常,端侧无法识别为合法消息,因此不会触发回调。
修复方案
1. 修正Java载荷构造代码
删除多余的parentData嵌套层,直接将自定义数据挂载到顶层data字段,同时建议新增content_available字段适配iOS端的消息唤醒要求:
JSONObject values = new JSONObject(); values.put("action", "show_message"); values.put("title", "showMessageFunction"); values.put("message", "Testing showMessage function"); values.put("channel", "1"); JSONObject message = new JSONObject(); message.put("to", to); message.put("data", values); // 新增适配iOS的配置,保证应用在前台/后台都能接收到数据消息 message.put("content_available", true);
修正后的合法载荷结构如下:
{ "to": "[目标设备FCM token]", "content_available": true, "data": { "action": "show_message", "title": "showMessageFunction", "message": "Testing showMessage function", "channel": "1" } }
2. 端侧额外校验项(iOS专属)
如果修正载荷后仍然无法触发回调,请确认以下配置:
- 已将正确的APNs开发/生产证书上传到Firebase控制台的iOS项目配置页
- 端侧已获取用户的推送授权,
notificationSettings.authorizationStatus值为authorized - Xcode项目的Signing & Capabilities中已添加
Push Notifications和Background Modes(Background Modes勾选Remote notifications)
内容的提问来源于stack exchange,提问作者Sole Survivor
相关产品推荐
相关产品推荐

