当应用在后台时,不会调用Firebase onMessageReceived

时间:2016-10-28 18:37:27

标签: android firebase push-notification firebase-cloud-messaging

我在Android应用中使用Firebase作为我们的消息服务。我对Firebase进行了相当多的研究,我理解whether the app if running in the foreground or now will change the type of data received in the onMessageReceived method

我要完成的是解析来自Remotemessage的传入数据,并根据自定义标记执行与其不同的操作。 IE,如果数据映射包含一个名为“My_Custom_Tag”的字段,我想完全覆盖弹出的标准firebase消息并编写一个自定义消息。

问题是,当应用程序在后台运行时,我放入onMessageReceived never 的任何代码都会被触发。当应用程序在前台运行时,它可以正常工作,但如果应用程序在后台,则无法检测/接收任何内容。

以下是一些示例代码:

@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-Dungeon-Master Frank van Puffelen有想法的任何机会吗?

4 个答案:

答案 0 :(得分:29)

从FCM消息中删除通知有效内容,以便将数据有效负载传递给onMessageReceived方法。

仔细阅读thisthis

当您的应用在后台时,只有在没有通知有效负载的情况下,才会将数据有效负载传递给onMessageReceived方法 。 (标记

如果两个有效负载都存在,那么系统会自动处理通知部分(系统托盘),并且您的应用程序会在启动器活动的附加内容中获取数据有效负载(在用户点击通知后)。

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

答案 1 :(得分:4)

Guyz仔细听,我经历了很多链接,最后在这里找到了解决方案。

  1. 当app为后台时onMessageReceived方法应该调用
  2. 此有效负载将有效......

    {
      "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"
    }
    

    因为当加载包含“通知”时onMessageReceived将不会调用

答案 2 :(得分:2)

post中,回答 Koot可能是您的解决方案。他说 “我遇到了同样的问题。使用'数据信息'而不是'通知'更容易。数据信息总是加载类onMessageReceived。”

我的解决方案是根据他的建议

{
  "condition": "'reader' in topics",

  "data": {
    "title":"Please Check",
    "message": "This is a Firebase Cloud Messaging Topic Message 5!"
   }
}

答案 3 :(得分:1)

非常确定,您已经了解Android中使用notificationdata有效负载时的行为,Android系统会捕获notificationdata有效负载中的内容点击时包含在意图中。

AFAIK,这是唯一的方式(按照@ArthurThompson here所述),如果你真的想确保始终调用onMessageReceived(),你必须只使用{ {1}}有效负载(如@DiegoGiorgini here所述)  但是,我环顾四周,也许还有另一种方式。

我自己没试过,但是你考虑过checking which notifications are in the Status Bar,然后你的通知是否存在(不完全确定你是否真的可以确定哪一个是你的应用的通知),调用您通常在data内调用的方法。

您还可以做的一种方法是检测您要发送消息的设备是否是您应用服务器中的Android设备,然后仅发送onMessageReceived()有效负载。