2

我正在创建一个使用 Facebook 和 GCM 的应用程序。用户可以在多个设备上使用该应用程序,朋友可以使用他的 facebook 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;
}
4

2 回答 2

3

对于案例 1:来自文档

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

向设备列表发送消息时,结果列表的顺序相同。因此,您实际上可以只查找在与结果相同的索引处使用的 regID,然后在您的数据存储中替换该 registrationID。请记住保留规范 ID,因为这是最近注册的 ID。

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

有关完整的示例实现,请查看与您正在实现的类似的发送调用的官方演示代码。

于 2012-12-06T21:48:21.703 回答
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 位于同一索引(在您为消息创建的注册 ID 数组中)。

于 2012-12-06T22:32:55.543 回答