Android端PubNub推送通知数据异常:RemoteMessage显示异常值求助
嘿,我来帮你拆解这个问题!
首先得澄清一个关键误区:remoteMessage.toString()本身就不会返回消息的实际内容,它只是Java默认的对象toString()实现,输出的是类名+内存哈希码(就是你看到的com.google.firebase.messaging.RemoteMessage@ffe9xxx)。你觉得Firebase控制台发送时“正常”,大概率是你当时用了remoteMessage.getNotification().getTitle()或者remoteMessage.getData().get("key")这类方法获取内容,而非直接调用toString()。
回到你用PubNub发送时遇到的问题,核心原因大概率是PubNub发送的FCM payload格式不符合要求,尤其是适配Android Oreo(API 26+)的规则,导致你无法从RemoteMessage中提取到预期数据。下面是具体的排查和解决步骤:
1. 先学会正确获取消息内容
别再依赖toString()了,在OnMessageReceived里用这些方法提取数据:
// 提取通知消息的内容(Firebase控制台默认发的是这种类型) if (remoteMessage.getNotification() != null) { String title = remoteMessage.getNotification().getTitle(); String body = remoteMessage.getNotification().getBody(); Log.d("FCM_LOG", "通知标题: " + title + ",内容: " + body); } // 提取数据消息的内容(PubNub可能发送的是纯数据消息) Map<String, String> dataPayload = remoteMessage.getData(); if (!dataPayload.isEmpty()) { String customContent = dataPayload.get("你的自定义键名"); Log.d("FCM_LOG", "自定义数据: " + customContent); }
2. 检查PubNub的FCM payload格式
FCM的消息分两种类型,PubNub发送时必须严格遵循格式:
- 通知消息:包含
notification字段,系统会自动在通知栏展示,适配Oreo+必须指定通知渠道ID:{ "notification": { "title": "测试通知", "body": "PubNub发送的通知内容" }, "data": { "custom_key": "自定义值" }, "to": "目标设备的FCM令牌", "android": { "notification": { "channel_id": "你的应用通知渠道ID" } } } - 纯数据消息:只有
data字段,所有内容需要你在OnMessageReceived里自行处理(包括构建通知展示)。
3. 确保适配Android Oreo的通知渠道规则
Oreo及以上版本要求必须先创建通知渠道,否则通知无法展示,也可能影响数据提取的逻辑:
在你的Application类或者启动页的onCreate方法中添加渠道创建代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel( "your_channel_id", // 和payload里的channel_id一致 "通知渠道名称", NotificationManager.IMPORTANCE_DEFAULT ); channel.setDescription("渠道描述"); NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); }
总结一下:你看到的toString()输出是正常现象,真正的问题是PubNub的payload格式没适配FCM规范,或者你没有用正确的方法提取消息数据。按照上面的步骤调整后,应该就能获取到预期的有效内容了。
内容的提问来源于stack exchange,提问作者atish.s

