Pytanie Wyrejestruj urządzenie z GCM, używając identyfikatora rejestracji w systemie Android


Mam listę zarejestrowanych użytkowników GCM i ich odpowiednie identyfikatory rejestracyjne w tabeli bazy danych, a ja naprawdę chcę wyrejestrować użytkownika, gdy zostanie on usunięty z tabeli. W Stackoverflow znalazłem wiele przykładów, ale większość z nich opiera się na starym API GCMRegistrar, które jest teraz przestarzałe. Korzystam z interfejsu API GoogleCloudMessaging i rejestruję użytkownika za pomocą następującej metody:

private void registerUser(){
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext());
        String regId = "";
        try {
            regId = gcm.register(getString(R.string.project_number));
            Log.i("registrationId", regId);
        } 
        catch (IOException e) {
            Log.i("Registration Error", e.getMessage());
        }
}

Mam aplikację administratora, która działa jako serwer aplikacji innej firmy, ponieważ wysyła powiadomienia do wszystkich użytkowników. Chcę wyrejestrować określonego użytkownika z tej aplikacji administratora za pomocą następującej metody:

private void unRegister(String regId) {

        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext());
        try {
            gcm.unregister();
        } 
        catch (IOException e) {     
        System.out.println("Error Message: " + e.getMessage());
        }

   }

Ale mylą mnie, że metoda unregister () nie przyjmuje identyfikatora rejestracji jako argumentu, co uniemożliwia wyrejestrowanie określonego urządzenia. Czy istnieje sposób na wyrejestrowanie określonego urządzenia z GCM według identyfikatora rejestracji?


15
2018-01-21 00:00


pochodzenie


lol, ale uruchamiasz ten kod na określonym urządzeniu więc wyrejestrowuje to konkretne urządzenie ... - Selvin
Używam metody "register" na konkretnym urządzeniu użytkownika, ale muszę wyrejestrować użytkownika z urządzenia administratora. - Osman Esen
urządzenie administratora? nie ma czegoś takiego w GCM - Selvin
Mam na myśli serwer aplikacji innej firmy, który wysyła powiadomienia do wszystkich zarejestrowanych urządzeń. Zaimplementowałem serwer w aplikacji na Androida. - Osman Esen
Korzystając z usługi Amazon-SNS - Osman Esen


Odpowiedzi:


Ta metoda sprawdza się:

gcm.unregister();

Jednak gcm.unregister () jest teraz przestarzałe, dlatego musisz użyć jednego z nich:

InstanceID.deleteToken () lub InstanceID.deleteInstanceID ().

Te metody przyjmują następujące parametry:

public void deleteToken (String authorizedEntity, String scope)

Jako podmiot uprawniony podmiot, który chcesz usunąć ...

// PONIŻSZE WYJAŚNIENIE JEST TYLKO DLA "UNREGISTERA"

Na podstawie Twojego komentarza:

Ale mylą mnie, że metoda unregister () nie wymaga rejestracji   Id jako argument, który uniemożliwia wyrejestrowanie konkretnego   urządzenie.

To dlatego, że oczekujesz, że zadziała w taki sposób, że nie działa. Wygląda na to, że chcesz utworzyć żądanie http przekazujące parametr do uregister (np. "http://www.gcmserver.com?unregisterid=xxxx"), a to nie tak działa, tak działa na podstawie Dokumentacji Google:

Jak działa wyrejestrowanie

Aplikacja może zostać automatycznie wyrejestrowana po jej zakończeniu   odinstalowany z urządzenia. Jednak ten proces się nie dzieje   od razu, ponieważ Android nie zapewnia oddzwaniania odinstaluj. Co   dzieje się w tym scenariuszu jest w następujący sposób:

Użytkownik końcowy odinstalowuje aplikację.

Serwer zewnętrzny wysyła wiadomość do serwera GCM.

Serwer GCM wysyła wiadomość do urządzenia.

Klient GCM odbiera komunikat i pyta o Menedżera pakietów   czy istnieją odbiorniki rozgłoszeniowe skonfigurowane do odbioru, które   zwraca false.

Klient GCM informuje serwer GCM, że   aplikacja została odinstalowana.

Serwer GCM oznacza identyfikator rejestracji do usunięcia.

Serwer zewnętrzny wysyła wiadomość do GCM.

GCM zwraca komunikat o niezarejestrowanym błędzie na serwer innej firmy.

Firma zewnętrzna usuwa identyfikator rejestracji.

Na tej podstawie metoda gcm.unregister () faktycznie oznacza to urządzenie do usunięcia (pomyśl o tym, jak wymusić pierwsze kroki procesu bez deinstalacji aplikacji), dając serwerowi pewność, że już nie potrzebuje aby otrzymywać powiadomienia, również nie przyjmując "Id" jako parametru, oznacza to, że odnosi się do tego konkretnego urządzenia.

Pozdrowienia!


21
2018-01-21 00:24



ile czasu potrzeba GCM na wyrejestrowanie identyfikatora? Próbowałem odinstalować aplikację i wysłać wiadomość przez GCM. Następnie zainstalowałem aplikację, ale mogę wysłać wiadomość przy użyciu starego identyfikatora gcm. Inne pytanie; Co jeśli użytkownik ponownie zainstaluje aplikację? W takim przypadku urządzenie otrzyma dwa razy wiadomość. Ponieważ podczas instalowania aplikacji, jeśli GCM nie próbuje wysłać wiadomości, nie zauważy, że aplikacja została odinstalowana. Czy mogę obsłużyć takie przypadki, jeśli zawsze wywoływam gcm.unregister (), zanim zarejestruję urządzenie w GCM? - eren130
Co się stanie, jeśli chcę wyrejestrować się z GCM, gdy użytkownik wyloguje się z aplikacji? Czy należy utworzyć nową IntentService w celu wyrejestrowania? - JGPhilip


unregister() jest teraz przestarzałe:

https://developers.google.com/android/reference/com/google/android/gms/gcm/GoogleCloudMessaging.html#unregister ()

Cytując dokumenty, do których powinieneś zadzwonić:

Instead use InstanceID.deleteToken() or InstanceID.deleteInstanceID().

4
2018-04-14 21:58