我们正在使用Firebase云消息传递提供推送通知。
最近,我开始看到推送通知两次发送到同一台设备。
当我深入挖掘时,我发现在我们的后端有一个设备注册了2个firebase令牌。他们两个都在工作。因此,iOS提供的设备令牌不得更改。
根据GCM documentation,这可能是由于客户端中的错误而发生的:
Canonical ID
如果客户端应用中的错误触发了同一设备的多次注册,则可能很难协调状态,而客户端应用最终可能会出现重复消息。
实施规范ID可以帮助您更轻松地从这些情况中恢复。规范注册ID是客户端应用程序请求的最后一次注册的注册令牌。这是服务器在向设备发送消息时应使用的ID。
如果您尝试使用旧的注册令牌发送消息,GCM将照常处理请求,但它将在响应的registration_id字段中包含规范ID。确保使用此规范ID替换存储在服务器中的注册令牌,因为最终旧注册令牌将停止工作。
因此,如果我们向旧令牌发送推送通知,我们应该在其中获得包含registration_id
键值对的响应。
FCM documentation更详细地描述了这个案例:
如果设置了
message_id
,请检查registration_id
:如果设置了
registration_id
,请将原始ID替换为服务器数据库中的新值(规范ID)。请注意,原始ID不是结果的一部分,因此您需要从请求中传递的registration_ids
列表中获取它(使用相同的索引)。
但是,当使用两个工作令牌中的任何一个时,响应中没有registration_id
。因此,似乎FCM不知道该设备已注册多个令牌,因此不会在回复中加入registration_id
。
响应如下:
{
"multicast_id": 9087190295926530487,
"success": 1,
"failure": 0,
"canonical_ids": 0,
"results": [{
"message_id": "0:1498726709849471%10726fcd10726fcd"
}]
}
我的问题是:有什么方法可以为在FCM中注册并拥有多个令牌的所有设备获取规范ID吗?或者修复这样的问题的推荐方法是什么?