从官方文档中我了解到它的工作方式是这样的:
如果此用户同时在另一台设备上安装应用程序,该怎么办?我应该在应用服务器上为每个用户存储多个令牌吗?如果是 - 这意味着应该检查哪些过期了?
答案 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 部件,我认为存储最后一个就足够了。