android GCM获取规范id的原始id

Jos*_*Jos 9 android push-notification google-cloud-messaging

我正在尝试向一些Android设备发送推送更新.他们中的一些人同时拥有一个新的身份证,所以我谷歌告诉我有规范的ID.从我阅读的文档中:

如果设置了message_id,请检查registration_id:

  • 如果设置了registration_id,请将原始ID替换为服务器数据库中的新值(规范ID).请注意,原始ID不是结果的一部分,因此您需要从请求中传递的registration_ids列表中获取它(使用相同的索引).

我错过了一个部分,或者如果您向Google发送超过1个注册ID,这是否含糊不清?

我的请求(替换ID为可读性):

"{"data":{"favorite":1},"registration_ids":["1","2","3","4","5","6"]}"
Run Code Online (Sandbox Code Playgroud)

Google的回复是:

{
  "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"}
 ]
}
Run Code Online (Sandbox Code Playgroud)

从这里,我知道id 3是正确的,但是我应该用3替换哪些原始id?为每个注册的ID发送每条消息都是浪费.我在这里阅读了一篇关于Stackoverflow(GCM和id处理)的文章,为Java服务器解决了这个问题,但我的不是(RoR).

关于如何解决这个问题的任何想法?

sel*_*ine 15

如您链接的帖子中所述,它都基于响应列表中的位置.因此,当您获得规范ID时,您需要在"发送列表"的相同位置更新原始注册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"}
Run Code Online (Sandbox Code Playgroud)

这是你的"发送清单":

[0] "1",
[1] "2",
[2] "3",
[3] "4",
[4] "5",
[5] "6"
Run Code Online (Sandbox Code Playgroud)

根据结果​​,您需要将位置0,3,4,5中的注册ID更新为ID 3.这意味着您最终将得到如下注册列表:

[0] "3",
[1] "2",
[2] "3",
[3] "3",
[4] "3",
[5] "3"
Run Code Online (Sandbox Code Playgroud)

最后:

[0] "3",
[1] "2",
Run Code Online (Sandbox Code Playgroud)

另请参阅:https://developer.android.com/google/gcm/adv.html#canonicalhttps://developer.android.com/google/gcm/gcm.html#response

  • 如何在首次发送之前过滤正确的"registration_id"?否则,在第一种情况下,服务器仍然发送三个重复的消息,并且只有在接收服务器响应后才会清除重复的消息. (3认同)