Das ist eine interessante Frage.
Google empfiehlt Ihnen, zum neuen Registrierungsprozess zu wechseln:
Eine Android-Anwendung, die auf einem mobilen Gerät ausgeführt wird, registriert sich, um Nachrichten zu empfangen, indem sie das GoogleCloudMessaging-Methodenregister (senderID ...) aufruft. Diese Methode registriert die Anwendung für GCM und gibt die Registrierungs-ID zurück. Dieser optimierte Ansatz ersetzt den vorherigen GCM-Registrierungsprozess.
Der Hinweis, der besagt, wird Google may periodically refresh the registration ID
nur auf der Seite angezeigt, auf der noch der alte Registrierungsprozess angezeigt wird. Daher ist dieser Hinweis möglicherweise nicht mehr relevant.
Wenn Sie sicher sein möchten, können Sie weiterhin den alten Registrierungsprozess verwenden. Oder Sie können den neuen Prozess verwenden, haben aber zusätzlich den Code, der die com.google.android.c2dm.intent.REGISTRATION
Absicht behandelt, um sicherzustellen, dass Sie abgesichert sind, wenn Google die Registrierungs-ID aktualisiert.
Trotzdem habe ich noch nie eine solche Aktualisierung erlebt, und selbst wenn sich die Registrierungs-ID geändert hat (normalerweise aufgrund des Sendens einer Benachrichtigung nach der Deinstallation der App und der anschließenden Neuinstallation), bleibt die alte Registrierungs-ID erhalten funktioniert (was zu einer kanonischen Registrierungs-ID führt, die in der Antwort von Google gesendet wurde), sodass kein Schaden angerichtet wurde.
EDIT (06.06.2013):
Google hat seine Demo-App geändert , um die neue Benutzeroberfläche zu verwenden. Sie aktualisieren die Registrierungs-ID, indem sie ein Ablaufdatum für den Wert festlegen, der lokal von der App beibehalten wird. Wenn die App gestartet wird, laden sie ihre lokal gespeicherte Registrierungs-ID. Wenn es "abgelaufen" ist (was in der Demo bedeutet, dass es vor über 7 Tagen von GCM empfangen wurde), rufen sie gcm.register(senderID)
erneut an.
Dies behandelt nicht das hypothetische Szenario, in dem eine Registrierungs-ID von Google für eine App aktualisiert wird, die seit langer Zeit nicht mehr gestartet wurde. In diesem Fall ist der App die Änderung nicht bekannt, ebenso wenig wie dem Server eines Drittanbieters.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mDisplay = (TextView) findViewById(R.id.display);
context = getApplicationContext();
regid = getRegistrationId(context);
if (regid.length() == 0) {
registerBackground();
}
gcm = GoogleCloudMessaging.getInstance(this);
}
private String getRegistrationId(Context context) {
final SharedPreferences prefs = getGCMPreferences(context);
String registrationId = prefs.getString(PROPERTY_REG_ID, "");
if (registrationId.length() == 0) {
Log.v(TAG, "Registration not found.");
return "";
}
int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
int currentVersion = getAppVersion(context);
if (registeredVersion != currentVersion || isRegistrationExpired()) {
Log.v(TAG, "App version changed or registration expired.");
return "";
}
return registrationId;
}
private boolean isRegistrationExpired() {
final SharedPreferences prefs = getGCMPreferences(context);
long expirationTime =
prefs.getLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, -1);
return System.currentTimeMillis() > expirationTime;
}
BEARBEITEN (14.08.2013):
Google hat seine Demo-App erneut geändert (vor zwei Tagen). Diesmal haben sie die Logik entfernt, nach der die Registrierungs-ID nach 7 Tagen abgelaufen ist. Jetzt aktualisieren sie die Registrierungs-ID nur, wenn eine neue Version der App installiert wurde.
EDIT (24.04.2014):
Der Vollständigkeit halber sind hier die Worte von Costin Manolache (von hier übernommen ), einem Google-Entwickler, der an der Entwicklung von GCM beteiligt ist, zu diesem Thema:
Die "regelmäßige" Aktualisierung hat nie stattgefunden, und die Aktualisierung der Registrierung ist nicht in der neuen GCM-Bibliothek enthalten.
Die einzige bekannte Ursache für die Änderung der Registrierungs-ID ist der alte Fehler, dass Apps automatisch abgemeldet werden, wenn sie während des Upgrades eine Nachricht erhalten. Bis dieser Fehler behoben ist, müssen Apps nach dem Upgrade noch register () aufrufen. Bisher kann sich die Registrierungs-ID in diesem Fall ändern. Wenn Sie unregister () explizit aufrufen, wird normalerweise auch die Registrierungs-ID geändert.
Der Vorschlag / die Problemumgehung besteht darin, eine eigene zufällige Kennung zu generieren, die beispielsweise als gemeinsame Präferenz gespeichert wird. Bei jedem App-Upgrade können Sie die Kennung und die möglicherweise neue Registrierungs-ID hochladen. Dies kann auch dazu beitragen, die Aktualisierungs- und Registrierungsänderungen auf der Serverseite zu verfolgen und zu debuggen.
Dies erklärt die aktuelle Implementierung der offiziellen GCM-Demo-Anwendung.
com.google.android.c2dm.intent.REGISTRATION
sollte niemals behandelt werden, wenn die GoogleCloudMessaging
Klasse zum Registrieren verwendet wird.
GCMBaseIntentService
wird weiterhin auf der Seite Verwenden der GCM-Hilfsbibliotheken erwähnt .Beim Lesen der neuen InstanceID-API habe ich weitere Informationen darüber gefunden, wann sich das Token ändern könnte:
Mehr Details:
Quellen:
https://developers.google.com/instance-id/
https://developers.google.com/instance-id/guides/android-implementation
quelle
Nachdem ich Tonnen von irreführenden Antworten im Internet, einschließlich SO, durchgesehen hatte, fand ich nur eine vollständige Antwort, wie in Erans Antwort und hier bemerkt :
Während die automatische Aktualisierung der Registrierung möglicherweise oder möglicherweise nie stattgefunden hat, beschreibt Google einen einfachen Algorithmus zur Behandlung der canocical_ids durch Analyse der erfolgreichen Antwort:
If the value of failure and canonical_ids is 0, it's not necessary to parse the remainder of the response. Otherwise, we recommend that you iterate through the results field and do the following for each object in that list: If message_id is set, check for registration_id: If registration_id is set, replace the original ID with the new value (canonical ID) in your server database. Note that the original ID is not part of the result, so you need to obtain it from the list of code>registration_ids passed in the request (using the same index). Otherwise, get the value of error: If it is Unavailable, you could retry to send it in another request. If it is NotRegistered, you should remove the registration ID from your server database because the application was uninstalled from the device or it does not have a broadcast receiver configured to receive com.google.android.c2dm.intent.RECEIVE intents. Otherwise, there is something wrong in the registration ID passed in the request; it is probably a non-recoverable error that will also require removing the registration from the server database. See Interpreting an error response for all possible error values.
Vom oben genannten Link.
quelle