首页 > 解决方案 > 有没有办法删除 FCM 发送的推送通知数据消息?

问题描述

在我的应用程序中,我提供用户之间的视频和语音通话。我也在使用 Firebase 实时数据库和 FCM。

这是我的通知传递的数据:

data: { 
    channel_id: channel_id,
    user_id: user_id
}

在我的 FirebaseMessagingService 类中,我检索数据并打开视频/通话活动,如下所示:

if(remoteMessage.getData().size > 0) {
        Intent intent = new Intent(this, VideoCallActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.putExtra("channel_id", remoteMessage.getData().get("channel_id"));
        intent.putExtra("user_id", remoteMessage.getData().get("user_id"));
        getApplicationContext().startActivity(intent);

    }

即使应用程序在后台,一切都运行良好。但是,我面临这个问题:

如果用户在被呼叫时没有互联网连接,当他连接到互联网时,即使呼叫已(被呼叫者)中止并且通知从 Firebase 实时数据库中删除,他的手机也会自动启动 VideoCallActivity。

那么,请问有没有办法取消已发送的通知,或者知道这些通知的传递状态,或者其他方法呢?这将允许我为用户添加未接来电列表。

谢谢!

标签: javafirebasefirebase-cloud-messaging

解决方案


在这种情况下,我知道两种选择:

  1. 呼叫取消时发送另一条 FCM 消息
  2. 仅使用 FCM 发送痒痒

呼叫取消时发送另一条 FCM 消息

您可以为 FCM 消息提供的属性之一是collapse_key. 当您发送带有 的消息时collapse_key,该消息将替换任何具有相同collapse_key值的先前消息。

当用户取消呼叫时,您可以使用它来发送“不,忘记它”消息。

仅使用 FCM 发送痒痒

或者,您可以让 FCM 消息只是一个所谓的 Tickle:一条几乎是空的消息,它只是告诉应用程序唤醒并检查其数据库中的传入消息队列。

这样:如果呼叫仍在数据库中,则应用程序可以接听它。但是如果数据库中没有调用,它就什么也做不了。

您将希望在服务中进行这种类型的数据库交互,以便它可以在应用程序后台运行时运行。


推荐阅读