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!