根据文档:
如果您希望前台应用程序接收通知消息或数据消息,则需要编写代码来处理 onMessageReceived 回调。
是)我有的:
- 如文档中所述(也在清单和权限中),我有扩展
FirebaseMessagingService
和覆盖的服务。onMessageReceived
- 消息的有效负载在
data
地图中,并且notification
对象为空(如预期的那样)。 - 应用程序在后台时的通知按预期工作。
- 消息由 SendBird(第 3 方聊天解决方案)发送。在他们的终端和我们的其他客户端实现(ios、web 和后端)中一切都很好
问题是当应用程序处于前台时,onMessageReceived
不会调用回调。
我错过了什么吗?对于收到的消息,处理应用程序的两个应用程序状态的服务不应该是相同的吗?我不想在应用程序已打开时显示系统栏通知,但我确实想更改 UI 中的一些元素以指示用户他们在聊天中有新消息。
这是代码:
服务:
class ChatMessagingService : FirebaseMessagingService() {
override fun onMessageReceived(remoteMessage: RemoteMessage) {
super.onMessageReceived(remoteMessage)
Timber.e("----------- MESSAGE RECEIVED -------------")
displayNotification(remoteMessage)
sendBroadcastToActivity(remoteMessage) //
}
}
在清单中
<service
android:name=".notifications.ChatMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
firebase 和 gcm 版本
implementation 'com.google.android.gms:play-services-gcm:17.0.0'
implementation 'com.google.firebase:firebase-core:17.2.1'
implementation 'com.google.firebase:firebase-messaging:20.1.0'
谢谢大家
编辑,评论者需要这种方法,但它甚至没有达到它,所以我认为这不是问题。
private fun sendBroadcastToActivity(remoteMessage: RemoteMessage) {
val messageData = Gson().fromJson<SendBirdPNPayload>(remoteMessage.data["sendbird"], SendBirdPNPayload::class.java)
Intent(MESSAGE_RECEIVED_ACTION).also { intent ->
intent.putExtra("message_id", messageData.messageId)
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
}
}