应用程序在后台时未调用 Firebase onMessageReceived

Posted

技术标签:

【中文标题】应用程序在后台时未调用 Firebase onMessageReceived【英文标题】:Firebase onMessageReceived not called when app is in the background 【发布时间】:2017-03-11 17:05:31 【问题描述】:

我在我们的 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 从不 的任何代码都会被触发。当应用程序在前台运行时它工作得很好,但如果应用程序在后台运行,它将不会检测/接收任何内容。

下面是一些示例代码:

@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 有什么想法吗?

【问题讨论】:

您发送的 FCM 消息包含哪些类型的有效负载?通知、数据或两者兼而有之? 两者,大部分都是。由于是跨平台的,ios需要我发送通知对象,但我们的数据大部分来自Data对象。 天哪!这里的背景是什么意思?这是否意味着应用程序未处于活动状态或应用程序已关闭? 这是指应用程序实际上已关闭并且内存不足。 【参考方案1】:

从 FCM 消息中删除通知负载,以便将数据负载传送到 onMessageReceived 方法。

仔细阅读this和this。

当您的应用在后台时,只有在没有通知负载时,才会将数据负载传送到 onMessageReceived 方法。 (标记单词

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

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

【讨论】:

@kws 但是,如何在 Firebase 上使用云消息传递时删除通知?必须输入通知文本? 背景是什么意思?应用关闭或应用不活动???【参考方案2】:

Guyz 仔细听,我翻了很多链接,终于在这里找到了解决方案。

    当应用在后台时,应该调用 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"

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

【讨论】:

欣赏代码示例,因为它们显示了其他答案所解释的内容,但这并不是说其他​​有效负载不起作用,只是它将由 Firebase 服务处理,而不是由自定义代码处理. 您好,当应用程序处于后台时,您能帮我解决一下吗?我收到两个由系统托盘处理的通知,而它正在工作的前台接收一个通知。如何解决这个问题? sssvrock,当您获取包含通知和数据的有效负载时会发生这种情况(IE,适用于 IOS 和 Android)。要解决该问题,请区分这两种类型。请在此处查看我的问题以获取更多信息:***.com/questions/45286202/… @PGMacDesign 什么 Firebase 服务?云中的那个还是手机上的 Google Play 服务???? 这是指设备上的客户端。有关详细信息,请参阅this link【参考方案3】:

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

我的解决方案是按照他的建议


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

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

【讨论】:

【参考方案4】:

非常肯定,您已经知道 Android 中的行为,即当同时使用 notificationdata 有效负载时,Android 系统会捕获 notification 中的内容,并且当data 有效负载被点击时,它会包含在意图中.

AFAIK,这是唯一的方法(正如@ArthurThompson here 所提到的),如果你真的想确保总是调用onMessageReceived(),你必须只使用data 有效载荷(正如@DiegoGiorgini here所提到的) 但是,我环顾四周,也许还有其他方法。

我自己还没有尝试过,但是您是否考虑过checking which notifications are in the Status Bar,那么如果您的通知存在(不完全确定您是否真的可以确定哪个是您的应用程序的通知 ),调用你平时在onMessageReceived()里面调用的方法。

您还可以执行的一种方法是检测您将向其发送消息的设备是否是您的应用服务器中的 Android 设备,然后仅发送 data 有效负载。

【讨论】:

以上是关于应用程序在后台时未调用 Firebase onMessageReceived的主要内容,如果未能解决你的问题,请参考以下文章

应用程序:openURL:选项:从 Firebase 动态链接安装应用程序后首次打开应用程序时未调用

从深层链接启动应用程序时未调用 AppDelegate ContinueUserActivity,应归咎于 Firebase SDK

使用 react-native-firebase 在 Android 中关闭应用程序时未收到 fcm 消息

在越狱设备上使用后台程序时未调用 UIApplicationDelegate

应用程序退出时未调用 FirebaseMessagingService onMessageReceived(不在后台)

Firebase 函数在本地提供时未返回预期的环境配置