来自Java而不是Firebase控制台的Firebase Cloud Messaging通知

我是Firebase的新用户,当我的Java应用程序尝试使用客户端的Firebase令牌发送通知/消息时,我遇到错误,例如错误的发件人ID和HTTP状态401的身份validation错误。 请注意,使用Firebase控制台,我可以将消息发送到客户端。

对于客户端应用程序,我执行了以下操作:

  1. 从这里克隆Firebase messaging快速入门应用程序 – https://github.com/firebase/quickstart-android/tree/master/messaging – 已经设置了Firebase依赖等。 在Android Studio加载了克隆的应用程序。
  2. 使用Firebase控制台,创建了一个名为“ My Notification Client的新项目,并使用com.google.firebase.quickstart.fcm添加了一个应用,作为Android应用的包名称。
  3. 下载了添加到新创建项目的Android应用的google-services.json文件,并将其复制到messaging/app/文件夹,并与Android Studio成绩文件同步。
  4. 创建了一个模拟器并在Android Studio运行应用程序。 当应用程序加载到模拟器中时,单击“ Log Token按钮以在Android StudioAndroid Monitor选项卡中捕获客户端的Firebase标记。
  5. 使用Firebase控制台,选择新创建的项目“ My Notification Client ,单击左窗格中的“ Notifications链接,并通过粘贴上一步中捕获的Firebase令牌向设备发送通知。

这很棒! 下一步是使用单独的简单Java应用程序(最终将成为通知服务器)将通知发送到客户端,而不是使用Firebase控制台。

为此,我按照此处列出的步骤进行了操作 – https://firebase.google.com/docs/server/setup#prerequisites 。 具体来说,这些是我执行的步骤:

  1. 在Firebase Console中创建了一个名为My Notification Server的新项目。
  2. 使用Firebase控制台中的Settings > Permissions ,创建新服务帐户并下载serviceAccountCredentials.json文件。
  3. 在Eclipse中创建了一个新的maven项目,并在pom.xml中添加了以下依赖项:
   com.google.gcm gcm-server 1.0.0   com.googlecode.json-simple json-simple 1.1.1   com.google.firebase firebase-server-sdk 3.0.0  
  1. 然后,我扩展了com.google.android.gcm.sender.Sender以创建FCMSender并覆盖受保护的方法getConnection(String url)以使用新的FCM端点,如下所示:

     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. 我的Java应用程序的main()方法如下所示:

     public static void main(String[] args) { // Obtain serverKey from Project Settings -> Cloud Messaging tab // for "My Notification Client" project in Firebase Console. String serverKey = ; 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(); } } 

当我运行Java应用程序时,我收到MismatchSenderId错误。 我尝试使用curl故障排除,如下所示,但得到了同样的错误:

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

我没有使用Firebase控制台中My Notification Server项目的Project Settings > Cloud Messaging选项卡上列出的Server Key ,而是尝试使用Project Number但导致InvalidRequestException: HTTP Status Code: 401

错误代码的Firebase文档说明了MismatchSenderId

不匹配的发件人200 + error:MismatchSenderId
注册令牌绑定到某组发件人。 当客户端应用程序注册FCM时,它必须指定允许哪些发件人发送消息。 在向客户端应用发送消息时,您应该使用其中一个发件人ID。 如果您切换到其他发件人,现有的注册令牌将无法使用。

我无法弄清楚Firebase控制台在哪里/如何配置Android应用程序(已通过My Notification Client项目)以便能够接收消息。

对此有任何帮助,将不胜感激!

我遇到了同样的问题。 问题在于:

 String serverKey = ; 

此值应来自Android应用程序项目; 在这种情况下,它将是“我的通知客户端”而不是“我的通知服务器”。

我最近也开始使用Firebase,没有Google Cloud Messaging的经验。 AFAIK,目前没有适用于Firebase云消息传递的服务器端SDK。

要将通知/消息从App Server发送到Mobile Client,您需要实现自己的HTTP和/或XMPP方法。 请参阅https://firebase.google.com/docs/cloud-messaging/

我的测试代码,使用HTTP:

 public CompletableFuture 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 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; } 

注意:http客户端和json是由vertx( http://vertx.io/ )提供的,但希望代码能够清楚地显示出足够清晰的内容,以便您可以使用任何您想要的内容。

我写了一个FCMHelper类,工作正常,使用简单。

请参见https://github.com/MOSDEV82/fcmhelper

我需要从我的java EE应用程序发送FCM通知,我发现这非常有用。 可能会节省一些时间。

… github repo是Firebase云消息传递(FCM)API的库接口(NB //我不是作者)。 所以我按照自述文件中的说明操作:将jar文件添加为我的项目的依赖项,并且可以使用各自的参数调用库方法。

例如Pushraven.setKey(my_key); 设置您的服务器密钥和

 Notification raven = new Notification(); raven.title("MyTitle") .text("Hello World!") .color("#ff0000") .to(client_key); 

建立通知。 回购的说明非常明确且有用。

上:

// Obtain serverKey from Project Settings -> Cloud Messaging tab // for "My Notification Server" project in Firebase Console. String serverKey = ;

您必须获取Android应用程序的密钥。

谢谢你,我正在努力构建一个服务来发送/接收应用程序的通知。 看到你的问题,试图把它弄好,然后用来建造我的。 希望对你有帮助 :)

我刚开始使用FireBase,但看起来有人(Brandon Gresham)已经制作了firebase Java API。

您可以在此处查看不同语言的第三方API: https : //firebase.google.com/docs/database/rest/start

这是Java的一个: https : //github.com/bane73/firebase4j

非常感谢Brandon花时间去做它!

我有同样的问题,甚至用你的代码作为测试来检查我的是否有问题。 事实certificate我们的两个代码都是正确的。 Firebase文档中描述的问题非常明显:

“不匹配的发件人200 +错误:MismatchSenderId注册令牌绑定到某组发件人。当客户端应用程序注册FCM时,它必须指定允许哪些发件人发送邮件。您应该在发送邮件时使用其中一个发件人ID到客户端应用程序。如果您切换到其他发件人,现有的注册令牌将无效。“

问题是,这不是那么清楚(至少不适合我)。 这就是您需要的:在您的Android应用程序中,您需要接收设备的Firebase密钥。 它与您以前使用的Google Cloud Message不同,因此存在问题。

只需在Android项目中创建此类:

公共类NotificacaoRegistro扩展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. } 

}

不要忘记在AndroidManifest上进行必要的更改

       

如果您只需要代码(例如,用于调试),您可以在OnCreate方法中调用MainActivity

String refreshedToken = FirebaseInstanceId.getInstance()。getToken();

但是如果你妥善照顾它,那就更好了。

这样你就可以获得该设备的正确密钥。 然后在您的Java应用程序代码上

  Result result = sender.send(message, , 1); 

而且你们都准备好了:)

希望这会有所帮助,并抱歉长时间的延迟:)

干杯

使用来自java的此发送推送通知。

Spring框架

与其他项目相比,只有3个简单的类具有最小的依赖性。

https://github.com/AndreiD/testingpushnotifications

请记住替换SERVER_API_KEY和Client_Token。

PS。由我写的