Android GCM und mehrere Token

Ich melde mich in GCM mit GoogleCloudMessaging.getInstance (Kontext); Und speichern Sie das Token auf dem Gerät. Dann schick es an den Server und es ist mit dem Benutzerkonto verbunden. Wenn ich meine App deinstalliere, ohne mich abzumelden und neu zu installieren und mich mit einem anderen Benutzer anzumelden, bekomme ich ein neues Token und schicke es an den Server. Und wenn es drückt, zum ersten Benutzer gesendet zu werden, sehe ich sie, wenn ich mich mit dem zweiten Benutzer angemeldet habe.

Warum schickt mir GCM verschiedene Token und wie kann ich damit umgehen?

  • Wie benutzt man Espresso UI Testing für React Native?
  • Wie kann man die Checkbox-Größe in mobilen oder Tablet-Browser-basierten Webseiten erhöhen?
  • CRITICAL_STRUCTURE_CORRUPTION BSOD Windows 8.1 mit Intel HAXM Android Emulator installiert
  • Eclipse-Debugger stoppt von selbst ohne irgendwelche werfbar
  • Ich bekomme listView.getChildCount (), ist nach der Einstellung des Arrayadapters 0?
  • Anzeigen von Warnungen in Activity.onCreate (..)
  • Erfrischung eines Spinners
  • Was ist der Unterschied zwischen einem Dialog, der in Android entlassen oder abgebrochen wird?
  • Welche Methode wird genannt, sobald die Aktivität vollständig ausgelegt und bereit für Benutzerinteraktion ist?
  • Android: Farbe der Ratingbar zu golden ändern
  • Android, Speichern und Laden einer Bitmap im Cache aus verschiedenen Aktivitäten
  • Debugger-Trennung in Android Studio beim Debuggen eines Home-Screen-Widgets
  • 5 Solutions collect form web for “Android GCM und mehrere Token”

    Willkommen in der wunderbaren Welt der doppelten Nachrichten von Google Cloud Messaging . Wenn dies geschieht, ermöglicht die GCM Engine die Canonical IDs , sie zu lösen. Dies könnte passieren, weil Sie mit mehreren IDs für das gleiche Gerät registriert haben oder weil der GCM Server den unregister() GCM nicht erhalten hat, wenn die App deinstalliert wurde. Mit kanonischen IDs setzen Sie Ihre ID als die letzte Registrierung, die Sie gemacht haben.

    Nach der GCM reference dazu:

    Kanonische IDs

    Auf der Serverseite, solange sich die Anwendung gut verhält, sollte alles normal funktionieren. Allerdings, wenn ein Fehler in der Anwendung löst mehrere Anmeldungen für das gleiche Gerät, kann es schwer sein, Staat zu versöhnen und Sie könnten am Ende mit doppelten Nachrichten.

    GCM bietet eine Einrichtung namens "kanonische Registrierungs-IDs", um sich leicht von diesen Situationen zu erholen. Eine kanonische Registrierungs-ID ist definiert als die ID der letzten Anmeldung, die von Ihrer Bewerbung angefordert wird. Dies ist die ID, die der Server beim Senden von Nachrichten an das Gerät verwenden soll.

    Wenn Sie später versuchen, eine Nachricht mit einer anderen Registrierungs-ID zu senden, wird GCM die Anforderung wie gewohnt verarbeiten, aber sie enthält die kanonische Registrierungs-ID im Feld registration_id der Antwort. Achten Sie darauf, die auf Ihrem Server gespeicherte Registrierungs-ID durch diese kanonische ID zu ersetzen, da die ID, die Sie verwenden, nicht mehr funktioniert.

    Mehr Infos hier .

    Auch gibt es einen praktischen Fall, wie es weiterzukommen ist, könnte es hilfreich sein:

    • Kanonische Registrierungs-ID und Nachrichten-ID-Format

    Ich habe Registrierungs-ID-Änderungen bei der Deinstallation der Anwendung erlebt und versuchte, Nachrichten an die App zu senden, während sie deinstalliert wurde (bis ich einen NotRegistered Fehler NotRegistered ) und dann erneut installieren.

    Costin Manolache von Google schlägt vor , Registrierungs-ID-Änderungen auf diese Weise zu behandeln:

    Der Vorschlag / Workaround ist es, Ihre eigene zufällige Kennung zu generieren, die als gemeinsame Vorliebe gespeichert wird. Bei jedem App-Upgrade können Sie den Bezeichner und die potenziell neue Registrierungs-ID hochladen. Dies kann auch dazu beitragen, die Upgrade- und Registrierungsänderungen auf Server-Seite zu verfolgen und zu debuggen.

    Natürlich funktioniert das nur, wenn die App installiert bleibt (da gemeinsame Einstellungen mit der App gelöscht werden). Wenn das Gerät jedoch über einen externen Speicher verfügt, können Sie dort Ihren Bezeichner speichern und wenn die App erneut installiert wird, laden Sie den gespeicherten Bezeichner aus dem externen Speicher. Auf diese Weise kennen Sie die neue Registrierungs-ID und die alte Registrierungs-ID gehören zu demselben Gerät.

    Darüber hinaus sollten Sie kanonische Registrierungs-ID-Antworten von Google in Ihrem Server behandeln, wie in der anderen Antwort erwähnt.

    Sie können die Android-Geräte-ID zusammen mit der Registrierungs-ID senden. Android-Geräte-ID ist eindeutig und bleibt gleich bei der App-Deinstallation Neuinstallation und nur Änderungen, wenn das Gerät werkseitig zurückgesetzt wird.

    Beispiel: Wie bekomme ich eine eindeutige Geräte-Hardware-ID in Android?

    Das Senden der Push-Benachrichtigung an mehrere Geräte ist gleich wie wir an das jeweilige Gerät senden. Speichern Sie einfach das Registrierungs-Token aller registrierten Geräte auf Ihrem Server. Und wenn ich die Push-Benachrichtigung mit curl anrufe (ich nehme an, du benutzt PHP als Serverseite) Sende die Registrierungs-ID in ein Array. Dies ist ein Beispielcode

     <?php //Define your GCM server key here define('API_ACCESS_KEY', 'your server api key'); //Function to send push notification to all function sendToAll($message) { $db = new DbOperation(); $tokens = $db->getAllToken(); $regTokens = array(); while($row = $tokens->fetch_assoc()){ array_push($regTokens,$row['token']); } sendNotification($regTokens,$message); } //function to send push notification to an individual function sendToOne($email,$message){ $db = new DbOperation(); $token = $db->getIndividualToken($email); sendNotification(array($token),$message); } //This function will actually send the notification function sendNotification($registrationIds, $message) { $msg = array ( 'message' => $message, 'title' => 'Android Push Notification using Google Cloud Messaging', 'subtitle' => 'www.simplifiedcoding.net', 'tickerText' => 'Ticker text here...Ticker text here...Ticker text here', 'vibrate' => 1, 'sound' => 1, 'largeIcon' => 'large_icon', 'smallIcon' => 'small_icon' ); $fields = array ( 'registration_ids' => $registrationIds, 'data' => $msg ); $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://android.googleapis.com/gcm/send'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); $result = curl_exec($ch); curl_close($ch); $res = json_decode($result); $flag = $res->success; if($flag >= 1){ header('Location: index.php?success'); }else{ header('Location: index.php?failure'); } } 

    Im obigen Code holen wir das Registrierungs-Token aus dem mysql-Tisch. Um an alle Geräte zu senden, brauchen wir alle Token. Und um ein einzelnes Gerät zu senden, brauchen wir nur dieses Gerät.

    Quelle: Google Cloud Messaging Beispiel

    Zuerst, wenn Sie die Benachrichtigung senden, senden Sie die Benutzer-ID mit und fragen Sie, ob id in sharedpreference == comming oder no

    Wenn du Benachrichtigungen an alle Benutzer sendest und vielleicht jemand bekommst, bekomme 2 Benachrichtigungen, solange er nur das machen soll

    Erstellen Sie eine Datei auf Ihrem Server und mit einer beliebigen Nummer sagen 0 dann, wenn Sie Benachrichtigung senden möchten, senden Sie diese numebr mit ihm dann fügen Sie eine zu dieser Nummer ++ neue Nummer in der nächsten Benachrichtigung gleich mit jedem neuen zu sein

    In der android-Anwendung addiere Variable und lass diese Variable = die Comming-Variable vom Server nach dem Hinzufügen der Benachrichtigung, aber du musst fragen, if(number_in_your_service!=server_number) // Benachrichtigung hinzufügen

    Eine beliebige Anzahl von Benachrichtigungen, die Sie senden, wird nur noch angezeigt

     public class GcmIntentService extends IntentService { public static int openintent; public static final int NOTIFICATION_ID = 1; private static final String TAG = "GcmIntentService"; private static String number_in_your_service="somethingneversend"; NotificationCompat.Builder builder; public GcmIntentService() { super("GcmIntentService"); } @Override protected void onHandleIntent(Intent intent) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); String messageType = gcm.getMessageType(intent); if (!extras.isEmpty()) { // has effect of unparcelling Bundle if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { // If it's a regular GCM message, do some work. } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { // This loop represents the service doing some work. for (int i = 0; i < 5; i++) { Log.i(TAG, "Working... " + (i + 1) + "/5 @ " + SystemClock.elapsedRealtime()); try { Thread.sleep(100); } catch (InterruptedException e) { } } Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime()); // Post notification of received message. sendNotification(extras); Log.i(TAG, "Received: " + extras.toString()); } } // Release the wake lock provided by the WakefulBroadcastReceiver. GcmBroadcastReceiver.completeWakefulIntent(intent); } private void sendNotification(Bundle extras) { if((extras.getString("server_number")).equals(number_in_your_service)) { Intent intent = new Intent(this, Main_Page_G.class); intent.putExtra("frame",100); intent.putExtra("bundle",extras); final PendingIntent contentIntent = PendingIntent.getActivity(this, 120, intent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationManager mNotificationManager; NotificationCompat.Builder mBuilder = new NotificationCompat.Builder( GcmIntentService.this).setContentTitle("name") .setContentText("content") .setDefaults(Notification.DEFAULT_SOUND) .setContentInfo("Test") .setSmallIcon(R.drawable.rehablogo2) .setAutoCancel(true); mBuilder.setContentIntent(contentIntent); mNotificationManager = (NotificationManager) GcmIntentService.this .getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(id, mBuilder.build()); id=Integer.parseInt(extras.getString("id")); } } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.