我正在创建一个使用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;
}
答案 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数组中)中。