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?
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 .
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);
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.
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
J'ai eu ce problème lors de la migration de GCM-> FCM avec la réception de l'élément wakelockid
uniquement de:
{
"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.
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?