2017-09-18 81 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),因爲該應用程序已從 設備上卸載。