在我的应用程序中,我在用户之间提供视频和语音通话。我也使用 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 消息提供的属性之一是
collapse_key
。当您发送带有 collapse_key
的消息时,该消息将替换具有相同 collapse_key
值的任何先前消息。
当用户取消呼叫时,您可以使用它发送“不,算了”消息。
或者,您可以让 FCM 消息只是所谓的“tickle”:一条几乎为空的消息,它只是告诉应用程序唤醒并检查数据库中的传入消息队列。
这样:如果呼叫仍在数据库中,应用程序就可以接听它。但如果数据库中没有调用,它就什么也不做。
您需要在服务中进行这种类型的数据库交互,以便它可以在应用程序后台运行时运行。
按照文档中的建议给出过期时间是可行的 查看这里
在 Android 和 Web/JavaScript 上,您可以指定消息的最长生命周期。该值的持续时间必须为 0 到 2,419,200 秒(28 天),并且它对应于 FCM 存储并尝试传递消息的最长时间段。不包含此字段的请求默认最长期限为四个星期。
awesome_notifications_fcm
可让您删除通知。但如果您不购买许可证令牌,它就会受到限制,并且源代码是在商业许可证下提供的。由于源代码已经公开,您可以研究它并了解他们如何在 Android 和 iOS 上分别实现这一目标。