2012-12-19 10 views
9

Sto cercando di inviare un aggiornamento push ad alcuni dispositivi Android. Alcuni di loro hanno un nuovo id nel frattempo, quindi Google mi dice che ci sono id canonici. Dalla documentazione che ho letto:GCM Android ottenere l'id originale di id canonico

Se message_id è impostato, verificare registration_id:

  • Se registration_id è impostato, sostituire l'ID originale con il nuovo valore (ID canonica) nel database del server. Si noti che l'ID originale non fa parte del risultato, quindi è necessario ottenerlo dall'elenco di registration_ids passati nella richiesta (utilizzando lo stesso indice).

Mi manca una parte o è ambiguo se si invia più di 1 ID di registrazione a Google?

la mia richiesta (IDS sostituiti per leggibilità):

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

La risposta di Google è:

{ 
    "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"} 
] 
} 

Da questo, so che id 3 è corretto, ma che ids originali DEVO sostituire con 3? L'invio di ogni messaggio per ogni ID registrato sarebbe uno spreco. Ho letto un post qui su Stackoverflow (GCM and id handling) risolvendolo per un server Java, ma il mio non lo è (RoR).

Qualche idea su come risolvere questo problema?

risposta

15

Come descritto nel post a cui è collegato, è tutto basato sulla posizione nell'elenco di risposte. Quindi, quando ottieni l'ID canonico, devi aggiornare l'ID di registrazione originale nella stessa posizione della tua "lista di invio".

Quindi nel tuo esempio, qui sono i risultati di cui 4 canonica (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"} 

E qui è il suo "elenco di invii":

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

In base ai risultati è necessario aggiornare l'ID di registrazione in posizione 0, 3, 4, 5 con l'ID di 3. Ciò significa che si finirà con un elenco di registrazione come il seguente:

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

E infine:

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

vedi anche: https://developer.android.com/google/gcm/adv.html#canonical e https://developer.android.com/google/gcm/gcm.html#response

+0

Ah, non ho preso le voci che proprio contenevano il "message_id" in considerazione, in modo da stavo considerando una risposta 4-entry sulla mia Richiesta di 6 ingressi Il tuo primo annuncio lo ha fatto per me. Grazie. – Jos

+3

Come filtrare correttamente "registration_id" prima di inviare prima? Altrimenti, nel primo caso il server invia ancora tre messaggi duplicati e solo dopo aver ricevuto la risposta del server cancella i duplicati. – iBog