【问题标题】:Firebase Cloud Messaging: Handle token refresh in App ServerFirebase 云消息传递:在应用服务器中处理令牌刷新
【发布时间】: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


    【解决方案1】:

    所以,经过一番研究,我最终决定放弃设备组。就我的申请而言,它们不值得痛苦。我决定只使用注册令牌,将它们与用户 ID 配对并完全跳过设备组。

    一旦令牌刷新,无法单独使用 Firebase API 检索旧令牌,管理令牌和设备是开发人员的责任。事实上,Firebase 可以在发送通知后返回无效注册令牌列表,以便在后端删除无效令牌。

    除了将旧令牌与唯一的设备标识符配对之外,我想不出任何其他方法来跟踪旧令牌,只有这样后端才能真正知道刷新后要更新哪个令牌。将设备标识符保存在数据库中对我来说似乎有点 hacky,而且我很确定 iOS 不再提供任何类型的持久标识符,所以这是不行的。

    在登录时跟踪注册令牌非常容易实现,并且在后端更易于管理。至于发送通知,它们被分成 1000 个组,然后发送给相应的用户。发送通知后,将从数据库中删除无效令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      相关资源
      最近更新 更多