Firebase Nuage de notification de Messagerie à partir de Java au lieu de Firebase Console
Je suis nouveau sur Firebase et je suis en cours d'exécution dans des erreurs telles que l'incompatibilité de l'id de l'expéditeur et de l'Erreur d'Authentification avec l'état HTTP 401 lorsque mon application Java essaie d'envoyer une notification ou d'un message en utilisant le client de Firebase jeton. Notez que l'utilisation de Firebase Console, je suis en mesure d'envoyer le message au client.
Pour l'application cliente, je n'ai suivantes:
- Cloné Firebase
messaging
de démarrage rapide application à partir d'ici - https://github.com/firebase/quickstart-android/tree/master/messaging -- qui est déjà configuré avec Firebase dépendances et ces. Chargé de la cloné application dansAndroid Studio
. - À l'aide de Firebase Console, créé un nouveau projet appelé
My Notification Client
et ajout d'une application à l'aide decom.google.firebase.quickstart.fcm
que le nom du package de l'application Android. - Téléchargé
google-services.json
fichier pour l'appli Android, ajouté au projet nouvellement créé et copié dans lemessaging/app/
dossier et synchronisés avec le Grade de fichiers à partir de l'intérieur deAndroid Studio
. - Créé un émulateur et a couru de l'application à partir de l'intérieur de
Android Studio
. Lorsque l'application a été chargé dans l'émulateur, cliqué sur leLog Token
bouton pour capturer le client Firebase jeton dans laAndroid Monitor
ongletAndroid Studio
. - À l'aide de Firebase Console, a sélectionné le projet nouvellement créé
My Notification Client
, cliqué sur leNotifications
lien dans le volet gauche, et a envoyé une notification à l'appareil par le collage de la Firebase jeton capturée à l'étape précédente.
Cela a très bien fonctionné! La prochaine étape était pour une simple application Java (qui allait devenir un serveur de notification) pour envoyer la notification au client, au lieu d'utiliser Firebase Console.
Pour ce faire, j'ai suivi les étapes décrites ici -- https://firebase.google.com/docs/server/setup#prerequisites. Plus précisément, ce sont les étapes que j'ai effectuées:
- Créé un nouveau projet appelé
My Notification Server
dans Firebase Console. - À l'aide de
Settings > Permissions
dans Firebase Console, a créé un nouveau compte de service et de télécharger laserviceAccountCredentials.json
fichier. - Créé un nouveau projet maven dans Eclipse et ajouté les dépendances suivantes dans pom.xml:
<dependency>
<groupId>com.google.gcm</groupId>
<artifactId>gcm-server</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-server-sdk</artifactId>
<version>3.0.0</version>
</dependency>
-
Ensuite, j'ai étendu
com.google.android.gcm.sender.Sender
pour créerFCMSender
et remplacer méthode protégéegetConnection(String url)
à utiliser la nouvelle FCM extrémité comme illustré ci-dessous:class FCMSender extends Sender { public FCMSender(String key) { super(key); } @Override protected HttpURLConnection getConnection(String url) throws IOException { String fcmUrl = "https://fcm.googleapis.com/fcm/send"; return (HttpURLConnection) new URL(fcmUrl).openConnection(); } }
-
La
main()
méthode de mon application Java ressemble à ceci:public static void main(String[] args) { //Obtain serverKey from Project Settings -> Cloud Messaging tab //for "My Notification Client" project in Firebase Console. String serverKey = <get_server_key_from_firebase_console>; Thread t = new Thread() { public void run(){ try { Sender sender = new FCMSender(serverKey); Message message = new Message.Builder() .collapseKey("message") .timeToLive(3) .delayWhileIdle(true) .addData("message", "Notification from Java application"); .build(); //Use the same token(or registration id) that was earlier //used to send the message to the client directly from //Firebase Console's Notification tab. Result result = sender.send(message, "APA91bFfIFjSCcSiJ111rbmkpnMkZY-Ej4RCpdBZFZN_mYgfHwFlx-M1UXS5FqDBcN8x1efrS2md8L9K_E9N21qB-PIHUqQwmF4p7Y3U-86nCGH7KNkZNjjz_P_qjcTR0TOrwXMh33vp", 1); System.out.println("Result: " + result.toString()); } catch (Exception e) { e.printStackTrace(); } }; t.start; try { t.join(); } catch (InterruptedException iex) { iex.printStackTrace(); } }
Quand je lance l'application Java, je reçois MismatchSenderId
erreur. J'ai essayé de dépannage à l'aide de curl
comme indiqué ci-dessous mais j'ai reçu le même message d'erreur:
$ skey=<obtained_from_project_settings_cloud_messaging_tab_in_firebase_console>
$ curl -X POST --header "Authorization: key=$skey" \
--Header "Content-Type: application/json" \
https://fcm.googleapis.com/fcm/send \
-d "{\"to\":\"APA91bFfIFjSCcSiJ111rbmkpnMkZY-Ej4RCpdBZFZN_mYgfHwFlx-M1UXS5FqDBcN8x1efrS2md8L9K_E9N21qB-PIHUqQwmF4p7Y3U-86nCGH7KNkZNjjz_P_qjcTR0TOrwXMh33vp\",\"data\":{\"message\":\"Yellow\"}}"
{"multicast_id":7391851081942579857,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}
Au lieu d'utiliser le Server Key
répertoriés sur Project Settings > Cloud Messaging
onglet pour My Notification Server
projet de Firebase de la Console, j'ai essayé d'utiliser le Project Number
mais qui a provoqué InvalidRequestException: HTTP Status Code: 401
.
Firebase la documentation des codes d'erreur dit ceci à propos de MismatchSenderId
:
Incompatibles Expéditeur 200 +
error:MismatchSenderId
Un enregistrement jeton est lié à un certain groupe d'expéditeurs. Lorsqu'un client de l'application enregistre pour la FCM, elle doit préciser les expéditeurs sont autorisés à envoyer des messages. Vous devez utiliser l'une de ces Id de l'expéditeur lors de l'envoi de messages à l'application cliente. Si vous passez à un autre expéditeur, l'enregistrement des jetons de ne pas travailler.
Je n'arrivais pas à savoir où/comment dans Firebase de la Console, on peut configurer l'application Android(qui a été aded à la My Notification Client
projet) pour être en mesure de recevoir des messages.
Toute aide serait appréciée!
- Vous pouvez vérifier cette réponse stackoverflow.com/a/51172021/3073945
Vous devez vous connecter pour publier un commentaire.
J'ai été en cours d'exécution dans la même question. Le problème était dans la ligne:
Cette valeur doit venir de l'application Android du projet; dans ce cas, il serait "Ma Notification Client" et non pas "Mon Serveur de Notification".
Moi aussi, j'ai récemment commencé à utiliser de Firebase, avec aucune expérience préalable dans Google Cloud Messaging. Autant que je sache, il n'y a pas côté serveur SDK pour Firebase Messagerie en Nuage, actuellement.
Pour envoyer des notifications/messages à partir de votre Application Serveur à votre Client Mobile, vous avez besoin pour mettre en œuvre votre propre HTTP et/ou XMPP méthodes. Voir https://firebase.google.com/docs/cloud-messaging/
Mon code de test, à l'aide de HTTP:
remarque: http client et json ont été fournis par vertx (http://vertx.io/), mais j'espère que le code indique ce qui est assez clair, donc vous pouvez utiliser ce que vous voulez.
J'ai écrit un FCMHelper Classe, qui fonctionne très bien et est simple à utiliser.
Voir ici https://github.com/MOSDEV82/fcmhelper
J'ai besoin d'envoyer de la FCM de notification à partir de mon application java EE et j'ai trouvé cette très utile. Peut sauver quelqu'un certain temps.
...Le dépôt github est une bibliothèque d'interface pour Firebase Messagerie en Nuage (FCM) API (NB//je ne suis pas l'auteur). J'ai donc suivi les instructions dans le fichier readme: ajouté le fichier jar une dépendance à mon projet et qui pourrait simplement appeler la bibliothèque de méthodes avec les paramètres correspondants.
par exemple
Pushraven.setKey(my_key);
pour configurer votre serveur de clés etde construire une notification. Les instructions de la mise en pension sont à peu près claire et utile.
Pushraven.setKey(my_key);
pour configurer votre serveur de clés etNotification raven = new Notification(); raven.title("MyTitle") .text("Hello World!") .color("#ff0000") .to(client_key);
de construire une notification. Les instructions de la mise en pension sont à peu près claire et utile.Sur:
Vous devez obtenir les clés de votre application android.
Et merci à vous, j'ai eu du mal à construire un service pour envoyer/recevoir des notifications de l'application. Vu votre question, a essayé d'obtenir la droite, utilisées pour la construction de la mine. Espérons que cela vous aidera 🙂
J'ai eu le exactement le même problème, et même vous servir de votre code comme un test pour vérifier s'il y avait quelque chose de mal avec la mienne. Il s'avère que nos deux codes de droit. Le problème est exactement comme décrit sur Firebase docs:
"Incompatibles Expéditeur 200 + erreur:MismatchSenderId Un enregistrement jeton est
lié à un certain groupe d'expéditeurs. Lorsqu'un client de l'application enregistre pour la FCM, c'
doit spécifier les expéditeurs sont autorisés à envoyer des messages. Vous devez utiliser un
de ces Id de l'expéditeur lors de l'envoi de messages à l'application cliente. Si vous passez
d'un autre expéditeur, l'enregistrement des jetons de ne pas travailler."
Problème est, ce n'est pas clair (au moins n'était pas pour moi).
Alors, voici ce que vous avez besoin: Sur votre application Android, vous aurez besoin de recevoir l'Firebase clé pour l'appareil . Ce n'est pas la même que vous avez utilisé pour le Google Cloud Message, et donc il y a le problème.
Il suffit de créer cette classe sur votre projet Android:
public class NotificacaoRegistro s'étend FirebaseInstanceIdService {
static private String TAG = "NOTIFICACAOREGISTRO";
}
N'oubliez pas de faire les modifications nécessaires sur votre AndroidManifest
Si vous avez juste besoin le code (pour le débogage, par exemple), vous pouvez simplement appeler sur votre MainActivity, dans votre méthode OnCreate
Chaîne refreshedToken = FirebaseInstanceId.getInstance().getToken();
Mais son meilleur, l'ofc si vous en occuper correctement.
De cette façon, vous obtiendrez la clé correcte de cet appareil. Ensuite, sur votre application Java code
et vous êtes tous ensemble 🙂
Espère que cette aide, et désolé pour le retard 🙂
acclamations
Utiliser cet envoi de notifications push à partir de java.
Framework Spring
Par rapport à d'autres projets, il y a juste 3 classes avec un minimum de dépendances.
https://github.com/AndreiD/testingpushnotifications
N'oubliez pas de remplacer le SERVER_API_KEY et la Client_Token.