kfi*_*lla 0 firebase google-cloud-messaging firebase-cloud-messaging
我正在尝试实现一个通知系统,您可以在其中订阅另一个用户(不是 Firebase 主题),并在该用户发布内容时获取推送通知。
为此,我决定使用设备组和注册令牌,以便用户可以将推送通知发送到他/她登录的每个设备。
目前,用户可以订阅另一个用户,还可以使用通知键接收他登录的每个设备的推送通知。为此,我每次用户登录时都会获取设备的注册令牌,并使用以下结构将其存储在数据库(应用程序服务器)中。
用户
设备
但是,我无法弄清楚如何管理应用程序服务器中的令牌刷新。
考虑这种情况:
1)user_1首次登录设备。
2) 使用registration_token_1创建设备组(在FCM 和应用程序服务器中)。
3)user_1卸载应用并重新安装(令牌刷新)。
4) user_1 重新登录。
5) App Server 将refresh_token_1添加到user_1,他现在有2 个令牌,旧的和新的。
6) user_1注销和user_2登录同一设备,refresh_token_1转移给user_2。
7) FCM 删除 user_1 的设备组,因为 user_1不再具有任何注册令牌。但 user_1 在应用服务器中仍然拥有 notification_key 和带有 Registration_token_1 的设备。
8) user_1 无法登录,因为应用程序服务器认为他已经拥有设备组并尝试将刷新令牌_1 添加到 FCM 中不存在的 notification_key,并收到错误代码 400“通知密钥不存在”。
我对此有几个问题:
如果刷新令牌,是否有办法从 FCM 检索旧令牌?这样,应用程序服务器可以用新令牌替换旧令牌,而无需将令牌与设备标识符配对,如果标识符在卸载/恢复出厂设置等情况下不存在,则这似乎不可靠
您能否推荐一种更好的方法来将用户(通知键)与应用程序服务器中的注册令牌进行映射?
编辑 我已经阅读了一些其他线程,并找到了一种可能的解决方案,其形式是将注册令牌与设备标识符配对,因此当刷新令牌时,我可以查找设备标识符并替换/删除令牌。现在,我不确定 iOS 和 Android 是否都具有持久标识符,这些标识符是否可以在应用程序卸载、数据擦除和恢复出厂设置之外存在……
因此,经过一番研究后,我最终决定放弃设备组。为了我的应用程序的目的,它们不值得痛苦。我决定仅使用注册令牌,将它们与用户 ID 配对并完全跳过设备组。
刷新令牌后,仅使用 Firebase API 无法检索旧令牌,管理令牌和设备是开发人员的责任。事实上,一旦发送通知,Firebase 就可以返回无效注册令牌的列表,以便可用于在后端删除无效令牌。
除了将旧令牌与唯一的设备标识符配对之外,我想不出任何其他方法来跟踪旧令牌,只有这样后端才能真正知道刷新后要更新哪个令牌。在数据库中保存设备标识符对我来说似乎有点老套,而且我很确定 iOS 不再提供任何类型的持久标识符,所以这是不行的。
登录时跟踪注册令牌非常容易实现,并且在后端更易于管理。至于发送通知,它们会被分成 1000 组,然后发送给相应的用户。发送通知后,无效令牌将从数据库中删除。
| 归档时间: |
|
| 查看次数: |
2255 次 |
| 最近记录: |