15

Ich habe eine Liste der GCM-registrierten Benutzer und ihre entsprechenden Registrierungs-IDs in einer Datenbanktabelle, und ich möchte einen Benutzer wirklich abmelden, wenn er/sie aus der Tabelle gelöscht wird. Ich habe hier in Stackoverflow viele Beispiele gefunden, aber die meisten basieren auf der alten API GCMRegistrar, die jetzt veraltet ist. Ich verwende GoogleCloudMessaging API und einem Benutzer durch folgende Methode Registrierung:Registrierung eines Geräts von GCM mit Registrierungs-ID in Android

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()); 
     } 
} 

Ich habe ein Administrator-App, die als 3rd-Party-Application-Server fungiert, da es Benachrichtigungen an alle Benutzer schiebt. Ich mag einen bestimmten Benutzer von diesem Administrator-App mit folgenden Methode zum Aufheben der Registrierung:

private void unRegister(String regId) { 

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

    } 

Aber es verwirrt mir, dass austragen() -Methode ist keine Registrierung Id als Argument nehmen, die es unmöglich macht, ein bestimmtes Gerät deregistrieren. Gibt es eine Möglichkeit, die Registrierung eines bestimmten Geräts von GCM per Registrierungs-ID aufzuheben?

+1

lol, aber Sie diesen Code ausführen ** auf bestimmten Gerät ** so deregistrieren es dieses spezielle Gerät ... – Selvin

+0

Ich führe die "register" -Methode auf dem spezifischen Benutzergerät, aber ich muss die Registrierung des Benutzers vom Administratorgerät aufheben. –

+1

Administrator-Gerät? Es gibt keine solche Sache in GCM – Selvin

Antwort

21

Diese Methode funktioniert der Trick:

gcm.unregister(); 

jedoch gcm.unregister() ist veraltet, daher müssen Sie eine davon verwenden:

InstanceID.deleteToken() oder InstanceID .deleteInstanceID().

Diese Methoden nehmen die folgenden Parameter:

public void deleteToken (String authorizedEntity, String scope) 

Einheit autorisiert ist, um die Einheit, die Sie entfernen möchten ...

// die folgende Erläuterung NUR FÜR "UNREGISTER"

Also, basierend auf Ihrem Kommentar:

Aber es verwirrt mich, dass unregister() -Methode keine Registrierung Id als ein Argument, das es unmöglich macht, eine spezifische Gerät abzumelden.

Das liegt daran, dass Sie erwarten, dass es so funktioniert, wie es nicht der Fall ist. Es scheint, wie Sie in der Lage sein, einen Parameter zu uregister eine HTTP-Anforderung zu machen vorbei (zB „http://www.gcmserver.com?unregisterid=xxxx“), und das ist nicht die Art, wie es funktioniert, ist dies der Weg, es funktioniert auf Basis von Googles Dokumentation:

So funktioniert die Aufhebung der Registrierung

Eine Anwendung kann automatisch abgemeldet werden, nachdem sie vom Gerät aus deinstalliert wurde. Dieser Vorgang tritt jedoch nicht sofort auf, da Android keinen Rückruf für die Deinstallation bietet. Was passiert in diesem Szenario ist wie folgt:

Der Endbenutzer deinstalliert die Anwendung.

Der 3rd-Party-Server sendet eine Nachricht an den GCM-Server.

Der GCM-Server sendet die Nachricht an das Gerät.

Der GCM-Client empfängt die Nachricht und fragt den Paket-Manager nach , ob Broadcast-Empfänger für den Empfang konfiguriert sind. gibt false zurück. Der GCM-Client informiert den GCM-Server, dass die -Anwendung deinstalliert wurde.

Der GCM-Server markiert die Registrierungs-ID zum Löschen.

Der 3rd-Party-Server sendet eine Nachricht an GCM.

Das GCM gibt eine NotRegistered Fehlermeldung an den 3rd-Party-Server zurück.

Der Drittanbieter löscht die Registrierungs-ID.

So, basierend auf dem, was die Methode gcm.unregister() tatsächlich nicht markiert, dass die Vorrichtung zum Löschen (man denke an sie als zwingt die ersten Schritte des Prozesses, ohne tatsächlich die App deinstallieren), lassen Sie den Server wissen, dass es keine Benachrichtigungen mehr erhalten muss, auch wenn es keine "ID" als Parameter verwendet, bedeutet dies, dass es auf dieses spezifische Gerät verweist.

Grüße!

+0

Wie viel Zeit benötigt GCM, um die ID zu entfernen? Ich habe versucht, die App zu deinstallieren und eine Nachricht über GCM gesendet. Dann habe ich die App installiert, aber ich konnte Nachrichten mit der alten gcm ID senden. Eine andere Frage; Was passiert, wenn der Nutzer die App neu installiert? In diesem Fall erhält das Gerät eine Nachricht zweimal. Wenn GCM während der Neuinstallation der App nicht versucht, eine Nachricht zu senden, bemerkt es nicht, dass die App deinstalliert wurde. Kann ich diese Fälle behandeln, wenn ich immer gcm.unregister() anrufe, bevor ich das Gerät bei GCM registriere? – eren130

+1

Was passiert, wenn ich mich von GCM abmelden möchte, wenn sich der Benutzer von der Anwendung abmeldet? Soll ein neuer IntentService erstellt werden, um die Registrierung aufzuheben? – JGPhilip