Notificação do Firebase Cloud Messaging de Java em vez do Firebase Console

Eu sou novo no Firebase e estou enfrentando erros como ID de remetente incompatível e Erro de autenticação com status HTTP 401 quando meu aplicativo Java tenta enviar uma notificação / mensagem usando o token do Firebase do cliente. Observe que, usando o Firebase Console, sou capaz de enviar a mensagem ao cliente.

Para o aplicativo cliente, fiz o seguinte:

Firebase clonadomessaging aplicativo de início rápido a partir daqui -https://github.com/firebase/quickstart-android/tree/master/messaging - que já está configurado com dependências do Firebase e tal. Carregou o aplicativo clonado emAndroid Studio.Usando o Firebase Console, criou um novo projeto chamadoMy Notification Client e adicionou um aplicativo usandocom.google.firebase.quickstart.fcm como o nome do pacote do aplicativo Android.Transferidogoogle-services.json para o aplicativo Android adicionado ao projeto recém-criado e copiado para omessaging/app/ pasta e sincronizada com os arquivos Grade de dentroAndroid Studio.Criou um emulador e executou o aplicativo de dentroAndroid Studio. Quando o aplicativo foi carregado no emulador, clique no íconeLog Token para capturar o token Firebase do cliente no diretórioAndroid Monitor guiaAndroid Studio.Usando o Firebase Console, selecione o projeto recém-criadoMy Notification Client, clicou noNotifications no painel esquerdo e enviou uma notificação ao dispositivo colando o token do Firebase capturado na etapa anterior.

Isso funcionou muito bem! A próxima etapa foi usar um aplicativo Java simples separado (que eventualmente se tornaria um servidor de notificação) para enviar a notificação ao cliente em vez de usar o Firebase Console.

Para fazer isso, segui as etapas descritas aqui -https://firebase.google.com/docs/server/setup#prerequisites. Especificamente, estas são as etapas que eu executei:

Criou um novo projeto chamadoMy Notification Server no Firebase Console.UsandoSettings > Permissions no Firebase Console, criou uma nova conta de serviço e baixou oserviceAccountCredentials.json Arquivo.Criou um novo projeto maven no Eclipse e adicionou as seguintes dependências no 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>

Então eu estendicom.google.android.gcm.sender.Sender para criarFCMSender e substituir método protegidogetConnection(String url) para usar o novo terminal FCM, como mostrado abaixo:

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();
    }
}

omain() O método do meu aplicativo Java se parece com o seguinte:

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();
        }
    }

Quando executo o aplicativo Java, receboMismatchSenderId erro. Tentei solucionar o problema usandocurl como mostrado abaixo, mas obteve o mesmo erro:

$ 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"}]}

Em vez de usar oServer Key listado emProject Settings > Cloud Messaging guia paraMy Notification Server projeto no Firebase Console, tentei usar oProject Number mas isso causouInvalidRequestException: HTTP Status Code: 401.

A documentação do Firebase dos códigos de erro diz isso sobreMismatchSenderId:

Remetente incompatível 200 +error:MismatchSenderId
Um token de registro está vinculado a um determinado grupo de remetentes. Quando um aplicativo cliente se registra no FCM, ele deve especificar quais remetentes têm permissão para enviar mensagens. Você deve usar um desses IDs de remetente ao enviar mensagens para o aplicativo cliente. Se você alternar para um remetente diferente, os tokens de registro existentes não funcionarão.

Não consegui descobrir onde / como no Firebase Console é possível configurar o aplicativo Android (que foi adicionado aoMy Notification Client projeto) para poder receber mensagens.

Qualquer ajuda sobre isso, seria apreciada!

questionAnswers(8)

yourAnswerToTheQuestion