Durch das Aufheben der Registrierung und Neuregistrierung für GCM-Nachrichten sind zwei regIds gültig. Ist das wie beabsichtigt?

8

Ich habe merkwürdiges Verhalten bei der Registrierung / Aufhebung der Registrierung für GCM-Nachrichten auf Android-Geräten bemerkt. Beachten Sie den folgenden Anwendungsfall aus Sicht des Client-Geräts:

  1. Registrieren Sie sich für GCM - ID A zugewiesen
  2. Abmelden
  3. Registrieren Sie sich für GCM - ID B zugewiesen

Wenn der Server nach Schritt 2 versucht, eine Nachricht an die ID A zu senden, erhält er einen NotRegistered -Fehler, wird dokumentiert und erwartet.

Aber nun der seltsame Teil: Nach Schritt 3 sind beide ID A und B gültige IDs! Beide IDs lösen den Intent-Empfänger auf dem Gerät aus, was zu zwei Nachrichten an die App führt.

Wird dieses Verhalten erwartet oder mache ich etwas falsch?

Dies ist mein Code zum Registrieren und Abmelden, ausgelöst von onCreate() beim ersten Start meiner App:

%Vor%

Hinweis 1: Ich habe nur den unregister () - Aufruf für Debugging-Zwecke eingefügt. Meine App bleibt normalerweise für "fürs Leben" registriert (ich möchte auch GCM-Nachrichten erhalten, wenn sie ausgesetzt und beendet wird), aber ich möchte immer noch die Ursache für dieses Verhalten herausfinden, da ich nicht sicher bin, ob die Aufhebung der Registrierung der einzige Fall ist IDs werden neu generiert. Was passiert, wenn der Nutzer die App deinstalliert und neu installiert? Ich möchte ein kugelsicheres System - meine Benutzer erhalten niemals dieselbe GCM-Nachricht zweimal.

Hinweis 2: Das Problem ist ziemlich ähnlich dazu , außer dass ich mich tatsächlich mit getApplicationContext() registriere, wie die Antwort suggeriert.

    
Nilzor 01.05.2013, 14:57
quelle

2 Antworten

4
  1. Wenn Sie die Registrierung aufheben, sollten Sie die alte Registrierungs-ID an Ihren Server senden und sie aus Ihrer Datenbank entfernen.

  2. Angenommen, Sie haben Schritt 1 nicht ausgeführt. Wenn Sie nach der Registrierung und dem Abrufen der neuen Registrierungs-ID eine Nachricht mit der alten Registrierungs-ID senden, enthält die Antwort von Google eine kanonische Registrierungs-ID (die neue Registrierungs-ID) ). Diese Antwort zeigt an, dass der Server die alte Registrierungs-ID löschen und nur die neue verwenden sollte.

Eran 01.05.2013, 15:39
quelle
1

Ich hatte ein ähnliches Problem und glaube, ich habe zusammengefügt, was passiert, und habe eine Hybridlösung ausgearbeitet. Leider ist es immer noch nicht kugelsicher, obwohl es für meinen Fall funktioniert (mehr dazu später).

Hier ist, was ich glaube, Sie sehen:

  • Fall 1: Ihr Drittanbieterserver sendet eine GCM-Push-Nachricht nach Schritt 2, aber vor Schritt 3 (d. h. der Fall, in dem Ihr Server eine Nachricht für Geräte-ID-A gesendet und NotRegistered empfangen hat). Laut der Google-Dokumentation hat Ihr GCM-Geräteclient gemeldet, dass kein Broadcast-Empfänger für die Nachricht konfiguriert ist (da er gerade deinstalliert ist). Dies hat zur Folge, dass die ID-A-Registrierung wie erwartet vom GCM-Dienst aufgehoben wird.

    Hier ist ein SO-Beitrag beschreibt den GCM-Registrierungsprozess für diesen Fall.

  • Fall 2: Ihre App wurde deinstalliert und anschließend ohne eine GCM-Push-Nachricht auf dem Gerät neu installiert. In diesem Fall wird eine neue GCM-ID zugewiesen, aber der GCM-Dienst wird niemals auf das Fehlen eines Broadcast-Empfängers aufmerksam gemacht, so dass beide IDs gültig bleiben und beide dem Gerät zugestellt werden können. Dies wird vom GCM-Dienst als doppelte Registrierungs-ID gemeldet.

In beiden Fällen meldet der GCM-Dienst das Problem, und die Bereinigung kann im Nachhinein erfolgen.

Siehe SO-Post für eine sehr gute Erklärung der GCM Service Feedback.

Leider kann es zu spät sein, wenn Sie genau eine Zustellung Ihrer Nachricht sicherstellen möchten. Nach einigem Suchen muss ich schlussfolgern, dass man das nicht mit Sicherheit verhindern kann, aber man kann es etwas besser machen. Ich schlage vor, dass Sie auch die Aufhebung der Registrierung auf dem 3rd-Party-Server verwalten, anstatt zu erwarten, dass der GCM-Service ausschließlich damit umgeht. Dazu stelle ich sicher, dass jedes neue Gerät eine eindeutige Geräte-ID zusammen mit der von GCM zugewiesenen ID (d. H. Dem Paar) sendet / speichert. Wenn das gleiche Gerät aus irgendeinem Grund eine neue ID zugewiesen bekommt, kann der Drittanbieterserver den Fall erkennen und die Verwendung von ID-A beenden - anstatt darauf zu warten, dass der GCM-Dienst Sie auf die Duplizierung aufmerksam macht eine doppelte Lieferung.

Warum mag ich diese Lösung nicht besonders? Mehrere Gründe:

  1. Für Instanzen, die bereits frei sind, gibt es keinen Migrationspfad - wir müssen annehmen, dass diese IDs gültig bleiben, bis wir etwas anderes entdecken können. Ich kann sie nicht zwingen, ihre GCM-IDs mit meinem 3rd-Party-Server neu zu registrieren, außer durch ein App-Update (das ich nicht erzwingen kann).
  2. Für Geräte, die tun ein App-Update durchlaufen, können sie ihre Geräte-ID und aktuelle GCM-ID an meinen 3rd-Party-Server übertragen, aber sie wissen es nicht alle IDs, die durch Deinstallations- / Neuinstallationszyklen verloren gegangen sein könnten. Es sind genau diese "verlorenen" IDs, die in der Zukunft Probleme verursachen können - aber nur einmal, wenn Sie das oben in diesem SO-Link beschriebene Service-Feedback verwenden.
  3. Das Ermitteln einer eindeutigen deviceId ist selbst problematisch. Googeln Sie einfach nach StackOverflow-Diskussionen über eindeutige Android-Geräte-IDs, um sie zu sehen ...
JCicchi 03.06.2015 21:39
quelle