2013-06-04 11 views
9

Jeśli jestem wysyłając zgłoszenie do urządzenia, oraz że urządzenie jest w trybie offline uzyskać coś takiego:Wyślij zgłoszenie GCM do urządzenia w trybie offline

Error: Unavailable

I muszę wysłać ponownie.

Moje pytanie brzmi:

Czy serwer GCM zachować te powiadomienia w kolejce i automatycznie wysłać ponownie, gdy urządzenie jest w trybie online? Lub musi to być całkowicie obsługiwane przeze mnie.

Bo jeśli serwer GCM wyśle ​​je automatycznie (gdy urządzenie jest w trybie online), dopóki nie wyśle ​​powiadomień, mój serwer zakłada, że ​​są już wysłane. Jak śledzić czas, kiedy powiadomienia są wysyłane ponownie?

Mogę zaznaczyć na mojej stronie serwera, że ​​powiadomienia nie są wysyłane przez patrzenie na numer Unavailable error message, ale nie można odczytać, jak oznaczyć je jako wysłane po pomyślnym wysłaniu przez GCM powiadomień.

Dziękuję

Odpowiedz

11

A/C do dokumentacji --- Kiedy 3rd firm posty serwera wiadomość do GCM i odbiera identyfikator wiadomości z powrotem, to nie znaczy, że wiadomość została już dostarczona do urządzenia. Przeciwnie, oznacza to, że został przyjęty do dostawy. To, co stanie się z wiadomością po jej zaakceptowaniu, zależy od wielu czynników.

Jeśli urządzenie jest połączone, ale bezczynne, wiadomość zostanie dostarczona od razu, chyba że flaga opóźniającego_czasu_czasu jest ustawiona na wartość true. W przeciwnym razie będzie przechowywany na serwerach GCM, dopóki urządzenie się nie obudzi. I tu właśnie odgrywa rolę znacznik collapse_key: jeśli istnieje już komunikat z tym samym kluczem collapse (i identyfikatorem rejestracji), który jest przechowywany i czeka na dostarczenie, stara wiadomość zostanie odrzucona, a nowa wiadomość zajmie jego miejsce (czyli stara wiadomość zostanie zwinięta przez nową). Jeśli jednak klucz zwinięcia nie jest ustawiony, zarówno nowe, jak i stare wiadomości są przechowywane do przyszłego dostarczenia.

Uwaga: Istnieje limit liczby wiadomości, które można przechowywać bez zwijania. Ten limit wynosi obecnie 100. Po osiągnięciu limitu wszystkie zapisane wiadomości są odrzucane.

+0

jak będzie mój serwer wie, kiedy powiadomienie zostanie ostatecznie wysłane (pomyślnie)? – user1537779

+0

Nie wierzę, że można uzyskać te informacje z serwerów GCM. Oznacza to, że będziesz musiał polegać na innej metodzie komunikacji między aplikacjami klienckimi, które pomyślnie odbierają twoją wiadomość i twój serwer. Odpowiedź, którą otrzymujesz z serwerów GCM (jak wiesz), po prostu informuje: sukces: Liczba wiadomości, które zostały przetworzone bez błędu. lub Błąd: Liczba wiadomości, których nie można przetworzyć. –

+0

'Mogę zaznaczyć na mojej stronie serwera, że ​​powiadomienia nie są wysyłane, patrząc na komunikat o błędzie Niedostępne, ale nie można określić, jak oznaczyć je jako wysłane po pomyślnym wysłaniu przez GCM powiadomień." Może skończę wysyłać te same powiadomienia ponownie, jeśli Nie wiem, czy serwer gcm wyśle ​​je później, czy nie. – user1537779

2

Co zrobiłem było oddzielenie wskazanie Push z ładowności. W moim komunikacie GCM umieszczam tylko identyfikator URI dla ładunku, a ja przechowuję ładunek w tabeli bazy danych dostępnej za pośrednictwem identyfikatora URI w wiadomości.

Gdy klient otrzymuje wiadomość, może np. wyglądać tak, ze hateoas łączy styl:

{ 
    _links: { 
    message: { 
     rel: 'message', 
     href: 'https://my-server.com/push/<messageId>' 
    } 
    } 
} 

Następnie klient idzie do GET ładunek wiadomość z URI, w którym to momencie serwer wie, że został dostarczony i może odpowiednio zaktualizować. Pobieranie ładunku również usuwa go.

Jeśli ponowne dostarczenie GCM nie jest wystarczająco mocne, oznacza to również, że klient może ręcznie pobrać wszystkie oczekujące wiadomości, np. gdy połączenie sieciowe zostanie wznowione po przejściu w tryb offline, mając punkt końcowy, który zwraca wszystkie wiadomości dla określonej wartości ANDROID_ID lub podobnej. Jeśli następnie dostarczony zostanie komunikat GCM pod numerem, klient otrzyma 404 dla identyfikatora URI w tej wiadomości i potraktuje go jako komunikat "no-op", tj. Już obsłużony.

Jeśli jest to przesada, podejście lekka tylko osiągnąć świadomość serwera dostarczania wiadomości jest mieć punkt końcowy, który po prostu ACK odbiór wiadomości z danym ID, takie jak

POST https://my-server.com/push/notifyReceived 

{ 
    messageId: <messageId> 
} 
+0

To interesujące podejście, ale nie odpowiada bezpośrednio na pytanie. Czy GCM podejmuje próbę ponownego dostarczenia? – Flimm

+1

Masz rację. Być może lepiej pasowało to do komentarza, ale trochę za długo i miałem nadzieję, że komuś to pomoże. – JHH

Powiązane problemy