J'implémente un serveur de notification Push avec GCM. J'envoie une demande de publication avec un ID d'expéditeur (clé d'application) que j'ai obtenu de Google API Console et un ID d'enregistrement que j'ai obtenu du service GCM.
Le JSON publié comprend un ID d'enregistrement. J'ai toujours la même réponse:
{
"multicast_id":8546528660791862014,
"success":0,
"failure":1,
"canonical_ids":0,
"results":[
{
"error":"MismatchSenderId"
}
]
}
Quel pourrait être le problème? Qu'est-ce que je fais mal?
Voir le message Stack Overflow Pourquoi est-ce que j'obtiens "MismatchSenderId" du côté serveur GCM?.
À partir de l'URL ci-dessus:
revérifiez l'ID de l'expéditeur et l'API_KEY, ils doivent correspondre, sinon vous obtiendrez cette erreur MismatchSenderId. Dans la console API Google, regardez l'URL de votre projet:
https://code.google.com/apis/console/#project:xxxxxxxxxxx
Le xxxxxxxxx est l'ID du projet, qui est l'ID de l'expéditeur.
Certaines personnes signalent des problèmes en utilisant le type de clés "Clé pour les applications serveur", mais réussissent à utiliser le type de clé de navigateur à la place. Personnellement, le type de clé de serveur fonctionne pour moi, mais essayez les deux, YMMV.
Veuillez désinstaller votre Android de l'appareil et réexécuter l'application .
Vous obtiendrez maintenant un nouvel ID d'enregistrement. Cela peut résoudre votre problème MismatchSenderId dans un cas spécifique (Parfois, cela se produit si vous modifiez/actualisez votre API clé, mais en utilisant toujours l'ancienne clé d'enregistrement). Dans mon cas, j'ai d'abord obtenu l'ID d'enregistrement pour mon appareil, puis j'ai changé ma clé API (sur le serveur Google GCM), puis j'ai eu l'erreur MismatchSenderId. Enfin, j'ai désinstallé mon Android de l'appareil et le problème a été résolu.
Connectez-vous à Google Cloud Console
Voir l'exemple ci-joint:
Vous devez utiliser le "Numéro de projet" (c'est-à-dire l'ID numérique) pour l'ID de l'expéditeur, et non l '"ID du projet"
Je copiais du code à partir d'un tutoriel mais j'ai oublié de changer le numéro de projet dans le code source. Il générait un ID pour le projet de l'auteur du didacticiel plutôt que pour le mien, alors vérifiez que vous modifiez votre code source sur l'application Android!
Cette erreur est sûre car vous avez spécifié un SenderID incorrect lorsque vous enregistrez votre appareil:
Voici un exemple de demande d'inscription (violoneux)
POST https://Android.clients.google.com/c2dm/register Hôte HTTP/1.1: Android.clients.google.com Connexion: keep-alive Longueur du contenu: 83 Autorisation: AidLogin 51734556544354357: 9087138434543543508 Type de contenu: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, comme Gecko) Chrome/39.0.2171.99 Safari/537.36 Accept-Encoding: gzip , dégonflez Accept-Language: en-US, en; q = 0.8, ar; q = 0.6, fr; q = 0.4
app = gpYOURAppHereloin & device = 5112132132137117 & sender = YourApplicationIDHere
Vous pouvez trouver votre SenderID par étapes ci-dessous
plus d'informations:
Vous devez vérifier la source de votre identifiant d'enregistrement, vous ne pouvez pas utiliser un identifiant d'enregistrement C2DM dans un message GCM. Du Doc de Google:
C2DM et GCM ne sont pas interopérables. Par exemple, vous ne pouvez pas publier de notifications de GCM vers des ID d'enregistrement C2DM, ni utiliser des ID d'enregistrement C2DM comme ID d'enregistrement GCM. À partir de votre application côté serveur, vous devez savoir si un ID d'enregistrement provient de C2DM ou GCM et utiliser le point de terminaison approprié.
Lorsque vous passez du C2DM au GCM, votre serveur doit savoir si un ID d'enregistrement donné contient un ancien expéditeur C2DM ou un nouveau numéro de projet GCM. C'est l'approche que nous recommandons: demandez à la nouvelle version de l'application (celle qui utilise GCM) d'envoyer un peu avec l'ID d'enregistrement. Ce bit indique à votre serveur que cet ID d'enregistrement est pour GCM. Si vous n'obtenez pas le bit supplémentaire, vous marquez l'ID d'enregistrement comme C2DM. Une fois que plus aucun ID d'enregistrement valide n'est marqué comme C2DM, vous pouvez terminer la migration.
Une autre chose à laquelle il faut faire attention est le SENDER_ID, le format de SENDER_ID est le numérique si vous utilisez InstanceID pour obtenir RegistrationID, comme
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
Le SENDER_ID n'a pas pu utiliser le nom du projet, veuillez utiliser https://developers.google.com/mobile/add pour obtenir la "clé API du serveur" et l '"ID de l'expéditeur".
Générez une clé API à partir de la console API. Utilisez la clé de l'application du navigateur dans le backend et utilisez l'ID du projet comme identifiant de l'expéditeur dans votre code client.
J'ai eu le même problème, mais j'ai fait une chose stupide stupide: j'avais plusieurs projets dans la console Google et j'ai généré l'ID d'enregistrement pour un numéro de projet qui appartient à un projet et j'ai essayé d'envoyer des notifications à une clé Api qui appartient à une autre projet. La première étape de cette erreur consiste à vérifier le projet avec lequel vous travaillez.
J'ai un problème similaire lorsque je testais l'exemple de code Google trouvé ici https://github.com/GoogleCloudPlatform/gradle-appengine-templates/tree/master/GcmEndpoints et ce que XYZ a dit a vraiment aidé moi résoudre ce problème.
J'ai pu envoyer les messages sur mon téléphone à partir de mon explorateur d'API de moteur d'application Google sous la méthode messaging.messagingEndpoint.sendMessage mais dans les journaux de la console du moteur d'application Google, il a toujours dit MismatchSenderId. L'erreur enregistrée alors clairement qu'il n'était pas censé être une erreur m'a mis sur écoute.
J'étais vraiment confus et voici comment j'ai réussi à résoudre ce problème:
Réessayez d'envoyer le message et cette fois, cela devrait fonctionner sans que l'erreur ne soit enregistrée dans les journaux de la console du moteur de l'application Google.
Notez que si votre identifiant d'expéditeur change, la méthode com.google.Android.gms.gcm.GoogleCloudMessaging.register()
des services Google Play continuera de renvoyer l'identifiant d'enregistrement d'origine, quel que soit le nouvel identifiant de l'expéditeur. Vous devez invoquer la méthode unregister () de la même classe pour que les services Google Play actualisent et effacent les précédentes valeurs mises en cache périmées.
Voir les informations sur l'API ici: com.google.Android.gms.gcm.GoogleCloudMessaging.register ()
Comme alternative, vous pouvez toujours supprimer les données de l'application ou désinstaller-réinstaller comme indiqué dans une réponse précédente, mais cela est loin d'être acceptable dans un environnement de production.
Si vous avez modifié les paramètres GCM et vos identifiants d'expéditeur, les applications doivent savoir qu'elles doivent se désinscrire et s'inscrire à nouveau dans GCM. Un moyen simple d'y parvenir est de pousser une nouvelle version sur le Play Store et de laisser les utilisateurs télécharger la mise à jour et demander à cette version de faire le travail à sa première exécution, bien que cela ne compte pas les applications qui, pour une raison quelconque, ne sont pas mises à jour.
En plus de cela, si vous stockez des identifiants d'enregistrement dans les préférences ou une base de données, n'oubliez pas de rafraîchir sa valeur lorsque l'application est mise à jour car les mises à jour peuvent impliquer la régénération des identifiants et il se peut que votre code et non GCM soit le celui qui met en cache à tort les identifiants précédents. Suivez les directives générales ici: Directives générales d'implémentation côté client