如何使用Firebase将多个通知折叠为一个通知?

时间:2018-03-03 14:16:39

标签: android node.js firebase firebase-cloud-messaging android-notifications

我在Firebase云功能中有功能,用于向我的应用中的特定用户发送通知,并具有notificationContent以下代码:

const notificationContent = {
    notification: {
        title: "My Notification Title",
        body: "My Notification Body",
        icon: "default",
        sound : "default"
    }
};

我尝试使用collapse_key: "unique_key"但它没有效果。我只在设备离线时才读取有效。我也使用过tag: "unique",但每次收到新通知时,它都会覆盖最旧的通知。

我有什么方法可以通过Firebase实现这一目标?如果我收到一个以上的通知,将其分组为一个?

enter image description here

提前致谢!

3 个答案:

答案 0 :(得分:2)

如果您想使用更多可自定义和高级通知功能。 您应该只发送带有data有效负载的FCM,并在android客户端创建通知 请注意,如果您使用notification有效负载或notification + data有效负载发送FCM,则会通过Android核心系统和BroadcastReceiver的{​​{1}}方法创建通知如果您的应用是在后台,则不会被调用 如果您发送带有onReceive有效负载的FCM,它将始终调用data,因此您可以在Android客户端手动生成自定义通知。 (大多数应用程序使用后一种方法。)

我希望this link会有所帮助。

答案 1 :(得分:1)

最简单,最灵活的解决方案是扩展FirebaseMessagingService并自行处理通知。但首先,您不必在云功能notification上使用notificationContent,而是必须将其更改为data,以便发送数据消息而不是通知消息。区别在于通知消息将具有隐式折叠键(应用程序的包名称),而数据消息不会有一个。但是数据消息需要在客户端上处理,否则就不会显示。

以下是您FirebaseMessagingService所需要的示例:

public class MyFCMService extends FirebaseMessagingService {

  @Override
  public void onMessageReceived(RemoteMessage remoteMessage) {
    if (remoteMessage.getNotification() != null) {
      //this notification was sent from the Firebase console, because in our cloud function, we are using the DATA tag, not the notification tag
      //so here we have to handle the notification that was sent from the console
      ...
    } else if (remoteMessage.getData().get(KEY) != null) {
      //this data message was sent from our cloud function
      //KEY is one of the keys that you are using on the cloud function
      //in your example, you are using the keys: title, body, icon, sound

      //display the notification to the user
      ...
      notificationManager.notify(TAG, ID, notificationBuilder.build());
      //you have to use the same TAG and the same ID on each notification if you want your 2nd notification to simply update the text of the first one, instead of showing as a new notification
    }
  }
}

PS。当您从云功能发送通知时(如果您使用data标签,它实际上是数据消息,而不是通知消息),那么无论应用是否是应用,都会调用此方法在后台或前台。 HOWEVER ,当您从firebase控制台发送通知时,只有在应用程序位于前台时才会调用此方法。如果应用程序位于后台,Firebase SDK将处理通知并将其显示给用户。在某些情况下,仅在用户未运行应用程序时显示通知才有意义,例如,如果您要宣传应用程序的某些新功能。在这种情况下,您可以使用通知控制台上的唯一标记(例如" display_in_foreground")并在客户端上检查该标记。如果您已将其设置为true,则您甚至可以向当前正在运行该应用的用户显示通知,或者如果它是假的,您可以选择不显示通知。仅当应用程序位于前台时才会进行此检查。如果它在后台,则根本不会被调用,SDK将处理以显示通知。

答案 2 :(得分:0)

我也有同样的困惑,意识到我误解了崩溃键和标签的用途。

collapseKey将限制客户端脱机时收到的通知数量,tag是将通知堆积在抽屉中的标记。

因此对于典型的云功能,它应如下所示:

  const notification = {
    notification: {
      'title': 'Interesting title',
      'body': 'Hello, world'
    },
    'data': {
      'whatever': whatever,
    },
    'android':{
      'collapseKey': collapseKey,
      'priority': 'high',
      'notification': {
        'tag': tag,
      }
    },
    'token': fcmToken
  };

  admin.messaging().send(notification)

请注意,“ tag”参数位于android通知内,而不是顶级通知内。