web-dev-qa-db-fra.com

Message Push étrange reçu au démarrage de l'application

Je reçois un message Push étrange capturé par mon service Push:

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

Cela a juste commencé hier et je ne peux pas vraiment savoir quel changement de code est à blâmer. Quelqu'un a-t-il déjà vu ce message et sait peut-être d'où vient ce message et pourquoi?

55
vkislicins

Votre application reçoit ce message car des données ont été restaurées à partir d'une sauvegarde. Comme la sauvegarde peut avoir inclus des jetons d'enregistrement, cette diffusion est envoyée à votre application pour obtenir de nouveaux jetons, car ceux qui sont sauvegardés ne fonctionnent pas.

Ceci est destiné aux nouveaux GCM APIs , et fera en sorte que la méthode onTokenRefresh () de votre implémentation InstanceIdListenerService soit appelée, où votre application doit à nouveau obtenir tous ses jetons.

Malheureusement, si vous écrivez votre propre BroadcastReceiver, ces messages seront inattendus et risquent de provoquer le blocage de votre application. La bonne chose à faire est de filtrer le champ "de" et, si vous voyez l'un de ces messages, de vous enregistrer à nouveau avec GCM car vos jetons risquent d'être invalides.

Si vous recevez ces messages en dehors d'une nouvelle installation dans laquelle les données de votre application sont en cours de restauration, publiez-le sur la liste de diffusion Android-gcm .

20
morepork

Consultez la documentation mise à jour de l'API GCM comme le suggère @morepork.

Pour les applications existantes qui étendent un récepteur WakefulBroadcast, Google recommande de migrer vers GCMReceiver et GcmListenerService. À émigrer:

Dans le manifeste de l'application, remplacez votre GcmBroadcastReceiver par "com.google.Android.gms.gcm.GcmReceiver" et remplacez la déclaration de service actuelle qui étend IntentService au nouveau GcmListenerService.

Supprimez l'implémentation BroadcastReceiver de votre code client

Refactoriser l'implémentation actuelle du service IntentService pour utiliser GcmListenerService

Pour plus de détails, voir l'exemple de manifeste et les exemples de code sur cette page.

De leur exemple de code , il est assez facile à suivre.

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);
    }
}

Ensuite, vous pouvez remplacer votre ancien code d’enregistrement par

Intent intent = new Intent(this, MyGcmRegistrationService.class);
startService(intent);
13
mpkuth

J'ai réalisé le même problème aujourd'hui. Tout d'abord, ce message doit provenir de Google lui-même (à partir de = google.com/iid), sinon l'attribut from serait l'identifiant de votre projet dans la console de développement Google (par exemple, 475832179747). Mais pour être sûr, j'ai arrêté notre serveur d'applications et j'ai quand même reçu le message.

Je le reçois toujours lorsque je m'inscris récemment sur le serveur Google Cloud Messaging. Ce n'est pas un gros problème car vous pouvez filtrer le message en fonction de l'action intentionnelle, mais j'aimerais vraiment en connaître le but.

7
rickul

Pour les applications existantes qui étendent un récepteur WakefulBroadcast, Google recommande de migrer vers GCMReceiver et GcmListenerService. À émigrer:

  • Dans le manifeste de l'application, remplacez votre GcmBroadcastReceiver par "com.google.Android.gms.gcm.GcmReceiver" et remplacez l'actuel déclaration de service qui étend IntentService au nouveau GcmListenerService
  • Supprimez l'implémentation BroadcastReceiver de votre code client
  • Refactorisez l'implémentation actuelle du service IntentService pour qu'elle utilise GcmListenerService. Pour plus de détails, voir l'exemple de manifeste.

il semble que Google ait divisé le GCMIntentService qui étendait IntentService pour gérer gcms en deux services, l’un étend GcmListenerService qui gérera les messages reçus et l’autre qui filtrera iid.InstanceID séparément pour filtrer la notification reçue pour la première installation, Guides Android

<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

2
nosaiba darwish

J'ai eu ce problème lors de la migration de GCM-> FCM avec la réception de l'élément wakelockid uniquement de:

  • console firebase
  • demande reproduite par facteur avec une demande comme celle-ci:

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

De plus, j'ai également copié tout le code de google quickstart firebase messaging . Tout devrait bien se passer. Cependant, après tous les tests, j'ai décidé de revérifier les versions de mes librairies. Je les ai donc incrémentés aux derniers chiffres. Depuis lors, j'ai commencé à recevoir des messages correctement.

La solution la plus rapide que je recommande de télécharger le projet à partir de GitHub et d’essayer si cela fonctionne pour vous. La prochaine étape serait de copier ce code dans votre projet. Si dans un projet tout fonctionne bien, vous avez au moins un point de départ/travail où commencer.

Il y a des rumeurs sur le studio Android qui est à l'origine de ce problème - mais ce n'est pas vrai. Je l'ai vérifié.

Il peut être vrai que vous puissiez utiliser le même vieux jeton (de gcm) et ne pas recevoir de messages, mais si vous aviez le même cas que moi, à savoir migrating, le jeton doit être actualisé et vous devez le gérer.

0
deadfish

la même chose m’arrive sur au moins une tablette Asus

probablement sur plusieurs appareils, mais je n'ai pas eu l'occasion de jeter un coup d'oeil

je suis à la recherche de chaînes particulières dans Intent.getExtras (). Le correctif était donc simple. S'ils ne sont pas présents, ignorez le tout.

quelles sont les chances qu'une personne de Google se présente et explique ce qui se passe?

0
user1126515