2017-09-18 56 views
1

我有下面的代码在Java中使用GCM API到Android设备上发送通知实施的Android设备上。如何获得的故障推送通知注册ID使用Java GCM API

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处发送通知。

问题是,结果不包含故障推Id或任何设备标识,这样我可以识别哪个设备没有收到通知。 注: - 我不想一个

响应发送通知一个 - 导致

MulticastResult(multicast_id = 7588781423174816193,总= 5,成功= 1,失败= 4,canonical_ids = 0,结果: [[错误码= NotRegistered],[ MESSAGEID = 0:1505731620878025%f02bfbe47eeff668],[ 的errorCode = NotRegistered],[错误码= NotRegistered],[ 的errorCode = NotRegistered]]

其并不合作ntain任何注册ID或东西,以便我可以在db中识别设备。

请建议, 先谢谢了。

回答

0

响应告诉你间接推IDS失败。

在您的例子:

[[ errorCode=NotRegistered ], 
[ messageId=0:1505731620878025%f02bfbe47eeff668 ], 
[ errorCode=NotRegistered ], 
[ errorCode=NotRegistered ], 
[ errorCode=NotRegistered ]] 

你可以看到1,第3,第4和第5推标识失败。由于您应该知道在您的请求中发送推送ID的顺序,因此您应该知道哪些推送ID失败。

下面是来自documentation一个相关的例子:

下面是JSON结果6页的收件人(IDS 4,8,15,16,23,和42 分别)与3-消息成功处理,1个规范 登记令牌返回,并且3个错误:

{ “multicast_id”:216, “成功”:3, “失败”:3 “canonical_ids”:1, “结果”:[
{ “MESSAGE_ID”: “1:0408”},
{“error”:“Unavailable”},
{ “错误”: “InvalidRegistration”},
{ “MESSAGE_ID”: “1:1516”},
{ “MESSAGE_ID”: “1:2342”, “registration_id”: “32”},
{ “错误”: “NotRegistered”}]}

在这个例子中:

  • 第一消息:成功,不是必需的。
  • 第二条消息:应该重新发送(注册令牌8)。
  • 第三则消息:有一个不可恢复的错误(也许值突然在数据库损坏)。
  • 第四条消息:成功,没有要求。
  • 第五条消息:成功,但注册令牌应在服务器数据库中更新(从23到32)。
  • 第六条消息:应从服务器数据库中删除注册令牌(42),因为该应用程序已从 设备上卸载。