GCM和id处理

时间:2012-12-06 21:32:18

标签: android google-cloud-messaging

我正在创建一个使用Facebook和GCM的应用程序。用户可以在多个设备上使用该应用程序,朋友可以使用他的脸书ID向他发送GCM消息。

在我的服务器上,我有一张表将facebook id映射到gcm id。该表不要求facebook id是唯一的,因此可以将消息发送到多个设备。

在文档中,它演示了以下在发送消息时处理错误的方法:

if (result.getMessageId() != null) {
 String canonicalRegId = result.getCanonicalRegistrationId();
 if (canonicalRegId != null) {
   //CASE 1
   // same device has more than on registration ID: update database
 }
} else {
 String error = result.getErrorCodeName();
 if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
   // CASE 2
   // application has been removed from device - unregister database
 }
}

CASE 1中,它表示用规范注册ID替换注册ID。但是我怎么知道要替换哪个注册ID?假设接收器有2个设备,我有2个注册ID可供选择,但不知道应该选择哪个。

CASE 2中,会出现同样的问题。我如何知道要从数据库中删除哪个注册ID?

修改
为清楚起见,这是我目前正在使用的代码:

List<String> gcmIds = getGCMIds(c, fbId);
if (gcmIds != null && !gcmIds.isEmpty()) {
    Sender sender = new Sender(Params.GOOGLE_API_KEY);
    Message message = new Message.Builder().addData("message", apiMessage.buildJSONString()).build();
    MulticastResult result = sender.send(message, gcmIds, 5);

    List<Result> results = result.getResults();
        /* Do something with the results */

    success = result.getFailure() == 0;
} else {
    success = false;
}

2 个答案:

答案 0 :(得分:3)

案例1:来自docs

  

GCM提供了一个名为“规范注册ID”的工具,可以轻松地从这些情况中恢复。规范注册ID定义为应用程序请求的最后一次注册的ID。这是服务器在向设备发送消息时应使用的ID。

将消息发送到设备列表时,结果列表的顺序相同。因此,您实际上只需查找在结果中使用相同索引的regID,并在dataStore中替换该registrationID。请记住保留规范ID ,因为这是最近注册的ID。

案例2: 同样,删除同一索引处的regID。

要获得完整的示例实施,请查看官方demo code,了解与您正在实施的发送呼叫类似的发送呼叫。

答案 1 :(得分:2)

您可能需要查看GCM响应格式文档:https://developer.android.com/google/gcm/gcm.html#response

特别是这部分:

<强>结果

  

表示已处理消息状态的对象数组。   对象以与请求相同的顺序列出(即,用于   请求中的每个注册ID,其结果都列在同一个中   响应中的索引),他们可以有这些字段:

     

message_id:表示成功处理邮件的字符串。

     

registration_id:如果设置,则表示GCM处理了该邮件,但它具有该设备的另一个规范注册ID,因此发件人   应该在将来的请求中替换ID(否则它们可能是   被拒绝)。如果出现错误,则永远不会设置此字段   请求。

     

错误:描述处理该收件人邮件时发生的错误的字符串。可能的值与。相同   记录在上表中,加上“不可用”(意思是GCM服务器)   很忙,无法处理该消息   收件人,所以可以重试。)

这一部分:

  

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

因此,您需要更新的注册ID位于您为该消息创建的相同索引(在您为该消息创建的注册ID数组中)中。