Android FCM 推送通道 ID 始终为空

Android FCM Push Channel Id is always null

我有一个永远不会被触发的自定义通知渠道。我阅读了服务器和客户端的所有文档,但我仍然遗漏了一些东西。

我想要什么

我想通过 FCM 发送高优先级推送通知,最终唤醒应用程序中的前台服务。因此我定义了一个自定义通知渠道。我想接收推送,发现推送到自定义频道,显示通知。

我的问题

我按预期收到了来自 firebase 的所有推送通知,但 channelId 始终为空。

设置

我们直接在服务器端和 android 应用程序的两端使用 FCM。 我们的用户使用 Android 8.1 及更高版本。不需要传统推送。

后端发送一个 JSON,如下所示:

{
    "notification": {
        "android_channel_id": "MY_High_Prio_Push_Channel"
    },
    "data": {
        "notificationBody": "BodyText",
        "notificationTitle": "Title"
    },
    "priority": "high"
}

App注册推送通道成功。我可以在设备设置中看到它。推送通道将在任何应用程序启动时重新注册,如下所示

private fun registerHighPrioPushToRestartTheForegroundService() {
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    val channel = NotificationChannel(getString(R.string.push_channel_id_high_prio), getString(R.string.push_channgel_sync_with_high_prio), NotificationManager.IMPORTANCE_HIGH)
    channel.setShowBadge(true)
    notificationManager.createNotificationChannel(channel)
}

在运行时

如果 android 设备收到来自 FCM 的推送,则调用 onNewMessageReceived()。然后我通过调用检查发送到的 channelId:

if (remoteMessage.notification?.channelId == getString(R.string.push_channel_id_high_prio)) {
    // I would love to do my channel specific stuff here
}

正如您在正文下方的屏幕截图中所见,包含完整的 JSON。所有其他值为空。

问题出在服务器端。推送的整个 JSON 放在通知的 body 标签中。现在这个问题已经修复,我们发送一个 JSON 如下所示,客户端中的解析按预期工作。我们删除了通知标签,以便在每次推送时调用 onMessageReceived()

{
    "to": "{devicePushToken}",
    "android": {
        "priority": "high"
    },
    "priority": 10,
    "data": {
        "title": "Some Title",
        "body": "Some Message",
        "android_channel_id": "yourUniquePushId"
    }
}