从官方文档中,我了解到它的工作方式是这样的:
- 用户安装应用,生成 FCM 令牌
- 将令牌发送到应用服务器
- 服务器使用令牌向此设备发送推送通知。
如果此用户同时在其他设备上安装应用程序,我是否应该在应用程序服务器上为每个用户存储多个令牌?如果是 - 这意味着应该检查哪些已过期?
我也遇到了确切的挑战,必须解决解决方案:根据设备 ID 存储用户的每个令牌。有趣的是,这个函数实际上存在于 Firebase 消息传递方法中。但更令人惊讶的是,没有文档来处理这种情况。 https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId.html#getId((
总之,在将新令牌发送到服务器时,还要发送 getId(( 方法返回的设备 ID,并使用它来强制每个设备的令牌的唯一性。
要在利用 FCM 的设备分组功能的同时应用此解决方案,您可以在 FCM 组上发出服务器请求,以便在将该设备 ID 替换为新令牌之前删除该设备 ID 上的旧令牌。
如果此用户同时在其他设备上安装应用程序,我是否应该在应用程序服务器上为每个用户存储多个令牌?
是的。一个用户可能有多个设备,在这种情况下,通常使用设备组。
如果是 - 这意味着应该检查哪些已过期?
如果令牌过期,则会触发回调(对于 Android onTokenRefresh()
(,您必须从中将新令牌发送到您的应用程序服务器并删除与用户/设备对应的旧令牌。
Graykos,你可以像这样做:
每次用户有新的登录名时,从谷歌获取一个新令牌,注销时删除该令牌(编辑注意:关闭应用程序并再次运行它,不称为新登录,也不创建新令牌(。因此,如果用户从多个设备/浏览器登录,或者多个用户从一个设备/浏览器一个接一个地登录,您可以很好地处理所有这些。
这样"多个用户从一个设备/浏览器一个接一个地登录",它们都具有相同的令牌(因此每次登录都要删除并续订(
正如Andres SK在您问题的第一条评论中提到的,您可以在发生故障时删除令牌(可能是用户无法注销的丢失设备(。
我有类似的情况,在尝试发送到过期令牌时发现了以下错误响应代码:
{
"error": {
"code": 404,
"message": "Requested entity was not found.",
"status": "NOT_FOUND",
"details": [
{
"@type": "type.googleapis.com/google.firebase.fcm.v1.FcmError",
"errorCode": "UNREGISTERED"
}
]
}}
我的应用服务器接受每个用户的多个令牌,假设他们使用多个设备。发送新消息时,我将尝试将其发送到与用户相关的所有令牌。返回此错误的那些将被删除,因此将来的消息将仅发送到活动令牌。
我遇到了同样的问题,我试图解决这个问题的方式是维护这样的数据结构。并将此数据保存到我的通知程序服务器的数据库中。
type UserToken struct {
UserId string
Tokens []DeviceToken
}
type DeviceToken struct {
DeviceName string
Token string
}
每当您从 firebase 获得新的设备令牌时,只需将该设备的现有令牌替换为新令牌即可。
对于 Web 部分,我认为存储最后一个就足够了。