2012-12-05 19 views
5

Moja aplikacja używa programu gcm. Za każdym razem, gdy użytkownik się loguje, nowy token gcm jest rejestrowany i wysyłany na mój zewnętrzny serwer. Za każdym razem, gdy użytkownik się wyloguje, token gcm zostanie wyrejestrowany. To woki bez żadnych problemów.Unieważnij wszystkie tokeny gcm

Problem polega na tym, że tester może odinstalować aplikację bez konieczności wylogowywania, a następnie zainstalować ją ponownie i zalogować się na inne konto. Następnie otrzyma dwa gcms z dwóch różnych kont. Oznacza to, że otrzyma prywatne gcms dla konta, na którym obecnie nie jest zalogowany. Może się to zdarzyć nawet w przypadku użytkowników na żywo.

Dokumentacja GCM stwierdza, że ​​tokeny gcm mogą wygasać czasami, jeśli aplikacja zostanie odinstalowana. W praktyce nigdy tak się nie dzieje.
http://developer.android.com/google/gcm/gcm.html

dokumentacja GCM stwierdza również, że można wyrejestrować tokeny GCM wykonując

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

Ale ta metoda nie wydaje się działać, jeśli spróbujesz go po ponownej instalacji. Otrzymuję oddzwanianie, które mówi mi, że token jest niezarejestrowany, ale token gcm nadal działa poprawnie.

Moje pytanie brzmi: czy możesz zagwarantować, że nie ma prawidłowych tokenów gcm dla swojej aplikacji? Naprawdę chciałbym wyrejestrować wszystkie istniejące tokeny podczas pierwszego uruchomienia aplikacji lub przynajmniej zresetować je z ustawień telefonu.

+0

Hej, Alexey, jakie rozwiązanie wybrałeś na –

+0

Zrobiłem to, co zasugerował Mohamed Hafez. Mam tabelę z identyfikatorami użytkowników i tokenami gcm. Oba pola są unikalne. Po otrzymaniu istniejącego identyfikatora użytkownika z nowym tokenem gcm aktualizuję token gcm. Kiedy otrzymuję istniejący token gcm z nowym identyfikatorem użytkownika, aktualizuję identyfikator użytkownika. To wydaje się obejmować wszystkie możliwe przypadki narożne. – Alexey

+1

Co się stanie, jeśli użytkownik jest zalogowany na dwóch urządzeniach. Obawiam się, że te dwa urządzenia nie otrzymają wiadomości GMC z tym rozwiązaniem. A może czegoś brakuje? –

Odpowiedz

1

Wydaje mi się, że wystąpi błąd, gdy serwer wyśle ​​wiadomość do unieważnionego identyfikatora rejestracji. Myślę, że możesz złapać ten błąd, aby usunąć identyfikator rejestracji z bazy danych/magazynu danych.

Również z doc (canonical id):

Jeśli później spróbujesz wysłać wiadomość używając innego rejestracja identyfikator, GCM rozpatrzy wniosek jak zwykle, ale będzie zawierać kanoniczną rejestracji ID w polu registration_id odpowiedzi . Pamiętaj, aby zastąpić identyfikator rejestracyjny przechowywany na serwerze tym identyfikatorem kanonicznym, ponieważ ostatecznie identyfikator, którego używasz, przestanie działać.

+0

Jestem nowy w GCM, więc nie jestem pewien rthis. – rds

+0

Dziękuję, spróbuję tego.Ale wciąż jest jeden problem - będę musiał wysłać tę wiadomość GCM, aby zrozumieć, że stary token został zastąpiony. Oznacza to, że użytkownik nadal będzie otrzymywać prywatne wiadomości od poprzedniego zalogowanego użytkownika, przynajmniej raz. Prawdopodobnie mogę dodać userId do każdego pakietu gcm i sprawdzić go po stronie klienta, ale wciąż mam nadzieję, że istnieje lepszy sposób na osiągnięcie tego, czego potrzebuję. – Alexey

2

tokeny GCM do swojej aplikacji są unikalne dla każdego urządzenia, więc jeśli kiedykolwiek miał inną informacją, że korzystają z tego samego GCM żeton jako inny użytkownik użytkownikowi, to wiesz, że sytuacja opisałeś wystąpił. Zasadniczo za każdym razem, gdy otrzymujesz token GCM, powinieneś usunąć wszystkie starsze rekordy, które mają tokena GCM przed przypisaniem go TYLKO do nowego użytkownika.