2012-12-19 33 views
9

我想發送推送更新到一些android設備。同時他們中的一些人也得到了新的身份證,所以我Google告訴我有正規的ID。從文檔我讀:android GCM獲取標準ID的原始編號

如果MESSAGE_ID設置,檢查registration_id:

  • 如果registration_id設置,在您的服務器數據庫中的新值(規範ID)取代原來的ID。請注意,原始ID不是結果的一部分,因此您需要從請求中傳遞的registration_ids列表中獲取它(使用相同的索引)。

我錯過了一個部分,或者如果您向Google發送超過1個註冊ID,這是否含糊不清?

我請求(爲便於閱讀,取代IDS):

"{"data":{"favorite":1},"registration_ids":["1","2","3","4","5","6"]}" 

從谷歌的迴應是:

{ 
    "multicast_id":7917175795873320166, 
    "success":6, 
    "failure":0, 
    "canonical_ids":4, 
    "results":[ 
    {"registration_id":"3","message_id":"m1"}, 
    {"message_id":"m1"}, 
    {"message_id":"m1"}, 
    {"registration_id":"3","message_id":"m1"}, 
    {"registration_id":"3","message_id":"m1"}, 
    {"registration_id":"3","message_id":"m1"} 
] 
} 

從此,我知道ID 3是正確的,但其原有的ID應該我換成3?爲每個註冊的ID發送每條消息將是一種浪費。我已經在Stackoverflow(GCM and id handling)上讀過一篇關於解決它的Java服務器的帖子,但我的不是(RoR)。

有關如何解決此問題的任何想法?

回答

15

正如您鏈接到的帖子中所述,它都基於響應列表中的位置。因此,當您獲得規範ID時,您需要在「發送列表」的相同位置更新原始註冊ID。

在這裏你的榜樣

那麼,結果其中4規範(0,3,4,5):

[0] {"registration_id":"3","message_id":"m1"}, 
[1] {"message_id":"m1"}, 
[2] {"message_id":"m1"}, 
[3] {"registration_id":"3","message_id":"m1"}, 
[4] {"registration_id":"3","message_id":"m1"}, 
[5] {"registration_id":"3","message_id":"m1"} 

這裏是你的 「發送列表」:

[0] "1", 
[1] "2", 
[2] "3", 
[3] "4", 
[4] "5", 
[5] "6" 

根據結果​​,您需要將位置0,3,4,5中的註冊ID更新爲ID 3.這意味着您將最終得到如下的註冊列表:

[0] "3", 
[1] "2", 
[2] "3", 
[3] "3", 
[4] "3", 
[5] "3" 

最後:

[0] "3", 
[1] "2", 

另見:https://developer.android.com/google/gcm/adv.html#canonicalhttps://developer.android.com/google/gcm/gcm.html#response

+0

啊,我沒有接,只是包含在「MESSAGE_ID」考慮到項目,所以我正在考慮在4項響應我6入場請求。你的第一份清單爲我做了。謝謝。 – Jos

+3

如何在首次發送前過濾正確的「registration_id」?否則,在第一種情況下,服務器仍然發送三條重複消息,並且只有在接收到服務器響應後纔會清除重複。 – iBog