2015-08-23 14 views
7

Cercando di implementare i servizi più recenti di google GCM. Ho letto GCM documentation. Ho anche scaricato & analizzato google's sample implementation. Da tutto quanto sopra ho capito quanto segue:Confuso circa il processo di aggiornamento del token GCM

  1. InstanceId servizi forniscono le API per generare gcm registration tokens Si invia & negozio questo generato token nel vostro application server.
  2. Questi token possono essere modificati una volta ogni tanto dal lato client e dal lato del servizio instanceId come menzionato here. Per gestire questa situazione, è necessario implementare InstanceIDListenerService e il provider InstanceID chiamerai onTokenRefresh dove basta scrivere la vostra logica per ottenere un nuovo token e inviandola al server (Google's sample app)
  3. C'è qualcosa chiamato canonical_id (as mentioned here) (che è l'ultimo registration_id invia da un dispositivo) che il server GCM invia il tuo dispositivo se il tuo server delle applicazioni invia un ID di registrazione più vecchio. Devi sostituire il tuo token esistente nel server con questo canonical_id.

Ora, in seguito sono le mie domande:

  1. InstanceId.getToken sembra tornare Allo stesso modo, se l'applicazione non viene disinstallato e restituisce abbastanza veloce se il token non è cambiato. Posso chiamare lo RegistrationIntentService ogni volta che avvio l'app? In questo modo ho la certezza di poter lavorare con l'ultimo token tutto il tempo.
  2. Come funziona il onTokenRefresh se l'aggiornamento si verifica mentre l'app non è connessa al Play Store (niente internet o qualcosa del genere)? Il provider InstanceId riprova? Questo è documentato da qualche parte? Cosa succede se allo stesso tempo viene inviata una notifica push?
  3. Che cosa è esattamente un canonical_id? è l'ultimo token generato per un dispositivo (avviato da InstanceID.getToken al client o al InstanceId end del provider)? Se canonical_id è effettivamente l'ultimo token gcm, qual è la necessità dell'implementazione di onTokenRefresh in quanto è comunque possibile analizzare i dati di notifica push e aggiornare il server dell'app se si trova uno canonical_id fornito?

risposta

4

posso chiamare RegistrationIntentService ogni volta che avvio l'app?

Una soluzione migliore sarebbe quella di salvare di preferenza che è già riuscito a registrare un token. avviare RegistrationIntentService solo se non si è già registrati.

String token = InstanceID.getToken(...); 
//send to server 
getSharedPreferences(context).edit().putBoolean(PREFIX_PREF_GCM_KEY, true).apply(); 

poi quando si avvia l'app basta controllare se PREFIX_PREF_GCM_KEY vale

Come funziona l'onTokenRefresh se aggiornamento avviene mentre la vostra applicazione non è collegato al Play Store (senza internet o qualcosa del genere)

Immagino che spetti al sistema chiamare questo refresh procedure. la documentazione indica:

Chiamato quando il sistema determina che i token devono essere aggiornati.L'applicazione dovrebbe chiamare getToken() e inviare i token a tutti i server delle applicazioni. Questo non verrà chiamato molto frequentemente, è necessario per la rotazione delle chiavi e per gestire casi speciali. Il sistema limiterà l'evento di aggiornamento su tutti i dispositivi per evitare di sovraccaricare i server applicazioni con gli aggiornamenti dei token.

Può essere chiamato mentre l'app è addormentata (come quando si riceve la notifica) ma è necessario verificarla e verificare che funzioni come previsto.

Penso anche che mentre non ci sia la connessione internet, il System non chiamerà onRefreshToken per il semplice motivo che non sarà in grado di ricevere le notifiche di aggiornamento ... ma come sempre si dovrebbe testare da te stesso per vedere se il processo di aggiornamento funziona e in quali condizioni.

Che cosa è esattamente un canonical_id?

E 'possibile che per errore è stato registrato più ID di registrazione di per lo stesso dispositivo in server - per esempio - onRefreshToken - ha registrato un segno senza eliminare quello vecchio. Se si invia un messaggio utilizzando il vecchio registartaion_id, Google ti consente di sapere si dovrebbe cambiare al nuovo - il canonical_id

+0

grazie! Capisco che puoi rimanere all'interno di 'sharedpreferences', come ho fatto per la mia vecchia API GCM (' GCM.register'). Tuttavia, ora sono confuso con questo aggiornamento dei token. La mia domanda di base è se canonical_id inviato è lo stesso dell'ultimo token di quel dispositivo. Perché se questo è il caso, potrebbe non esserci una necessità per l'implementazione di onRefreshToken del tutto. – ranjjose

+1

Perché no? È un processo che ti consente di risolvere i problemi prima che si verifichino (aggiornando il token prima di utilizzare quello vecchio). – royB

+0

Come per i documenti, se trovi un 'registration_id' nella risposta gcm, significa che il token di registrazione che hai nel server delle app non è aggiornato e dovrebbe essere sostituito con quello in 'registration_id'. Il mio problema è che, (1) 'InstanceID service' decide di aggiornare il token e chiama l'implementazione di' onRefreshToken' e lì avresti comunque chiamato 'InstanceID.getToken' e aggiornato il database del server al suo interno. Una volta completato l'aggiornamento, il tuo server delle applicazioni avrà gli ultimi token. Da quel momento in poi, non riesco a trovare un caso in cui trovi 'registration_id' nella risposta gcm. (cont.d) – ranjjose

Problemi correlati