2012-12-05 12 views
5

La mia app utilizza gcm. Ogni volta che l'utente effettua l'accesso, il nuovo token gcm viene registrato e inviato al mio server di terze parti. Ogni volta che l'utente si disconnette, il token gcm non è registrato. Questo wok senza problemi.Invalidate tutti i token gcm

Il problema è che quando si tratta di test, tester può disinstallare l'app senza effettuare il logout, quindi installarla di nuovo e accedere a un altro account. Quindi riceverà due gcms da due account diversi. Ciò significa che riceverà gcms privati ​​per account non attualmente registrati. Questo può accadere anche a volte con utenti live.

La documentazione GCM indica che i token gcm possono scadere a volte se l'applicazione viene disinstallata. In pratica, questo non succede mai.
http://developer.android.com/google/gcm/gcm.html

documentazione GCM afferma inoltre che è possibile annullare la registrazione di gettoni GCM eseguendo

Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER"); 
unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); 
startService(unregIntent); 

Ma questo metodo non sembra funzionare se lo provate dopo la reinstallazione. Ricevo callback che mi dice che il token non è registrato, ma il token gcm funziona ancora correttamente.

La mia domanda è: puoi assicurarti che non ci siano token gcm validi per la tua applicazione? Mi piacerebbe davvero annullare la registrazione di tutti i token esistenti durante l'avvio della prima applicazione o almeno ripristinarli dalle impostazioni del telefono.

+0

Hey Alexey, che soluzione hai fatto per –

+0

Ho fatto quello che ha suggerito Mohamed Hafez. Ho una tabella con ID utente e token gcm. Entrambi i campi sono unici. Quando ricevo un ID utente esistente con un nuovo token gcm, aggiorno il token gcm. Quando ricevo il token gcm esistente con un nuovo ID utente, aggiorno l'ID utente. Questo sembra coprire tutti i possibili casi d'angolo. – Alexey

+1

Cosa succede se un utente ha effettuato l'accesso su due dispositivi. Temo che i due dispositivi non riceverebbero i messaggi gcm con questa soluzione. O mi sta sfuggendo qualcosa. –

risposta

1

Credo che riceverai un errore quando il tuo server invierà un messaggio all'ID di registrazione invalidata. Penso che tu possa cogliere questo errore per cancellare questi ID di registrazione dal tuo database/datastore.

anche dalla doc (canonical id):

Se in seguito si tenta di inviare un messaggio utilizzando un diverso registrazione ID, GCM elaborerà la richiesta, come al solito, ma sarà comprendere la registrazione canonica ID nel campo registration_id della risposta . Assicurati di sostituire l'ID di registrazione memorizzato nel tuo server con questo ID canonico, poiché alla fine l'ID che stai usando non funzionerà più .

+0

Sono nuovo di GCM, quindi non sono sicuro di questo – rds

+0

Grazie, ci proverò.Ma c'è ancora un problema: dovrò inviare questo messaggio gcm per capire che quel vecchio token è stato sostituito. Ciò significa che l'utente riceverà comunque messaggi privati ​​dal precedente utente registrato, almeno per una volta. Posso probabilmente aggiungere userId ad ogni pacchetto gcm e controllarlo sul lato client, ma spero ancora che ci sia un modo migliore per realizzare ciò di cui ho bisogno. – Alexey

2

gettoni GCM per la tua app sono unici per ogni dispositivo, quindi se mai ottenere un altro utente che ti dice che stanno utilizzando lo stesso motivo GCM come un altro utente, poi si sa che la situazione che hai descritto è verificata. In pratica, ogni volta che ricevi un token GCM, devi eliminare tutti i record precedenti che hanno lo stesso token GCM prima di assegnarlo SOLO al nuovo utente.

Problemi correlati