2014-11-22 12 views
5

Próbuję uzyskać unikalny identyfikator mojego urządzenia, aby móc otrzymywać powiadomienia push z mojego serwera.Jak uzyskać Canonical ID z GCM

Jak wszystkie turorials powiedzieć: ja zarejestrować za pomocą GMC:

GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); 
    String regid = gcm.register(PROJECT_NUMBER); // <---- duplicated if uninstalled/ reinstalled 
    SendRegIdToServer(regId); 

Teraz wyślę regId mój serwer i zapisać na urządzeniu.

Problem pojawia się po odinstalowaniu i ponownym zainstalowaniu, ponieważ pamięć lokalna jest zgubiona, proszę GCM, aby ponownie się zarejestrował i otrzymałem nowy identyfikator rejestracji. Z tego powodu mój serwer ma duplikaty tego samego urządzenia.

Spojrzałem na SO butlot pytań na GCMRegistrar, który jest teraz przestarzały. Ludzie mówią, że używają Canonical ID, który jest unikalny. Ale jak mam to zdobyć?

Używam gcm.register i używam tego identyfikatora, który oczywiście jest duplikatem na serwerze.

Doceń każdą pomoc.

Odpowiedz

9

Identyfikator kanoniczny jest zwracany w odpowiedzi podczas wysyłania wiadomości z serwera na serwer Google gcm.

https://developer.android.com/google/gcm/http.html#response

Interpreting a success response

When a JSON request is successful (HTTP status code 200), the response body contains a JSON object with the following fields:

Field Description multicast_id Unique ID (number) identifying the multicast message. success Number of messages that were processed without an error. failure Number of messages that could not be processed. canonical_ids Number of results that contain a canonical registration ID. See Advanced Topics for more discussion of this topic. results Array of objects representing the status of the messages processed. The objects are listed in the same order as the request (i.e., for each registration ID in the request, its result is listed in the same index in the response) and they can have these fields: message_id: String representing the message when it was successfully processed. registration_id: If set, means that GCM processed the message but it has another canonical registration ID for that device, so sender should replace the IDs on future requests (otherwise they might be rejected). This field is never set if there is an error in the request. error: String describing an error that occurred while processing the message for that recipient. The possible values are the same as documented in the above table, plus "Unavailable" (meaning GCM servers were busy and could not process the message for that particular recipient, so it could be retried). If the value of failure and canonical_ids is 0, it's not necessary to parse the remainder of the response.

Aktualizacja

Poniżej kilka informacji na Kanonicznych identyfikatorów. Zasadniczo, jeśli jakiś identyfikator urządzenia urządzenia nie jest zsynchronizowany z tym, co według Google powinno być, wtedy gdy twój serwer wyśle ​​żądanie z niezsynchronizowanym identyfikatorem, serwer gcm uwzględni w jego odpowiedzi prawidłowy identyfikator, który ma być używane w przyszłości.

Pomyśl o tym, jak to działa; Twój serwer powinien zapisać identyfikator reg, gdy urządzenie jest zarejestrowane w gcm. Twój serwer wysyła żądanie do gcm z tym identyfikatorem, gcm używa tego identyfikatora, aby wysłać wiadomość do twojego urządzenia. GCM nie może podać identyfikatora reg w urządzeniu bez informowania o tym serwera. Gdyby tak się stało, twój serwer wysłałby tylko niewłaściwy identyfikator reg. Zamiast tego, gcm powiedz serwerowi, że identyfikator, którego używa dla danego urządzenia, jest zły, twój serwer może następnie wysłać wiadomość do urządzenia, aby zaktualizować zapisany identyfikator reg do tego, co powinno być, a następnie urządzenie może potwierdzić zmianę w identyfikatorach REG. Poniższe informacje sugerują, że istnieje pewien limit czasowy, jak również czas, w którym "zły" identyfikator nadal może być używany do wysyłania wiadomości. Myślę, że założenie jest, że powinien on być na tyle długo serwer zmienić identyfikator urządzenia (za pośrednictwem wiadomości gcm przy użyciu „złych” id)

kanoniczne identyfikatory

Po stronie serwera, jak długo aplikacja zachowuje się dobrze, wszystko powinno działać normalnie. Jeśli jednak błąd w aplikacji spowoduje wielokrotne rejestracje dla tego samego urządzenia, może być trudno pogodzić stan i może pojawić się duplikat wiadomości.

GCM zapewnia obiekt o nazwie "kanoniczne identyfikatory rejestracyjne", aby łatwo odzyskać z tych sytuacji. Kanoniczny identyfikator rejestracji jest zdefiniowany jako identyfikator ostatniej rejestracji żądanej przez aplikację. Jest to identyfikator, którego powinien używać serwer podczas wysyłania wiadomości do urządzenia.

Jeśli później spróbujesz wysłać wiadomość z innym identyfikatorem rejestracji, GCM przetworzy żądanie tak jak zwykle, ale będzie zawierał kanoniczny identyfikator rejestracji w polu registration_id odpowiedzi.Pamiętaj, aby zastąpić identyfikator rejestracji przechowywany na serwerze tym identyfikatorem kanonicznym, ponieważ w końcu identyfikator, którego używasz, przestanie działać.

+0

Myślałem, że powinienem uzyskać identyfikator kanoniczny z połączenia urządzenia z systemem Android z gcm. Czy to nie prawda? – techtinkerer

+0

Dzięki za szczegółowe wyjaśnienie. Pracuję nad aplikacją kliencką, gdy ktoś inny pracuje po stronie serwera. Wszystko, co opisałeś, wydaje się być czymś, co powinien zrobić nasz serwer. W szczególności, z perspektywy klienta, czy jest coś, co może zrobić klient, poza zarejestrowaniem i zapisaniem tego identyfikatora i wysłaniem go do zaplecza, aby uniknąć duplikowania identyfikatorów? – techtinkerer

+0

Używam Centrum powiadomień Azure do powiadamiania, więc czy to jest coś, co Microsoft musi naprawić? Właśnie wysyłam powiadomienia z ich Portalu, nie biorę udziału w zapisywaniu PNSHandle ani wysyłaniu powiadomień –

Powiązane problemy