2011-07-06 20 views
9

Zastanawiam się, czy ktoś miał do czynienia z tym problemem z Google C2DM? Jest to scenariusz mam do czynienia z:Android C2DM: Zduplikowana wiadomość do tego samego urządzenia i aplikacji

  1. Użytkownik instaluje aplikację i rejestruje z serwerem C2DM do rejestracji klucza.
  2. Użytkownik odinstalowuje aplikację.
  3. Użytkownik ponownie instaluje aplikację (i rejestrów z serwerem C2DM dla nowego klucza rejestracji ).

Teraz wysyłam wiadomość z mojego serwera na telefon użytkownika i otrzymuję zduplikowaną wiadomość.

Czy ktokolwiek mógłby rzucić jakąkolwiek wnikliwość w to, co jest oczekiwane, lub jak mogę to naprawić? Dzięki,

+1

Czy masz na myśli, że otrzymują tę samą wiadomość dwa razy w krótkich odstępach czasu? To zdecydowanie nie jest oczekiwane zachowanie - ich klucz chmury powinien zostać oznaczony jako nieużywany podczas odinstalowywania. Głupie pytania i przeprosiny w zadawaniu pytań - ale czy jesteś pewien, że twój kod serwera podkrada ich numery identyfikacyjne w chmurze? Czy przechowujesz dziennik wszystkich żądań serwera c2dm i odpowiedzi, które Google odsyła? –

Odpowiedz

7

Nie wiem, czy jest to najlepsze podejście, ale nie jest to istotne thread nad w grupie android-c2dm, gdzie plakat oferuje jeden technika:

przesyłam id rejestracji w komunikacie, tak Mogę sprawdzić to na podstawie zapisanego identyfikatora rejestracji na urządzeniu.

Jeśli to nie to samo, odrzucić ją i powiadomić obsługę, że rejestracja Id nie jest już w użyciu

minusem jest wysyłającego Rejestracja jest Id zajmuje trochę miejsca w już ograniczoną wielkość wiadomości. Ale działa doskonale w moim przypadku, ponieważ moja oryginalna wiadomość w postaci jest nie dłuższa niż kilka znaków.

+0

Świetna technika! Wydaje się bardzo inteligentny – Matroska

0

Tak, wpadłem na ten sam problem i moim zdaniem jest to duże niedopatrzenie w implementacji systemu Android C2DM. System iOS radzi sobie z tym znacznie lepiej, ponieważ aplikacja może otrzymywać powiadomienia tylko dla jednego i tylko jednego tokena urządzenia (odpowiednik identyfikatora rejestracji c2dm).

Sposób postępowania polega na wysłaniu 10 ostatnich znaków identyfikatora rejestracji jako części o ładowności C2DM a następnie w moim metoda onMessage zrobić następujące sprawdzenia:

if (!regId.endsWith(bundle.getString("regsuffix"))) return null; 
1

Innym rozwiązaniem mogłoby być zapewnienie serwer z unikalnym identyfikatorem urządzenia. W takim przypadku wystarczy zaktualizować identyfikator rejestracyjny dla tego identyfikatora UUID, gdy urządzenie spróbuje zarejestrować się po ponownej instalacji.

+0

+1 robię to samo wdrożenie w architekturze moich aplikacji. Ale także jeśli usługa C2DM zwraca, że ​​rejestracja jest nieprawidłowa, możesz ją usunąć ponownie. –

4

To powinno się zdarzyć tylko w przypadku pierwszego powiadomienia push po ponownym zainstalowaniu aplikacji.

Usługa Google C2DM działa w trybie pasywnym, jeśli chodzi o wykrywanie odinstalowanych aplikacji.

Pierwsze powiadomienie push po odinstalowaniu aplikacji (bez wyrejestrowania z C2DM !!!) NIE zwróci żadnego błędu w odpowiedzi. Jednak drugie powiadomienie push zwróci kody błędu "nieprawidłowej rejestracji" lub "niezarejestrowanej", w których można zdiagnozować odinstalowanie aplikacji.

Powodem jest to, że serwery C2DM natychmiast zwracają kod odpowiedzi, a dopiero potem próbuje przekazać klienta. Gdy klient odpowie, że aplikacja została odinstalowana, jest usuwany z serwerów C2DM.Następna próba push natychmiast zwróci kod błędu.

+0

Ale co się stanie, jeśli użytkownik zainstaluje aplikację natychmiast po odinstalowaniu i zarejestruje się w Reg_Id. Jeśli urządzenie zostanie wypchnięte przy użyciu parametru reg_id, który był ważny przed odinstalowaniem. Czy wiadomość trafi do urządzenia lub zwróci "nieprawidłową rejestrację". – Erik

+0

Identyfikatory rejestracji są unikalne dla każdego urządzenia, aplikacji i zalogowanego użytkownika Google. Myślę, że w scenariuszu, który opisałeś, aplikacja otrzyma taki sam identyfikator rejestracji, jak w poprzedniej instalacji, więc powinieneś być w porządku. – Zamel

0

Obie odpowiedzi @Zamel i @johan są dobre i należy je połączyć. Jeśli połączysz oba rozwiązania, zminimalizujesz bazę danych serwera.

Tak więc najlepszym rozwiązaniem będzie:

  1. Send ID urządzenia podczas wysyłania token wypychania na serwer

  2. Aktualizacja Push żeton gdy zostaje wysłany do ID istniejące urządzenia

  3. Invalidate Token push w bazie danych serwera, jeśli powiadomienie push zwraca kod błędu "nieważna rejestracja" lub "niezarejestrowany" na serwerze

Gdy token jest rozpoznawany jako "rejestracja nieprawidłowa" lub "niezarejestrowany", można go unieważnić (oznaczyć jako wartość pustą), usunąć wiersz w bazie danych lub wdrożyć funkcję wygaśnięcia. To zależy od twoich potrzeb.

Powiązane problemy