GCM 规范 ID

当 1 个设备有多个注册表时,GCM 将返回规范 ID 错误:

{"multicast_id":xxxx,"success":2,"failure":0,"canonical_ids":1,"results":[{"message_id":"xxxxx"},{"registration_id":"newest reg ID here","message_id":"xxxxxx"}]}

因此,它显示了GCM应该使用的最新注册表id,但为什么它没有显示您应该删除的注册表id(旧注册表)?我如何知道旧的regid是什么,我应该从数据库中删除哪一个?


答案 1

Eran的答案是正确的,尽管我发现它仍然有点模糊。但是,多亏了他,我找到了解决方案。

说这是你的回答:

{
   "multicast_id":xxxxx,
   "success":7,
   "failure":0,
   "canonical_ids":2,
   "results":[
      {
         "message_id":"0:xxx%xxxxx"
      },
      {
         "message_id":"0:xxx%xxxxx"
      },
      {
         "registration_id":"MY_REG_ID_1",
         "message_id":"0:xxx%xxxxx"
      },
      {
         "message_id":"0:xxx%xxxxx"
      },
      {
         "message_id":"0:xxx%xxxxx"
      },
      {
         "registration_id":"MY_REG_ID_2",
         "message_id":"0:xxx%xxxxx"
      },
      {
         "message_id":"0:xxx%xxxxx"
      }
   ]
}

如您所见,7 条消息中有 2 条是重复的。

这是我向服务器发送消息的方式:

$tokenResult = mysql_query("SELECT reg_ids FROM table_with_regids"); //
$i = 0;
while($row = mysql_fetch_array($tokenResult)) {

     $registrationIDs[$i] = $row['reg_ids'];
     $i++;
}

来自Eran的回答:

由于您发送的每个请求都会从 Google 获得响应,因此您应该知道在触发此响应的请求中向 Google 发送了哪些注册 ID。您必须删除的旧注册 ID 是该请求中的第二个注册 ID。

这意味着数组$registrationIDs[] 的索引 25 应替换为 MY_REG_ID_1MY_REG_ID_2

最后检查双精度值并删除确切的重复项。结果应该是一个包含 5 个注册表 id 的数组(或直接从数组中删除该索引,而不是替换为 MY_REG_ID_#)。


答案 2

您包含的 GCM 响应表示您向两个注册 ID 发送了一条消息。这两条消息在 GCM 服务中都已成功接收。只有对于第二条消息,您才获得了规范的注册 ID。

由于您发送的每个请求都会从 Google 获得响应,因此您应该知道在触发此响应的请求中向 Google 发送了哪些注册 ID。您必须删除的旧注册 ID 是该请求中的第二个注册 ID。


推荐