当应用程序在后台时,Firebase onMessageReceived没有被调用。

8 浏览
0 Comments

当应用程序在后台时,Firebase onMessageReceived没有被调用。

我正在我们的安卓应用中使用Firebase作为我们的消息服务。我对Firebase进行了相当多的研究,我了解到如果应用在前台或后台运行,将会改变onMessageReceived方法接收到的数据类型。

我想要完成的是解析Remotemessage中传入的数据,并根据自定义标签对其执行不同的操作。例如,如果Data Map中包含一个名为“My_Custom_Tag”的字段,我想要完全覆盖弹出的标准firebase消息,然后编写一个自定义消息。

问题是,当应用在后台运行时,我放在onMessageReceived中的任何代码永远无法触发。当应用在前台运行时它能正常工作,但如果应用处于后台,就无法检测或接收任何内容。

以下是一些示例代码:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    Map<String, String> aMap = remoteMessage.getData();
    //Custom object here for easier parsing
    PushNotificationsPojo pojo = this.convertResponseToPojo(aMap);
    if(pojo == null){
        passToFirebase(remoteMessage);
        return;
    }
    if(pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_CHAT_MESSAGE)) {
        createCustomNotification1(pojo);
    } else if (pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_SOME_OTHER_MESSAGE)){
        createCustomNotification2(pojo);
    } else if (pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_STUFF_AND_WHATNOT)) {
        createCustomNotification3(pojo);
    } else {
        passToFirebase(remoteMessage);
    }
}

我的问题是,我应该如何编辑MyFirebaseMessagingService,以便可以检查传入的数据,确定标签信息,并决定是将其传递给Firebase以使用标准处理还是不将其传递给Firebase并编写自己的自定义显示通知,同时我的应用程序在后台运行?

谢谢大家!

PS,Firebase地牢主Frank van Puffelen有没有什么想法?

admin 更改状态以发布 2023年5月21日
0
0 Comments

同学们,请认真听,我经过了许多链接并最终在这里找到了解决方案。

  1. 当应用在后台时,应该调用onMessageReceived方法

这个有效负荷将起作用...

{
  "data":{
    "title": "hello",
    "body": "this is body"
  },
  "to": "c5iuJ7iDnoc:APA91bG6j2c5tiQ3rVR9tBdrCTfDQYxkPwLuNFWzRuGHrBpWiOajR-DKef9EZEEVKA-kUBfXVcqHT-mClYfad06R_rBjhRZFKVdBL7_joXE5hFEwR45Qk8wgQdia2b-LmjI1IheFGZS8"
}

这个有效负荷将不起作用...

{
  "notification":{
    "title": "hello",
    "body": "this is body"
  },
  "to": "c5iuJ7iDnoc:APA91bG6j2c5tiQ3rVR9tBdrCTfDQYxkPwLuNFWzRuGHrBpWiOajR-DKef9EZEEVKA-kUBfXVcqHT-mClYfad06R_rBjhRZFKVdBL7_joXE5hFEwR45Qk8wgQdia2b-LmjI1IheFGZS8"
}

因为当负载包含"notification"时,onMessageReceived将不会调用。

0
0 Comments

从FCM消息中删除通知负载,以便将数据负载交付给onMessageReceived方法。

仔细阅读此文档此文档

当您的应用程序处于后台时,只有在没有通知负载的情况下,才将数据负载传递给onMessageReceived方法。(注意每个单词

如果存在两个负载,则系统将自动处理通知部分(系统托盘),并在启动器Activity的意图附加项中为您的应用程序获取数据负载(在用户点击通知后)。

为了成功地为Android和iOS两个平台提供服务,您可能需要根据客户端操作系统发送不同的FCM消息。

0