You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:46:22