在 iOS 中,有一个名为
NotificationService
的扩展。这完全是在不同的“目标”中,并在不同的进程中运行到主应用程序的“next”。它无法访问主应用程序的代码。在该服务中,您可以在向用户显示通知之前修改通知。
这与 Android 的方法不同,我可以扩展 FirebaseMessagingService
、覆盖
onMessageReceived
方法并执行任何我想要的操作。我只使用 data
消息。我对此方法有一些疑问:
我是否需要显示通知,或者我可以什么都不做而一切继续正常进行?onMessageReceived
title
和
body
)
onMessageReceived
时的情况)
。
FirebaseMessagingService
本身很少会进入销毁状态。
Service
,所以它共享相同的进程。(但您可以在其他进程上运行它)
在典型情况下,只需使用LocalBroadCastReceiver
FirebaseMessagingService
FirebaseMessagingService 有奇怪的行为和限制。
(FirebaseMessagingService
应在
com.google.firebase.iid.FirebaseInstanceIdReceiver
运行的同一进程中运行。)onMessageReceived
@WorkerThread
,这意味着它打算并将在后台线程中调用。FirebaseMessagingService
行为取决于两个条件
A - FirebaseMessagingService 运行进程是前台 B - FCM 有效负载仅包含原始有效负载(没有title
和没有
body
)如果 (B == true) 或 (A == true && B == false) 则始终从 FCM sdk 的私有工作线程调用 onMessageReceived
,并且 FCM SDK 将不会执行任何处理通知的作业。
如果 (A == false && B == false) 则FirebaseMessagingService
按照 FCM 有效负载文档所述自行处理 FCM 有效负载,并且
不会调用
onMessageReceived
。
“
Ad1:您不需要在
onMessageReceived
上显示通知。在大多数情况下,您不应该这样做。
Ad2:相同进程,不同线程。Ad3:因为是同样的过程。
我认为混乱来自于这样一个事实:仅当您的应用程序位于前台时才会调用
onMessageReceived
,因此所有全局变量都已经存在。当您的应用程序处于后台时,根本不会调用
onMessageReceived
,系统会根据消息中的数据自行创建通知。总结一下:
如果您想要默认处理:向消息添加通知。系统将在适当的情况下显示它(即:不是前台),并且当/如果用户单击它时,您的应用程序可以通过
onCreate()
onNewIntent()
中的意图读取消息负载。从技术上讲,您根本不需要onMessageReceived()
。 (通常,您希望此代码在收件箱上显示红点或类似的东西)如果您希望对每个通知进行精确的客户端控制,请不要将它们附加到消息中。原始消息不由系统处理,但始终直接发送到您的onMessageRecieved