Ich arbeite an einem Android-Projekt, das gcm verwendet. Ich habe erfahren, dass, wenn wir die App vom Gerät deinstallieren und die meiste Zeit neu installiert wird, das Gerät eine neue Registrierungs-ID erhält. Wenn wir das alte nicht vom Anwendungsserver löschen und aktualisieren, werden die Nachrichten sowohl an die IDs als auch an die Antwort wird es zeigen, kanonische ID ist vorhanden.Meine Frage ist, an diesem Punkt wird Nachricht erfolgreich an das Gerät gesendet werden oder nicht?gcm kanonische ID sollte aktualisiert werden oder nicht
Antwort
Wenn Sie in der Antwort von Google eine kanonische Registrierungs-ID erhalten, wurde die Nachricht vom GCM-Server akzeptiert und der GCM-Server versucht, sie an das Gerät zu senden. Ob es tatsächlich an das Gerät gesendet wird, hängt davon ab, ob das Gerät verfügbar ist (d. H. Mit dem Internet verbunden ist). Wenn Ihr Server also eine GCM-Nachricht an die alte ID und die neue ID sendet, erhält das Gerät wahrscheinlich zwei Nachrichten.
Canonical IDs
Auf der Serverseite, solange die Anwendung gut verhält, sollte alles normal. Wenn jedoch ein Fehler in der Anwendung mehrere Registrierungen für das gleiche Gerät auslöst, kann es schwierig sein, Zustand abzugleichen und Sie möglicherweise mit doppelten Nachrichten enden.
GCM bietet eine Einrichtung namens "canonical registration IDs", mit der sich aus diesen Situationen problemlos wiederherstellen lässt. Eine kanonische Registrierungs-ID ist definiert als , um die ID der letzten von Ihrer Anwendung angeforderten Registrierung zu sein. Dies ist die ID, die der Server beim Senden von Nachrichten an das Gerät verwenden soll.
Wenn Sie später versuchen, eine Nachricht zu senden, eine andere Anmeldung ID verwenden, wird GCM die Anfrage wie gewohnt verarbeiten, aber es wird die kanonische Registrierungs-ID im registration_id Feld der Antwort umfassen. Stellen Sie sicher, dass die Registrierungs-ID, die in Ihrem Server gespeichert ist, durch diese kanonische ID ersetzt wird, da die verwendete ID schließlich nicht mehr funktioniert.
(Source)
Sie dieses Problem, indem die Zuweisung einer eindeutigen Kennung für jede Instanz der Anwendung überwinden. Wenn Sie diese Kennung im externen Speicher des Geräts speichern, wird sie beim Deinstallieren der App nicht gelöscht. Dann können Sie es wiederherstellen, wenn die App erneut installiert wird. Wenn Sie diese ID zusammen mit der Registrierungs-ID an Ihren Server senden, können Sie überprüfen, ob Ihr Server eine alte Registrierungs-ID für diese ID besitzt, und sie löschen.
@Eran Wir haben zwei Möglichkeiten entweder ältere Registrierungs-IDs zu entfernen oder mit Schlüssel und Position der kanonischen ID zu aktualisieren. Ich bevorzuge zu aktualisieren ... Sie können arbeiten Code von mir Ich habe hier beantwortet Steps to Update Canonical Ids
- 1. Get GCM kanonische Registrierungs-ID ohne eine Nachricht senden
- 2. GCM-Registrierungs-ID
- 3. Daten werden nicht aktualisiert
- 4. Android GCM Unicode-Zeichen werden nicht empfangen
- 5. Android mit Canonical ID GCM
- 6. Sollte die ID im Geschäftsobjekt schreibgeschützt sein oder nicht?
- 7. Das kanonische Fitnesse-Beispiel konnte nicht ausgeführt werden - java.lang.NoClassDefFoundError
- 8. Welcher kanonische Name ist besser? www oder nicht www?
- 9. Hibernate saveOrUpdate() versucht zu speichern, wenn es aktualisiert werden sollte
- 10. GCM FC/Absender-ID nicht gesetzt auf Konstruktor
- 11. Abrufen der GCM-Registrierungs-ID mit Firebase
- 12. Sublime Text 3 Seitenleiste wird nicht aktualisiert oder aktualisiert
- 13. RIA Services: Entität kann nicht eingefügt oder aktualisiert werden
- 14. Mungo aktualisiert Modell nicht nach ID
- 15. Verschachtelte Ressource konnte nicht aktualisiert werden
- 16. Ist eine Client-ID oder Server-ID in Android-Code für gcm-Benachrichtigung erforderlich?
- 17. Google GCM, Token vs Registrierungs-ID
- 18. So erhalten Sie Canonical ID von GCM
- 19. Sollte ich beitreten oder sollte ich UNION
- 20. MP3-Metadaten werden nicht aktualisiert
- 21. HashMap-Werte werden nicht aktualisiert
- 22. UITableView kann nicht aktualisiert werden
- 23. Bool-Variablen werden nicht aktualisiert
- 24. iOS CBPeripheriedienste werden nicht aktualisiert
- 25. Scipy kann nicht aktualisiert werden
- 26. Sollte ich Unterklasse NSManagedObject erstellen oder nicht?
- 27. Liste wird aktualisiert, wenn sie gelöscht werden sollte
- 28. Sollte Hadoop neu gestartet werden, wenn core-site.xml aktualisiert wird
- 29. zur Verbesserung der Leistung out.print sollte verwendet werden oder nicht?
- 30. Wie kanonische URL mit Django HttpResponseRedirect bereitgestellt werden?
Eran, es scheint, wie du bist die Person zu fragen, alles gcm-bezogen: Ich habe eine kleine Änderung an Ihrer Lösung durch die Speicherung der eindeutige ID (Benutzername) auf dem Server zusammen mit dem regid des Geräts. Korrigiere mich, wenn ich falsch liege, aber mir sollte es gut gehen, weil ich nur eine Regid pro Benutzer zulasse, und ich kann entsprechend aktualisieren. Dies setzt jedoch voraus, dass das Gerät * immer * die neueste (und gültige) Regid hat. Ist das sicher anzunehmen? – user1164937
2. Frage: Gibt es noch andere * Randfälle *, die ich beachten sollte, außer dass ich die regid des Benutzers mit der kanonischen ID aktualisiere, wenn eine solche vorhanden ist? Danke im Voraus. – user1164937
Ich vergaß zu erwähnen, dass ich genau den gleichen Prozess wie die Beispiel-gcm-App von Google verwende, um sich für das regid zu registrieren - wenn die sharedpreferences keine hat. (Ich entschuldige mich für den Spam) – user1164937