2014-02-28 11 views
10

Ich sehe dieses Problem auf meinem Push-Benachrichtigungen-Server - verschiedene Android-Geräte (durch ihre IMEI identifiziert) erhalten die gleiche Registrierungs-ID von Google GCM-Service. Sollte die Registrierungs-ID nicht eindeutig sein? im Osten für die gleiche Anwendung oder GCM API Key?Android doppelte Registrierungs-ID für verschiedene Geräte

habe ich diesen Thread, aber es scheint nicht, es eine Antwort zu sein: Can two different devices have same GCM Registration ID?

Jede mögliche Hilfe würde viel

EDIT hier ist der entsprechende Code für die Registrierung geschätzt werden:

Intent intent = new Intent(
            "com.google.android.c2dm.intent.REGISTER"); 
        intent.setPackage("com.google.android.gsf"); 
        intent.putExtra("app", 
            PendingIntent.getBroadcast(context, 0, new Intent(), 0)); 

        intent.putExtra("sender", flatSenderIds); 
        context.startService(intent); 
+0

Sind beide Geräte virtuell, physisch oder eine Mischung? – nKn

+0

Alle Geräte sind physische reale Geräte – Orr

+1

Könnten Sie das Snippet, wo Sie sich registrieren, gegen GCM-Dienst und wie Sie die erhaltene ID testen? – nKn

Antwort

5

Manchmal ändert Google die Registrierungs-ID und Sie haben mehrere IDs zugeordnet. Der Server, der die Benachrichtigung sendet (Ihr Server), muss die Datenbank mit der neuen ID aktualisieren.

Für mehr Informationen zu diesem Dokument überprüfen:

http://developer.android.com/google/gcm/adv.html

sie sagt:

Es ist eine Canonical IDs

Auf der Server-Seite, solange die Anwendung Verhalten gut, alles sollte normal funktionieren. Wenn jedoch ein Fehler in der Anwendung mehrere Registrierungen für dasselbe Gerät auslöst, kann es schwierig sein, den Status " " auszugleichen und möglicherweise doppelte Nachrichten zu erhalten.

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 enthalten. 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.

+0

Danke - aber das ist nicht der Fall für mich. Ich sehe, dass völlig unterschiedliche Geräte die gleiche Registrierungs-ID von GCM erhalten, und ich habe überprüft, dass es kein serverseitiges Problem ist – Orr

+1

Das ist, was ich suchte.Vielen Dank für die klare Erklärung @M D. –

2

Nun, nach dem Hinzufügen Ihres Registrierungscodes kann ich sehen, dass Sie die alte Methode der Registrierung verwenden. Diese Methode wurde seit Mitte letzten Jahres abgeschafft. Es ist wahrscheinlich weniger zuverlässig als die neue Registrierungsmethode.

Sie sollten versuchen, sich über die Methode GoogleCloudMessaging.register der Google Play Services-Bibliothek anzumelden. Das ist der empfohlene Weg von Google. Siehe die offizielle Demo here.

+0

Danke Eran. Aber die Verwendung der Play Services Lib zwingt das Gerät, Google Play Services zu nutzen, und wenn wir die Bibliothek einem Entwickler geben, wird es ihn auch zwingen, das Projekt der Play Services Bibliothek in sein Projekt aufzunehmen ... Ich verstehe immer noch nicht warum Es ist akzeptabel, dass Google die gleichen Registrierungs-IDs für verschiedene Geräte bereitstellt. Event, wenn diese API veraltet ist, gibt es viele Apps, die es noch verwenden – Orr

5

Die einzige Idee, die mir in den Sinn kommt, ist, dass diese veraltete Methode dieselbe ID auf verschiedenen Geräten zuweisen wird, wenn der zusätzliche Wert für sender auf allen Geräten gleich ist.Das unterscheidet sich von der aktuellen Version, wo Sie nicht sagen, wer Sie sind, Sie senden nicht einmal eine Intent, rufen Sie einfach register() und Google bestimmt, wer Sie sind und welche ID Sie erhalten sollten.

Wenn Sie endlich diese neue Bibliothek verwenden, gibt es ein Beispiel-Snippet wie (innerhalb eines AsyncTask oder Thread) registrieren:

GoogleCloudMessaging gcm = null; 

try { 
    // Will be for the first time 
    if (gcm == null) 
    gcm = GoogleCloudMessaging.getInstance(your_context); 

    // Registration against the GCM service 
    String regid = gcm.register(YOUR_SENDER_ID_OBTAINED_FROM_YOUR_PROJECT); 

    // You'll need to send the registration info to your remote server 
    registerRemoteServer(regid); 

    Log.d("MyGCM", "Registered on GCM as " + regid); 
} 
catch (final IOException ex) { ex.printStackTrace(); } 
+0

nKn- hier verwenden Sie auch die Absender-ID in gcm.register (YOUR_SENDER_ID_OBTAINED_FROM_YOUR_PROJECT); denken Sie nicht, dass dies der Issus ist – Orr

Verwandte Themen