如何在firebase

时间:2017-02-10 18:11:30

标签: android firebase firebase-cloud-messaging

我有一个系统,一个用户可以登录多个设备。用例如下:

假设用户A从设备A订阅天气主题。此用户现在将从该主题获得定期推送消息。

现在假设同一个用户登录到设备B.此设备还需要订阅天气主题,因为没有保证用户只使用设备A.

相同的用例可以在取消订阅的情况下应用,也可以应用于两个以上的设备。

解决此类问题的最佳方法是什么。

我想到的当前方法是:

1)在firebase db中的每个用户id下创建一个名为subscriptions的节点。该节点将以

的形式订阅数据

Topidname:boolean issubscribed

此方法在后台服务中将侦听器附加到此位置。具有相同用户ID的每个设备将始终收听相同的位置,从而在大多数情况下解决问题。由于正常的服务生命周期原因,它无法保证完整性。

使用服务是因为如果只在应用程序的生命周期内保留监听器,如果用户取消订阅某个设备上的主题并且第二个设备应用程序已关闭,则第二个应用程序将继续接收通知,因为它&#39 ; s注册令牌仍然与该主题相关,并且只会在应用重启时取消订阅。

这里的服务已经成为START_STICKY,在onCreate中有一个监听器,并且有一个备份警报设置,用于在onDestroy方法中重启服务。因此,唯一不能工作的情况是应用程序停止或者由于长时间的非连接而使收听者处于退避模式。

当应用程序启动时,它还会与位置同步一次,并将剩下的主题添加到其中。服务将在注销时停止,并取消之前所有用户的主题。我在该位置保留了一个keepSynced以确保它保持同步

潜在问题是 - >服务被强制停止杀死。可能导致一些ram使用。同步可能不是即时的,具体取决于连接丢失的时间以及firebase与db重新同步需要多长时间。重新同步和子服务器重新启动每个服务重新启动的所有主题。

2)这是一种相对复杂的方法:

为应用服务器中的每个用户保存实例ID服务的firebase令牌。

在每次退出时,不要调用delete iid,而是保留相同的令牌,但会覆盖使用新登录的uid附加的用户。

在每个订阅上,使用Instance Id服务器api对一个用户使用所有注册令牌批量订阅该主题。

每次用户使用该设备的特定令牌的实例ID api逐个取消订阅所有主题时,取消订阅。令牌刷新的过程相同。

对每个主题的取消订阅都这样做。

这种情况需要对所有主题订阅和取消订阅进行一次同步调用。它还需要在应用服务器中不断更新令牌。

请建议任何其他更好的方案来解决此问题。

如果我的方案有任何缺陷或需要修改,请建议。我现在已经陷入困境,无法想到其他任何事情。

1 个答案:

答案 0 :(得分:1)

我假设您正在跟踪用户设备的每个令牌。因此,对于给定用户,服务器上的代码应该能够知道如何将消息发送到所有设备,无论订阅如何。

尝试以与您在这些主题中广播的数据相同的方式考虑用户主题订阅。当用户更改主题订阅时,可以使用FCM将该事件广播到他们的所有设备,告诉您的应用从数据库中读取订阅并根据需要再次设置订阅。您的应用只会唤醒收到通知,以便在用户请求时更改订阅。

然后,当需要向主题发布消息时,您可以确保所有以此方式签入的设备都会收到该主题的消息。

将其煮沸: 1.当用户的订阅在您的应用中发生变化时,请通知服务器该更改。 2.在您的服务器中,更新用户对您数据库的订阅。 3.然后,向所有用户的设备发送FCM数据消息以重新加载订阅。 4.在应用程序中收到该消息后,从数据库中读取订阅更新并相应地更新FCM订阅。只要需要这样做,你的应用就必须安排活着。