2015-05-27 3 views
55

Ich erhalte eine seltsame Push-Nachricht von meinem Push-Dienst erfasst starten:Weird-Push-Nachricht empfangen am app

Bundle[{CMD=RST_FULL, from=google.com/iid, android.support.content.wakelockid=1}] 

Gerade erst begonnen gestern geschehen, und ich kann nicht wirklich vor Ort für die Codeänderung schuld Dies. Hat jemand diese Nachricht schon einmal gesehen und weiß vielleicht wo er herkommt und warum?

+0

Können Sie bitte erarbeiten ... Ist dies die Log-Nachricht, die Sie bekommen? Verwenden Sie APIs oder Bibliotheken von Drittanbietern? – AniV

+0

Das obige Paket ist ein Kopieren/Einfügen vom Debugger - es ist ein Objekt innerhalb der Absicht, die ich mit meinem Empfänger erhalte. Ich bekomme es mit 'intent.getExtras()' erwartet einen Typ und eine Nachricht, anstatt die Karte oben zu bekommen. Ich verwende einige Drittanbieter-Bibliotheken wie Picasso und Okhttp, aber nichts zu obskures oder in diesem Bereich. Keine APIs von Drittanbietern außer Google (Analytics, Speicher, gcm) – vkislicins

+0

Auch scheint es, dass ich diese Nachricht nur beim ersten Start der App bekomme. Wenn Sie die Anwendung anhalten und die Daten löschen, wird die Nachricht nicht erneut angezeigt. – vkislicins

Antwort

20

Ihre App diese Nachricht wird immer, weil es hatte Daten r hat von einem Backup gespeichert. Da das Backup Registrierungs-Tokens enthalten hat, wird diese Broadcast-Nachricht an Ihre App gesendet, um neue Tokens zu erhalten, da die gesicherten nicht funktionieren.

Dies ist für die neue Version GCM APIs vorgesehen. Dadurch wird die onTokenRefresh() - Methode der InstanceIdListenerService-Implementierung aufgerufen, in der Ihre App alle Token erneut abrufen soll.

Wenn Sie Ihren eigenen BroadcastReceiver schreiben, sind diese Meldungen leider unerwartet und können zum Absturz Ihrer App führen. Es ist richtig, das Feld "Von" zu filtern. Wenn Sie eine dieser Meldungen sehen, können Sie sich erneut bei GCM registrieren, da Ihre Token möglicherweise ungültig sind.

Wenn Sie diese Nachrichten außerhalb der Situation einer Neuinstallation erhalten, bei der die Daten Ihrer App wiederhergestellt werden, senden Sie diese bitte an die Mailingliste android-gcm.

+0

Der Backup-Teil Ihrer Antwort ist nicht klar. Warum wird eine solche Benachrichtigung auch dann angezeigt, wenn das Anwendungsmanifest explizite Backups verbietet, indem Sie allowBackup auf false setzen? –

+0

@GiulioPiancastelli Laut den Kommentaren im [GCM-Beispielcode] (https://github.com/googlesamples/google-services/blob/master/android/gcm/app/src/main/java/gcm/play/android/ samples/com/gcmquickstart/MyInstanceIDListenerService.java), wird diese Token-Aktualisierungsbenachrichtigung 'aufgerufen, wenn InstanceID-Token aktualisiert wird. Dies kann auftreten, wenn die Sicherheit des vorherigen Tokens beeinträchtigt wurde. – mpkuth

+0

@mpkuth Entschuldigung, ich sehe nicht, wie die kompromittierte Sicherheit möglicherweise etwas mit dem von mir gewünschten Wiederherstellungsdaten-aus-einem-Backup-Anwendungsfall zu tun haben könnte diskutieren. –

7

Ich realisierte das gleiche Problem heute. Erstens muss diese Nachricht von Google selbst stammen (from = google.com/iid), andernfalls wäre das from-Attribut die ID Ihres Projekts in der Google Developer Console (z. B. 475832179747). Aber um sicher zu sein, habe ich unseren Anwendungsserver heruntergefahren, und ich habe immer noch die Nachricht erhalten.

Ich erhalte es immer, wenn ich mich neu beim Google Cloud Messaging Server anmelde. Es ist kein großes Problem, weil Sie die Nachricht durch die Absichts-Aktion filtern können, aber ich würde wirklich gerne den Zweck davon wissen.

0

gleiche passiert mir auf mindestens ein Asus Tablet

auf mehr Geräten wahrscheinlich, aber ich habe keine Chance zu werfen Sie einen Blick

ich suche nach einigen bestimmten Strings in Intent hatte .getExtras(), so dass die Fehlerbehebung einfach war, wenn sie nicht vorhanden sind, dann ignoriere die ganze Sache.

Wie hoch ist die Wahrscheinlichkeit, dass jemand von Google auftaucht und erklärt, was vor sich geht?

+1

Wie hoch ist die Wahrscheinlichkeit, dass jemand von Google auftaucht und erklärt, was vor sich geht? - Das wäre ziemlich gut ... – vkislicins

2

Für bestehende Anwendungen, die eine WakefulBroadcastReceiver erweitern, Google empfiehlt zu GCMReceiver und GcmListenerService migrieren. Um Migrate:

  • Im App-Manifest, ersetzen Sie Ihre GcmBroadcastReceiver mit "com.google.android.gms.gcm.GcmReceiver", und ersetzen Sie die aktuelle Service Erklärung, dass IntentService auf den neuen GcmListenerService erstreckt
  • entfernen Sie die BroadcastReceiver Implementierung von Ihrem Client-Code
  • Umgestalten der aktuelle IntentService Service-Implementierung GcmListenerService Einzelheiten zu verwenden, siehe das Beispiel manifestieren.

es scheint Google die GCMIntentService aufgespalten, die IntentService verlängert GCMS zu zwei Dienste zu handhaben, eine GcmListenerService erstreckt, die empfangenen Nachrichten behandelt und andere, dass Filter iid.InstanceID separat heraus filtern, die Meldung für die erste Installation empfangen, dies von neuen gcm ist android Führer

<service 
    android:name="com.example.MyGcmListenerService" 
    android:exported="false" > 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
    </intent-filter> 
</service> 
<service 
    android:name="com.example.MyInstanceIDListenerService" 
    android:exported="false"> 
    <intent-filter> 
     <action android:name="com.google.android.gms.iid.InstanceID"/> 
    </intent-filter> 
</service> 

https://developers.google.com/cloud-messaging/android/client

13

Siehe die aktualisierte GCM API Docs wie @morepork schlägt vor.

Für bestehende Anwendungen, die eine WakefulBroadcastReceiver erweitern, Google empfiehlt zu GCMReceiver und GcmListenerService migrieren. Um Migrate:

Im App-Manifest, ersetzen Sie Ihre GcmBroadcastReceiver mit "com.google.android.gms.gcm.GcmReceiver", und ersetzen Sie die aktuellen Service-Erklärung, die IntentService zum neuen GcmListenerService

entfernen die sich BroadcastReceiver Implementierung von Ihrem Client-Code

Umgestalten der aktuelle IntentService Service-Implementierung GcmListenerService

Einzelheiten zu verwenden, siehe das Beispiel manifestiert und Code-Beispiele auf dieser Seite.

Von ihrem sample code ist es ziemlich einfach zu folgen.

AndroidManifest.xml

<receiver 
    android:exported="true" 
    android:name="com.google.android.gms.gcm.GcmReceiver" 
    android:permission="com.google.android.c2dm.permission.SEND"> 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE"/> 
     <category android:name="com.example.client"/> 
    </intent-filter> 
</receiver> 

<service 
    android:name=".MyGcmListenerService" 
    android:exported="false"> 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE"/> 
    </intent-filter> 
</service> 

<service 
    android:name=".MyInstanceIdListenerService" 
    android:exported="false"> 
    <intent-filter> 
     <action android:name="com.google.android.gms.iid.InstanceID"/> 
    </intent-filter> 
</service> 

<service 
    android:name=".MyGcmRegistrationService" 
    android:exported="false"> 
</service> 

MyGcmListenerService.java

public class MyGcmListenerService extends GcmListenerService { 
    @Override 
    public void onMessageReceived(String from, Bundle data) { 
     final String message = data.getString("message"); 
     makeNotification(message); 
    } 
} 

MyGcmRegistrationService.java

public class MyGcmRegistrationService extends IntentService { 
    private static final String TAG = "MyRegistrationService"; 
    private static final String GCM_SENDER_ID = "XXXXXXXXXXXX"; 
    private static final String[] TOPICS = {"global"}; 

    public MyGcmRegistrationService() { 
     super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     try { 
      synchronized (TAG) { 
       InstanceID instanceID = InstanceID.getInstance(this); 
       String token = instanceID.getToken(GCM_SENDER_ID, 
         GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 
       sendTokenToServer(token); 
       subscribeTopics(token); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void subscribeTopics(String token) throws IOException { 
     for (String topic : TOPICS) { 
      GcmPubSub pubSub = GcmPubSub.getInstance(this); 
      pubSub.subscribe(token, "/topics/" + topic, null); 
     } 
    } 
} 

MyInstanceIdListenerService.java

public class MyInstanceIdListenerService extends InstanceIDListenerService { 
    public void onTokenRefresh() { 
     Intent intent = new Intent(this, MyGcmRegistrationService.class); 
     startService(intent); 
    } 
} 

Dann können Sie Ihre alten Registrierungscode mit nur ersetzen

Intent intent = new Intent(this, MyGcmRegistrationService.class); 
startService(intent); 
+0

danke Mann !! Ich habe überall danach gesucht! – goonerDroid

+0

Gute Antwort, Kumpel! –

+0

Ich bekomme 'INSTANCE_ID_SCOPE kann nicht aufgelöst werden oder ist kein Feld' und' die Methode sendTokenToServer (String) ist undefiniert ... '. –

0

Ich hatte dieses Problem bei der Migration GCM-> FCM mit Empfang nur wakelockid Element aus:

  • Feuerbasis Konsole
  • reproduziert Anfrage per Postbote mit folgender Anfrage:

{ "to": "<your token from FirebaseInstanceId.getInstance().getToken()>", "notification": { "body": "Hello", "title": "This is test message." } }

Auch ich kopierte auch alle Code von Google quickstart firebase messaging. Alles sollte in Ordnung sein. Nach all den Tests habe ich mich jedoch entschieden, meine grandle libs Versionen zu überprüfen. Also habe ich sie auf die neuesten Zahlen erhöht. Seitdem habe ich richtig Nachrichten empfangen.

Die schnellste Lösung, die ich empfehlen würde, ein Projekt von GitHub herunterzuladen und zu versuchen, ob dies für Sie funktioniert. Der nächste Schritt wäre, diesen Code in Ihr Projekt zu kopieren. Wenn in einem Projekt alles in Ordnung ist, haben Sie mindestens einen Stand-/Arbeitspunkt, an dem Sie anfangen können.

Es gibt Gerüchte über Android-Studio verursacht dieses Problem - aber es ist nicht wahr. Ich habe nachgeschaut.

Es kann wahr sein, dass Sie das gleiche alte Token (von gcm) verwenden konnten und keine Nachrichten erhielten, aber wenn Sie den gleichen Fall wie ich hatten, der migrating ist, dann sollte token auf neue aktualisiert werden und Sie sollten damit umgehen ..