我使用GCM API在java中实现了以下代码,以便在Android设备上发送通知。
Sender sender = new Sender(GCM_API_KEY);
Message.Builder builder = new Message.Builder();
builder.collapseKey(collpaseKey);
builder.timeToLive(TTL_HOURS * 3600);
if (data != null) {
for (PushData messageData : data) {
builder.addData(messageData.getKey(), messageData.getValue());
}
}
if (StreamType.CALL == type) {
for (PushData pushData : message) {
builder.addData(pushData.getKey(), pushData.getValue());
}
}
Message msg = builder.build();
try {
System.out.println(msg.toString());
MulticastResult result = sender.send(msg, pushId, MAX_RETRY);
log.infof("result %s", result.toString());
return true;
}
这里pushId是List的类型,它包含所有设备的推送ID,在此处发送通知。
问题是,结果不包含故障推送ID或任何设备标识,以便我可以识别哪个设备未收到通知。 注意: - 我不想逐个发送通知
回应 - 结果
MulticastResult(multicast_id = 7588781423174816193,总= 5,成功= 1,失败= 4,canonical_ids = 0,结果: [[errorCode = NotRegistered],[ messageId = 0:1505731620878025%f02bfbe47eeff668],[ errorCode = NotRegistered],[errorCode = NotRegistered],[ errorCode = NotRegistered]]
,它不包含任何注册ID或其他内容,以便我可以在db中识别设备。
请建议, 在此先感谢。
答案 0 :(得分:0)
响应告诉你推送ID失败。
在你的例子中:
[[ errorCode=NotRegistered ],
[ messageId=0:1505731620878025%f02bfbe47eeff668 ],
[ errorCode=NotRegistered ],
[ errorCode=NotRegistered ],
[ errorCode=NotRegistered ]]
您可以看到第1,第3,第4和第5个推送ID失败。由于您应该知道在请求中发送了推送ID的顺序,因此您应该知道哪些推送ID失败。
以下是documentation:
的相关示例以下是6位收件人的JSON结果(ID 4,8,15,16,23和42) 分别)成功处理3条消息,1条规范 返回了注册令牌,还有3个错误:
{“multicast_id”:216,“成功”:3,“失败”:3,“canonical_ids”:1,“结果”:[
{“message_id”:“1:0408”},
{“error”:“Unavailable”},
{“error”:“InvalidRegistration”},
{“message_id”:“1:1516”},
{“message_id”:“1:2342”,“registration_id”:“32”},
{“error”:“NotRegistered”}]}在这个例子中:
- 第一条消息:成功,不是必需的。
- 第二条消息:应重新发送(注册令牌8)。
- 第三条消息:有一个不可恢复的错误(可能是数据库中的值已损坏)。
- 第四条信息:成功,没有必要。
- 第五条消息:成功,但应在服务器数据库中更新注册令牌(从23到32)。
- 第六条消息:应从服务器数据库中删除注册令牌(42),因为该应用程序已从中卸载 设备