android - 当应用程序未运行时,FCM 显示默认消息而不是自定义消息
问题描述
问题:我的 FCM 代码针对不同的情况显示不同的消息:
案例 1:当应用程序运行时,它会显示自定义通知正文
案例 2:当应用程序在后台运行时,它会显示自定义通知正文
案例 3:当应用程序未运行时,它显示从 FCM 收到的默认消息而不是自定义消息
代码:
/* The class extends FirebaseMessagingService() */
override fun onMessageReceived(remoteMessage: RemoteMessage) {
try {
/* Some other codes */
val pendingIntent = PendingIntent.getActivity(this, 0, Intent(), PendingIntent.FLAG_ONE_SHOT)
val builder = NotificationCompat.Builder(this, "" + R.string.notification_channel_id)
.setSmallIcon(R.mipmap.ic_launcher_round)
.setContentTitle(remoteMessage.notification!!.title)
.setContentText(getString(R.string.custom_message_body))
.setAutoCancel(true)
.setContentIntent(pendingIntent)
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel("" + R.string.notification_channel_id, "Alert channel", NotificationManager.IMPORTANCE_DEFAULT)
manager.createNotificationChannel(channel)
}
manager.notify(0, builder.build())
/* super.onMessageReceived(remoteMessage) was REMOVED to prevent default functions */
} catch (e: Exception) {
e.printStackTrace()
}
}
解决方案
这是意料之中的。FCM 对应用程序状态(前台和后台/已终止)有不同的行为。根据您的用例,您应该通过从服务器发送的有效负载来处理此问题。
从服务器发送的消息必须以“通知”或“数据”格式从仪表板或服务器端 API 发送。注意:从 firebase dashobard 您只能发送“通知”正文而不是数据。在这种情况下,FCM 将直接显示通知而不给您的应用回调。
服务器端 以下是示例格式:
通知类型格式 注意:Android 系统默认会在通知托盘中显示通知,您不需要显示。
{
"to": "your_token_id",
"notification" : {
"title" : "FCM Notification title!",
"body" : "FCM Notification subtext!",
"content_available" : true,
"priority" : "high"
}
}
数据格式(用于在应用中,前台和后台接收回调) 注意:您必须自己处理回调和显示通知。
{
"to": "your_token_id",
"data" : {
"title" : "FCM Notification Title ",
"subtext" : "FCM Notification Sub Title",
"type" : "999",
"priority" : "high"
}
}
Android 客户端 要处理在您的 Android 接收器中接收到的有效负载,请在此处查看官方指南
/* The class extends FirebaseMessagingService() */
override fun onMessageReceived(remoteMessage: RemoteMessage) {
Log.d(TAG, "From: ${remoteMessage.from}")
// Check if message contains a data payload.
remoteMessage.data.isNotEmpty().let {
Log.d(TAG, "Message data payload: " + remoteMessage.data)
if (/* Check if data needs to be processed by long running job */ true) {
// For long-running tasks (10 seconds or more) use WorkManager.
scheduleJob()
} else {
// Handle message within 10 seconds
handleNow()
}
}
// Check if message contains a notification payload.
remoteMessage.notification?.let {
Log.d(TAG, "Message Notification Body: ${it.body}")
}
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
}
在此处查看文档
推荐阅读
- swift - 我希望系统报告不符合协议,但事实并非如此!为什么?
- h2 - 如何查看配置值
- javascript - 隐藏inapp浏览器上的地址栏反应原生而不使用webview
- ios - ios:如何检查应用程序与扩展程序上下文
- c# - 如何在没有按钮的情况下打开内容对话框单击从 c# 代码到 UWp 应用程序的 xaml 代码
- python - 如何将 EXE 的图标替换为“默认”图标?
- javascript - 如何在导航栏中将导航项对齐到右侧?
- wordpress - WP 休息 API。创建端点的问题
- node.js - 我应该对向 XSS 漏洞开放 JWT 有多担心?
- ms-wopi - 如何让office online拥有自己的view模式风格?