不丢失旧令牌的 FCM 迁移

FCM migration without losing the old token

我有一些极端情况,我们正在迁移到 firebase,但我们的数据库很奇怪,我们在顺利过渡时遇到了一些麻烦。我们的table以前是[user-id, device-id],后端做了一个select * where user-id = foo,然后循环结果,给每个device-id发送一个push。这些ids可以是GCM或者APNS token,后端根据格式检查发送到哪里。
为了迁移,我们添加了一列:firebase-id。对于我们的 iOS 应用程序,我们可以调用一个方法来获取旧的设备 ID。现在我们正在使用 firebase,我们检索这个旧令牌和新的 firebase 令牌,然后我们将它们都发送到后端,如果旧令牌已经存在,我们更新行并将新的 firebase 令牌添加到新列,如果旧令牌是新令牌,我们忽略它并使用 firebase 令牌创建一个新行。
对于发送,我们更改了代码以查看一行是否具有 firebase id,如果有,我们将推送发送到 firebase,否则我们使用旧方式发送。

这里的想法是继续支持旧令牌的用户,因为有些人可能会在一台设备上更新应用程序,但不会在另一台设备上更新。当一个用户拥有 firebase id 时,我们本可以清除他们的所有旧令牌,但是他们将停止在任何没有更新应用程序的设备上接收通知。我们不能简单地添加一行并保留旧的,因为那样用户会收到两个通知。

我们所做的 iOS 工作正常,我们已经准备就绪,一切都在按计划进行。当他们更新时,他们注册一个新的 firebase 令牌并将其添加到具有当前设备的旧设备令牌的行。
但是我现在想为 Android 实现相同的功能,但我似乎无法获得旧令牌。 FCM 指定无法 运行 在旧的 GCM SDK 旁边,我找不到通过 FCM SDK 检索旧令牌的函数,我们没有在任何地方缓存它(好吧,在数据库中,但是它没有耦合到设备,所以我们不知道要更新哪一行)。我在已经使用 FCM 的应用程序中需要旧令牌,因此我可以同时将两个令牌发送到后端,它可以使用旧令牌更新行。

如何在已经使用 firebase 的情况下检索旧的 GCM 令牌?

由于它没有内置到您之前的代码库中,我想不出将 GCM 令牌与 Firebase 相关联的简单方法。

但是,GCM 和 FCM 令牌都可以从 FCM 端点发送到设备。假设您对 GCM 和 Firebase 使用相同的项目,您可以利用它。当用户更新到使用 FCM 的应用程序的新版本时,当令牌刷新时,之前的 GCM 令牌将失效。您可以向 GCM 和 FCM 令牌发送消息。由于您会收到一个响应,告诉您令牌是否无效,因为当用户更新时 GCM 令牌会随着时间的推移而失效,因此您可以将它们从数据库中删除。

我意识到这不是一个优雅的解决方案,但它可以工作。