Notification de messagerie Cloud Firebase depuis Java au lieu de la Console Firebase
Je ne suis pas habitué à Firebase et je rencontre des erreurs telles que l'erreur d'identification de l'expéditeur et L'erreur D'authentification avec le statut HTTP 401 lorsque mon application Java essaie d'envoyer une notification/un message en utilisant le jeton Firebase du client. Notez qu'en utilisant la Console Firebase, je suis capable d'envoyer le message au client.
Pour l'application cliente, j'ai fait le code suivant:
- Cloné Firebase
messaging
démarrage rapide de l'app à partir d'ici -- https://github.com/firebase/quickstart-android/tree/master/messaging -- qui est déjà configuré avec des dépendances Firebase et autres. Chargé de la cloné application dansAndroid Studio
. - en utilisant la Console Firebase, a créé un nouveau projet appelé
My Notification Client
et ajouté une application en utilisantcom.google.firebase.quickstart.fcm
comme le nom du paquet de L'application Android. - Téléchargé
google-services.json
le fichier de l'application Android ajouté au projet nouvellement créé et copié dans lemessaging/app/
dossier et synchronisés avec la Nuance fichiers dansAndroid Studio
. - créé un émulateur et lancé l'application de l'intérieur de
Android Studio
. Lorsque l'application a été chargé dans l'émulateur, clique sur leLog Token
bouton pour capturer le jeton Firebase du client dans leAndroid Monitor
dans l'ongletAndroid Studio
. - à L'aide de la Console Firebase, sélectionné le nouveau projet
My Notification Client
, cliqué sur leNotifications
lien à partir du volet de gauche, et envoyé une notification à l'appareil en collant le jeton Firebase capturé dans le précédent étape.
cela a bien fonctionné! L'étape suivante consistait à utiliser une application Java séparée (qui deviendrait éventuellement un serveur de notification) pour envoyer la notification au client au lieu d'utiliser la Console Firebase.
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 la Console Firebase. - en utilisant
Settings > Permissions
dans la Console Firebase, créé un nouveau compte de service et téléchargé leserviceAccountCredentials.json
fichier. - a créé un nouveau projet maven dans Eclipse et a 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 outrepasser la méthode protégéegetConnection(String url)
pour utiliser le nouveau paramètre FCM comme indiqué 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(); } }
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 j'exécute L'application Java, j'obtiens MismatchSenderId
erreur. J'ai essayé de dépanner en utilisant curl
comme montré ci-dessous mais a obtenu la même 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 My Notification Server
projet dans la Console Firebase, j'ai essayé d'utiliser le Project Number
mais cela a causé InvalidRequestException: HTTP Status Code: 401
.
la documentation de la base de données Firebase des codes d'erreur indique ceci à propos de MismatchSenderId
:
Expéditeur Non Apparié 200 +
error:MismatchSenderId
Un enregistrement jeton est lié à un certain groupe d'expéditeurs. Lorsqu'une application client s'enregistre pour FCM, elle doit spécifier quels expéditeurs sont autorisés à envoyer des messages. Vous devez utiliser l'un de ces ID d'expéditeur lors de l'envoi de messages à l'application client. Si vous passez à un autre expéditeur, les jetons d'enregistrement existants ne seront pas travail.
je n'arrivais pas à savoir où/comment dans Firebase de la Console, on peut configurer l'application Android(qui a été aded à l' My Notification Client
projet) pour pouvoir recevoir des messages.
Toute aide serait appréciée!
8 réponses
je suis en cours d'exécution dans la même question. Le problème était dans la ligne:
String serverKey = <get_server_key_from_firebase_console>;
cette valeur devrait provenir du projet de l'application Android; dans ce cas, ce serait "mon Client de Notification" et non "mon serveur de Notification".
moi aussi j'ai récemment commencé à utiliser Firebase, sans expérience préalable de la messagerie Cloud de Google. AFAIK, il n'y a pas de SDK côté serveur pour la messagerie Firebase Cloud, actuellement.
pour envoyer des notifications / messages depuis votre serveur App à votre Client Mobile, vous devez implémenter vos propres méthodes HTTP et/ou XMPP. Voir https://firebase.google.com/docs/cloud-messaging/
mon code de test, en utilisant HTTP:
public CompletableFuture<String> fcmTest1() {
// https://firebase.google.com/docs/cloud-messaging/http-server-ref
String host = "fcm.googleapis.com";
String requestURI = "/fcm/send";
String CLIENT_TOKEN = "ASK_YOUR_MOBILE_CLIENT_DEV"; // https://developers.google.com/instance-id/
CompletableFuture<String> fut = new CompletableFuture<>();
JsonObject body = new JsonObject();
// JsonArray registration_ids = new JsonArray();
// body.put("registration_ids", registration_ids);
body.put("to", CLIENT_TOKEN);
body.put("priority", "high");
// body.put("dry_run", true);
JsonObject notification = new JsonObject();
notification.put("body", "body string here");
notification.put("title", "title string here");
// notification.put("icon", "myicon");
JsonObject data = new JsonObject();
data.put("key1", "value1");
data.put("key2", "value2");
body.put("notification", notification);
body.put("data", data);
HttpClientRequest hcr = httpsClient.post(443, host, requestURI).handler(response -> {
response.bodyHandler(buffer -> {
logger.debug("FcmTest1 rcvd: {}, {}", response.statusCode(), buffer.toString());
if (response.statusCode() == 200) {
fut.complete(buffer.toString());
} else {
fut.completeExceptionally(new RuntimeException(buffer.toString()));
}
});
});
hcr.putHeader("Authorization", "key=" + Utils.FIREBASE_SERVER_KEY)
.putHeader("content-type", "application/json").end(body.encode());
return fut;
}
note: client http et les json ont été fournis par vertx ( http://vertx.io/), mais avec un peu de chance le code montre ce qui se passe assez clair pour que vous puissiez utiliser ce que vous voulez.
j'ai écrit une classe de FCMHelper, qui fonctionne bien et est simple à utiliser.
j'avais besoin d'envoyer une notification FCM depuis mon application java EE et j'ai trouvé très utile. Peut sauver quelqu'un certain temps.
...GitHub repo est une interface de bibliothèque pour L'API Firebase Cloud Messaging (FCM) (NB// Je ne suis pas l'auteur). J'ai donc suivi les instructions de readme: j'ai ajouté le fichier jar en tant que dépendance à mon projet et j'ai pu simplement invoquer les méthodes de la bibliothèque avec les paramètres respectifs.
par exemple Pushraven.setKey(my_key);
pour régler la clé de votre serveur et
Notification raven = new Notification();
raven.title("MyTitle")
.text("Hello World!")
.color("#ff0000")
.to(client_key);
pour construire une notification. Les instructions du repo sont assez claires et utiles.
// Obtain serverKey from Project Settings -> Cloud Messaging tab // for "My Notification Server" project in Firebase Console. String serverKey = <get_server_key_from_firebase_console>;
vous devez obtenir la clé de votre application android.
Et merci à vous, j'ai eu du mal à construire un service pour envoyer/recevoir des notifications de l'application. J'ai vu ta question, j'ai essayé de la résoudre, et j'ai construit la mienne. Espérons que cela aidera à vous :)
je viens de commencer avec FireBase, mais il semble que Quelqu'un (Brandon Gresham ) a déjà créé une API Java firebase.
vous pouvez vérifier les API tiers pour différentes langues ici : https://firebase.google.com/docs/database/rest/start
et voici la Java one: https://github.com/bane73/firebase4j
Merci beaucoup à Brandon d'y avoir consacré du temps!
j'ai eu exactement le même problème, et j'ai même utilisé votre code comme test pour vérifier s'il y avait un problème avec le mien. 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'une application client s'enregistre pour la FCM, elle doit spécifier les expéditeurs sont autorisés à envoyer des messages. Vous devez utiliser un de ces ID d'expéditeur quand envoyer des messages à l'application client. Si vous passez pour un autre expéditeur, les jetons d'enregistrement existants ne fonctionneront pas."
Problème est, ce n'est pas clair (au moins n'était pas pour moi). Donc voici ce dont vous avez besoin: sur votre application Android, vous aurez besoin de recevoir la clé Firebase pour l'appareil . Ce N'est pas la même chose que vous aviez pour le message Google Cloud, et donc il y a un problème.
il suffit de créer cette classe sur votre projet Android:
publique classe NotificacaoRegistro étend FirebaseInstanceIdService { static private String TAG = "NOTIFICACAOREGISTRO";
public NotificacaoRegistro(){
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
// TODO: Implement this method to send any registration to your app's servers.
}
}
N'oubliez pas de faire les changements nécessaires sur votre AndroidManifest
<service
android:name=".notificacoes.NotificacaoRegistro">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
si vous avez juste besoin du code (pour déboguer, par exemple), vous pouvez simplement faire appel à votre MainActivity, dans votre méthode OnCreate
refreshedToken = FirebaseInstanceId.getInstance().getToken ();
mais c'est mieux, l'ofc si vous en occuper correctement.
de cette façon, vous obtiendrez la bonne clé pour cet appareil. Puis sur votre code D'application Java
Result result = sender.send(message,
<PUT THE VALUE OF THE REFRESHED TOKEN HERE>,
1);
et vous êtes tous ensemble :)
j'Espère que cela aide, et désolé pour le retard :)
cheers
utilisez cette envoi de notifications push à partir de java.
Cadre De Printemps
par rapport à d'autres projets, il n'y a que 3 classes simples avec des dépendances minimales.
https://github.com/AndreiD/testingpushnotifications
N'oubliez pas de remplacer le SERVER_API_KEY et le Client_Token.