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:

  1. 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 dans Android Studio.
  2. en utilisant la Console Firebase, a créé un nouveau projet appelé My Notification Client et ajouté une application en utilisant com.google.firebase.quickstart.fcm comme le nom du paquet de L'application Android.
  3. Téléchargé google-services.json le fichier de l'application Android ajouté au projet nouvellement créé et copié dans le messaging/app/ dossier et synchronisés avec la Nuance fichiers dans Android Studio.
  4. 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 le Log Token bouton pour capturer le jeton Firebase du client dans le Android Monitor dans l'onglet Android Studio.
  5. à L'aide de la Console Firebase, sélectionné le nouveau projet My Notification Client, cliqué sur le Notifications 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:

  1. Créé un nouveau projet appelé My Notification Server dans la Console Firebase.
  2. en utilisant Settings > Permissions dans la Console Firebase, créé un nouveau compte de service et téléchargé le serviceAccountCredentials.json fichier.
  3. 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>
  1. Ensuite, j'ai étendu com.google.android.gcm.sender.Sender pour créer FCMSender et outrepasser la méthode protégée getConnection(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();
        }
    }
    
  2. 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!

25
demandé sur Sandeep 2016-05-25 04:47:18

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".

6
répondu Tahira Qader 2016-09-20 00:45:41

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.

9
répondu aes 2016-06-01 09:31:27

j'ai écrit une classe de FCMHelper, qui fonctionne bien et est simple à utiliser.

Voir ici https://github.com/MOSDEV82/fcmhelper

3
répondu user3027859 2016-10-07 18:51:24

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.

3
répondu rey_coder 2017-08-01 15:55:09

// 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 :)

1
répondu hcordeiro 2016-05-26 05:05:15

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!

0
répondu raspayu 2016-08-25 22:51:48

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

0
répondu Marcelo Nascimento 2016-09-16 18:56:45

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.

PS. Written by me

0
répondu OWADVL 2016-12-02 13:01:11