我正在尝试实施一个通知系统,您可以在其中订阅其他用户(不是Firebase主题),并在该用户发布内容时获得推送通知。
为此,我决定使用设备组和注册令牌,以便用户可以获取他/她登录的每台设备的推送通知。
目前,用户可以订阅其他用户,并且还能够使用通知密钥接收他登录的每个设备的推送通知。为此,每次用户登录时都会获取设备的注册令牌,并使用以下结构将其存储在数据库(App server)中。
用户
设备
但是,我无法弄清楚如何在App Server中管理令牌刷新。
考虑这种情况:
1)user_1首次登录设备。
2)使用 registration_token_1 (在FCM和App Server中)创建设备组。
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无法登录,因为App Server认为他已经拥有设备组,并尝试将refresh_token_1添加到FCM中不存在的notification_key,获取错误代码400“通知密钥不存在”。< / p>
我对此有几个问题:
如果令牌被刷新,有没有办法从FCM中检索旧令牌?通过这种方式,App Server可以将旧令牌替换为旧令牌,而无需将令牌与设备标识符配对,如果标识符没有通过卸载/工厂重置等,这似乎是不可靠的
您能否推荐一种更好的方法来将用户(通知密钥)映射到App Server中的注册令牌?
修改 我已经阅读了一些其他线程,并找到了一种可能的解决方案,其形式是将注册令牌与设备标识符配对,因此当刷新令牌时,我可以查找设备标识符并替换/删除令牌。现在,我不确定iOS和Android都有持久的标识符,除了app卸载,数据擦除和工厂重置之外都可以存在......
答案 0 :(得分:2)
因此,经过一番研究后,我终于决定放弃设备组。出于我的申请目的,它们不值得痛苦。我决定只使用注册令牌,将它们与用户ID配对并完全跳过设备组。
在令牌刷新后,单独使用Firebase API无法检索旧令牌,管理令牌和设备是开发人员的责任。事实上,Firebase可以在发送通知后返回无效注册令牌列表,这样就可以用来删除后端的无效令牌。
除了将它们与唯一的设备标识符配对之外,我无法找出跟踪旧令牌的任何其他方式,只有这样才能在后端真正知道刷新后更新哪个令牌。将设备标识符保存在数据库中对我来说似乎有些苛刻,我很确定iOS不再提供任何类型的持久性标识符,所以这是不行的。
登录时跟踪注册令牌非常简单,后端更易于管理。至于发送通知,它们被分成1000个组,然后发送给适当的用户。发送通知后,将从数据库中删除无效令牌。