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"
}
}
我有一个永远不会被触发的自定义通知渠道。我阅读了服务器和客户端的所有文档,但我仍然遗漏了一些东西。
我想要什么
我想通过 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"
}
}