安卓GCM如何获取规范ID的原始ID

9
我正在尝试向一些安卓设备发送推送更新。其中一些设备在此期间已获得新的id,谷歌告诉我有规范化的id。从文档中了解到: 如果设置了message_id,请检查registration_id: - 如果设置了registration_id,请在您的服务器数据库中使用新值(规范ID)替换原始ID。请注意,原始ID不是结果的一部分,因此您需要从传递请求的registration_ids列表中获取它(使用相同的索引)。 当向Google发送超过一个registration id时,我是否遗漏了某个部分,或者这是否存在歧义? 我的请求(为了易读性替换了id):
"{"data":{"favorite":1},"registration_ids":["1","2","3","4","5","6"]}"

谷歌的响应是:

{
  "multicast_id":7917175795873320166,
  "success":6,
  "failure":0,
  "canonical_ids":4,
  "results":[
    {"registration_id":"3","message_id":"m1"},
    {"message_id":"m1"},
    {"message_id":"m1"},
    {"registration_id":"3","message_id":"m1"},
    {"registration_id":"3","message_id":"m1"},
    {"registration_id":"3","message_id":"m1"}
 ]
}

从这可以得出,id 3 是正确的,但我应该用哪些原始 id 替换它呢?把每个已注册的 id 的所有消息都发送一遍是浪费的。我在 Stackoverflow 上读到了一篇文章(GCM 和 id 处理),解决了 Java 服务器的问题,但我的服务器不是 RoR。
你有什么解决这个问题的想法吗?
1个回答

15

正如您链接的帖子所描述的那样,这全部基于响应列表中的位置。因此,当您获得规范标识符时,您需要在“发送列表”中相同位置的原始注册ID进行更新。

因此,在您的示例中,这里有4个结果是规范的(0、3、4、5):

[0] {"registration_id":"3","message_id":"m1"},
[1] {"message_id":"m1"},
[2] {"message_id":"m1"},
[3] {"registration_id":"3","message_id":"m1"},
[4] {"registration_id":"3","message_id":"m1"},
[5] {"registration_id":"3","message_id":"m1"}

这是您的“发送列表”:

[0] "1",
[1] "2",
[2] "3",
[3] "4",
[4] "5",
[5] "6"
根据结果,您需要将位置0、3、4、5的注册ID更新为3的ID。这意味着您最终将获得以下类似的注册列表:
[0] "3",
[1] "2",
[2] "3",
[3] "3",
[4] "3",
[5] "3"

最后:

[0] "3",
[1] "2",

还可参见:https://developer.android.com/google/gcm/adv.html#canonicalhttps://developer.android.com/google/gcm/gcm.html#response


啊,我没有考虑到只包含“message_id”的条目,所以我在我的6个条目请求中考虑了一个4个条目的响应。你的第一个列表为我解决了这个问题。谢谢。 - Jos
3
如何在首次发送之前筛选正确的 "registration_id"?否则,在第一种情况下,服务器仍会发送三条重复的消息,并且只有在收到服务器响应后才会清除重复项。 - iBog

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