如何为每个用户处理多个Firebase FCM令牌?

时间:2017-06-12 10:16:12

标签: firebase firebase-cloud-messaging

从官方文档中我了解到它的工作方式是这样的:

  1. 用户安装应用,生成FCM令牌
  2. 将令牌发送到应用服务器
  3. 服务器使用令牌向此设备发送推送通知。
  4. 如果此用户同时在另一台设备上安装应用程序,该怎么办?我应该在应用服务器上为每个用户存储多个令牌吗?如果是 - 这意味着应该检查哪些过期了?

5 个答案:

答案 0 :(得分:5)

我也遇到了确切的挑战,不得不求助于解决方案: 根据设备ID存储用户的每个令牌。 有趣的是,知道这个函数实际上存在于firebase消息传递方法中。但更令人惊讶的是,没有文档来处理这种情况。     https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId.html#getId()

总之,在将新令牌发送到服务器时,还会发送getId()方法返回的设备ID,并使用它来强制每个设备的令牌唯一性。

要在利用FCM的设备分组功能的同时应用此解决方案,您可以在FCM组上发出服务器请求,以便在将其替换为新设备之前删除该设备ID上的旧令牌。 / p>

答案 1 :(得分:3)

  

如果此用户同时在另一台设备上安装应用程序该怎么办?我应该在应用服务器上为每个用户存储多个令牌吗?

是。用户可以拥有多个设备,通常使用Device Groups的情况。

  

如果是 - 这意味着应该检查哪些过期了?

如果令牌过期,则会触发回调(Android onTokenRefresh()),您必须将新令牌发送到App Server并删除与用户/设备对应的旧令牌。 / p>

答案 2 :(得分:0)

Graykos,您可以这样做:

每次用户从Google登录get a new token以及注销delete that token时。  因此,如果用户从多个设备/浏览器登录,或者从一个设备/浏览器一个登录又一个登录,则可以很好地处理所有这些。

  

通过这种方式“从一个设备/浏览器一个接一个地登录多个用户”,所有这些用户都具有相同的令牌(因此每次登录都要删除并续订)

如问题的第一条评论中的Andres SK所述,您可以在发生故障时删除令牌(可能是用户无法注销的丢失设备)。

答案 3 :(得分:0)

我有类似的情况,尝试发送到过期的令牌时发现了以下错误响应代码:

{{1}}

我的应用服务器假设每个用户使用多个设备,则每个用户接受多个令牌。在发送新消息时,我将尝试将其发送到与用户相关的所有令牌。那些返回此错误的消息将被删除,因此以后的消息将仅发送至活动令牌。

答案 4 :(得分:0)

我遇到了同样的问题,我试图解决这个问题的方法是维护这样的数据结构。并将这些数据保存到我的通知服务器的数据库中。

type UserToken struct {
    UserId      string
    Tokens      []DeviceToken
}

type DeviceToken struct {
    DeviceName  string
    Token       string
}

每当您从 firebase 获得新的设备令牌时,只需将现有令牌替换为该设备的新令牌即可。

对于 Web 部件,我认为存储最后一个就足够了。