java - 有没有办法删除 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。
那么,请问有没有办法取消已发送的通知,或者知道这些通知的传递状态,或者其他方法呢?这将允许我为用户添加未接来电列表。
谢谢!
解决方案
在这种情况下,我知道两种选择:
- 呼叫取消时发送另一条 FCM 消息
- 仅使用 FCM 发送痒痒
呼叫取消时发送另一条 FCM 消息
您可以为 FCM 消息提供的属性之一是collapse_key
. 当您发送带有 的消息时collapse_key
,该消息将替换任何具有相同collapse_key
值的先前消息。
当用户取消呼叫时,您可以使用它来发送“不,忘记它”消息。
仅使用 FCM 发送痒痒
或者,您可以让 FCM 消息只是一个所谓的 Tickle:一条几乎是空的消息,它只是告诉应用程序唤醒并检查其数据库中的传入消息队列。
这样:如果呼叫仍在数据库中,则应用程序可以接听它。但是如果数据库中没有调用,它就什么也做不了。
您将希望在服务中进行这种类型的数据库交互,以便它可以在应用程序后台运行时运行。
推荐阅读
- angular - 如何在 Angular 单元测试中重用 Mock 依赖项?
- ionic-framework - ITMS-90809:不推荐使用 API
- php - PHP Office 365 图形认证
- javascript - 是否可以在更改角度材料分页器时为 pageSizeOptions 编写函数?
- pointers - 为什么从 net.Interfaces 打印错误会使我的程序崩溃?
- react-native - 擦除数据后无法打开模拟器,它显示 AVD 的模拟器进程已被杀死
- c - 我怎样才能摆脱这个警告?在 gstreamer c 语言中
- winscp - WinSCP:命令“ls”的参数太多
- c# - Visual Studio 2008 - 找不到变量
- api - Rundeck : 如何查看 Rundeck 健康状况?