2014-11-22 3 views
5

Sto cercando di ottenere un ID univoco per il mio dispositivo in modo da poter ricevere notifiche push dal mio server.Come ottenere l'ID canonico da GCM

Come tutti turorials dicono: mi registro usando GMC:

GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); 
    String regid = gcm.register(PROJECT_NUMBER); // <---- duplicated if uninstalled/ reinstalled 
    SendRegIdToServer(regId); 

Ora, io mando il mio server RegID e risparmiare sulle dispositivo.

Il problema si presenta quando si disinstalla e si reinstalla, poiché la memoria locale viene persa, chiedo a GCM di registrarsi di nuovo e ottengo un nuovo ID di registrazione. Per questo motivo, il mio server ha duplicati dello stesso dispositivo.

Ho guardato il SO butlot delle domande su GCMRegistrar, che ora è deprecato. Le persone dicono usare l'ID canonico, che è unico. Ma come ottengo?

Sto usando gcm.register e utilizzando quell'ID, che ovviamente sta duplicando sul server.

Apprezzare qualsiasi aiuto.

risposta

9

L'ID canonico viene restituito nella risposta quando si invia un messaggio dal proprio server al server gcm di google.

https://developer.android.com/google/gcm/http.html#response

Interpreting a success response

When a JSON request is successful (HTTP status code 200), the response body contains a JSON object with the following fields:

Field Description multicast_id Unique ID (number) identifying the multicast message. success Number of messages that were processed without an error. failure Number of messages that could not be processed. canonical_ids Number of results that contain a canonical registration ID. See Advanced Topics for more discussion of this topic. results Array of objects representing the status of the messages processed. The objects are listed in the same order as the request (i.e., for each registration ID in the request, its result is listed in the same index in the response) and they can have these fields: message_id: String representing the message when it was successfully processed. registration_id: If set, means that GCM processed the message but it has another canonical registration ID for that device, so sender should replace the IDs on future requests (otherwise they might be rejected). This field is never set if there is an error in the request. error: String describing an error that occurred while processing the message for that recipient. The possible values are the same as documented in the above table, plus "Unavailable" (meaning GCM servers were busy and could not process the message for that particular recipient, so it could be retried). If the value of failure and canonical_ids is 0, it's not necessary to parse the remainder of the response.

Aggiornamento

seguito alcune ulteriori informazioni sugli ID canoniche. In sostanza, se in qualche modo la reg id del dispositivo non è sincronizzata con ciò che Google pensa che dovrebbe essere, quando il server invia una richiesta con l'id non sincronizzato, il server gcm includerà nella sua risposta, l'id corretto da essere usato in futuro.

Pensaci, il modo in cui funziona è; il tuo server dovrebbe aver memorizzato il reg ID quando il dispositivo è stato registrato con gcm. Il tuo server invia una richiesta a gcm con quell'ID, gcm usa quell'id per inviare un messaggio al tuo dispositivo. GCM non può l'id reg sul tuo dispositivo senza dirlo al server. Se lo facesse, il tuo server continuerebbe a inviare l'id reg sbagliato. Invece, gcm comunica al server che il reg id che sta utilizzando per un particolare dispositivo non è valido, il tuo server può quindi inviare un messaggio al dispositivo per aggiornare il suo reg reg memorizzato a quello che dovrebbe essere, e quindi il dispositivo può accettare il cambiamento in ID REG. Le informazioni sottostanti implicano che esiste un limite di tempo oltre a quanto a lungo può ancora essere utilizzato l'ID "cattivo" per inviare messaggi. Credo che il presupposto è che dovrebbe essere abbastanza a lungo per il server per modificare il dispositivo di identificazione (tramite un messaggio GCM utilizzando l'id "cattivo")

ID canoniche

Sul lato server, fino a quando il l'applicazione si sta comportando bene, tutto dovrebbe funzionare normalmente. Tuttavia, se un bug nell'applicazione attiva più registrazioni per lo stesso dispositivo, può essere difficile riconciliare lo stato e si potrebbe finire con messaggi duplicati.

GCM fornisce una funzione denominata "ID di registrazione canonica" per recuperare facilmente da queste situazioni. Un ID di registrazione canonico è definito come l'ID dell'ultima registrazione richiesta dall'applicazione. Questo è l'ID che il server deve utilizzare quando invia messaggi al dispositivo.

Se in seguito si tenta di inviare un messaggio utilizzando un ID di registrazione diverso, GCM elaborerà la richiesta normalmente, ma includerà l'ID di registrazione canonica nel campo registration_id della risposta.Assicurati di sostituire l'ID di registrazione memorizzato nel tuo server con questo ID canonico, in quanto l'ID che stai utilizzando smetterà di funzionare.

+0

Ho pensato che avrei dovuto ottenere l'ID canonico dalla chiamata del mio dispositivo Android a gcm. Non è vero? – techtinkerer

+0

Grazie per la spiegazione dettagliata. Sto lavorando all'app client mentre qualcun altro sta eseguendo il lato server. Tutto ciò che hai descritto sembra essere qualcosa che il nostro server dev dovrebbe fare. In particolare, dal punto di vista del cliente, c'è qualcosa che il cliente può fare, oltre a registrare e salvare quell'ID e inviarlo al back-end per evitare duplicati di ID? – techtinkerer

+0

Utilizzo di Azure Notification Hub per le notifiche, quindi è necessario che Microsoft risolva? Sto solo inviando notifiche dal loro portale, non sono coinvolto nel salvataggio di PNSHandle o nell'invio di notifiche –