【发布时间】:2017-12-16 09:32:21
【问题描述】:
我正在尝试实现一个通知系统,您可以在其中订阅另一个用户(不是 Firebase 主题),并在该用户发布内容时收到推送通知。
为此,我决定使用设备组和注册令牌,以便用户可以将推送通知发送到他/她登录的每台设备。
目前,用户可以订阅其他用户,也可以使用通知键向他登录的每台设备接收推送通知。为此,我每次用户登录时都会获取设备的注册令牌,并使用以下结构将其存储在数据库(应用服务器)中。
用户
- user_id (PK)
- notification_key_name
- notification_key
设备
- user_id (FK)
- registration_token
但是,我无法弄清楚如何在应用服务器中管理令牌刷新。
考虑这种情况:
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 在 App Server 中仍然有 notification_key 和一个带有 registration_token_1 的设备。
8) user_1 无法登录,因为 App Server 认为他已经有一个设备组,并尝试将 refresh_token_1 添加到 FCM 中不存在的 notification_key,得到错误代码 400“通知密钥不存在”。
我对此有几个问题:
如果刷新了令牌,有没有办法从 FCM 中检索旧令牌?这样,App Server 可以用新令牌替换旧令牌,而无需将令牌与设备标识符配对,如果标识符不通过卸载/恢复出厂设置等,这似乎不可靠
您能否推荐一种在应用服务器中使用注册令牌映射用户(通知键)的更好方法?
编辑 我已经阅读了其他一些线程,并以将注册令牌与设备标识符配对的形式找到了可能的解决方案,因此当刷新令牌时,我可以查找设备标识符并替换/删除令牌。现在,我不确定 iOS 和 Android 是否都具有持久标识符,这些标识符可以存在于应用程序卸载、数据擦除和恢复出厂设置之外......
【问题讨论】:
标签: firebase google-cloud-messaging firebase-cloud-messaging