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:

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

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