Firebase - 不知道设备组成员的注册 ID 如何删除设备组

7
在使用Firebase和设备组时,我测试了一种情况,即令牌(注册ID)更改后(例如在重新安装应用程序后),我的逻辑失败了,因为在重新安装应用程序后,我再也没有办法知道以前存储的令牌。
问题是现在我有一个设备组,其中包含两个“幽灵”注册ID,因为它们已更改,我不再知道它们是什么。
我知道当每个成员注销后,该组将被删除,但我不知道要手动注销它们的注册ID。
我该怎么办?
有没有一种方法可以检索设备组的成员或一次性删除它?
此外,管理令牌刷新的情况有什么好方法?
1个回答

7
我知道在每个成员注销后,设备组将被删除,但我不知道手动注销时要使用哪些注册 ID。我该怎么办?
当您向设备组发送消息时,您将收到一个包含“成功”和“失败”参数的响应。`failure`的值为0表示消息已经成功排队在 FCM 服务器中。
如果有失败的消息,那么失败的注册令牌列表将出现在响应中,建议重试发送消息。请参考文档

Sending downstream messages to device groups

Sending messages to a device group is very similar to sending messages to an individual device. Set the to parameter to the unique notification key for the device group. See Message types for details on payload support. Examples in this page show how to send data messages to device groups in HTTP and XMPP protocols.

HTTP POST Request

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to": "aUniqueKey",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!",
   }
}

HTTP Response

Here is an example of "success"— the notification_key has 2 registration tokens associated with it, and the message was successfully sent to both of them:

{
  "success": 2,
  "failure": 0
}

Here is an example of "partial success" — the notification_key has 3 registration tokens associated with it. The message was successfully sent to 1 of the registration tokens only. The response message lists the registration tokens that failed to receive the message:

{
  "success":1,
  "failure":2,
  "failed_registration_ids":[
     "regId1",
     "regId2"
  ]
}

When a message fails to be delivered to one or more of the registration tokens associated with a notification_key, the app server should retry with backoff between retries.

然而,在进行重试之前,你可以首先验证FCM令牌是否仍然有效(可以使用dry_run或Instance ID服务器API)。如果显示设备不再有效(通常为NotRegistered),则应将该令牌从设备组中删除并从您的应用程序服务器中删除它(或将其移到垃圾日志中等)。

另外,有什么好方法来管理令牌刷新的情况吗?

如果令牌通过onTokenRefresh()得到刷新,需要做的是找到用户拥有的旧令牌并用新令牌替换它,将更改应用于相关的地方(也即是映射设备组)。

还可以查看我的回答这里这里。一些细节可能会有帮助。


哇,利用失败的ID非常聪明!我没有想到那个。关于如何管理令牌的刷新,我看到了你的一个答案:链接,它还有效吗?你会推荐使用ANDROID_ID、MAC地址或其他特定的ID来唯一标识设备吗?这看起来很有帮助,但可能过于强大了链接 - MaX
是的,那仍然有效。 :) 对于ANDROID_ID部分,我实际上也建议在我的一个答案中使用ANDROID_ID。但是,如果您的应用程序具有登录功能,用户必须注册,我建议使用您在那里拥有的userID(取决于您使用的内容)。我认为这样更简单。 - AL.
1
意外行为:刷新令牌时,该用户是唯一成员。 - MaX
关于:“当消息无法传递到与通知键相关联的一个或多个注册令牌时,应用服务器应该在重试之间进行退避。” 这可能听起来是一个非常愚蠢的问题,但应该重试什么?整个操作(再次发送到设备组)还是分别向每个失败的注册(令牌)发送? - Juan
1
@Juan 在我看来,我认为重试应该针对失败的令牌。如果重试是针对实际设备组进行的,它可能会成为之前成功的重试的重复。 - AL.
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接