【发布时间】:2016-09-22 10:22:52
【问题描述】:
我是 Firebase 的新手,当我的 Java 应用程序尝试使用客户端的 Firebase 令牌发送通知/消息时,我遇到了错误,例如发件人 ID 不匹配和 HTTP 状态为 401 的身份验证错误。请注意,使用 Firebase 控制台,我可以将消息发送到客户端。
对于客户端应用,我做了以下操作:
- 从这里克隆的 Firebase
messaging快速启动应用程序 -- https://github.com/firebase/quickstart-android/tree/master/messaging -- 已经设置了 Firebase 依赖项等。在Android Studio中加载克隆的应用程序。 - 使用 Firebase 控制台,创建了一个名为
My Notification Client的新项目,并添加了一个使用com.google.firebase.quickstart.fcm作为 Android 应用程序包名称的应用程序。 - 为添加到新创建项目的 Android 应用下载了
google-services.json文件,并将其复制到messaging/app/文件夹并与Android Studio中的成绩文件同步。 - 创建了一个模拟器并从
Android Studio中运行该应用程序。当应用程序在模拟器中加载时,单击Log Token按钮以在Android Studio的Android Monitor选项卡中捕获客户端的Firebase 令牌。 - 使用 Firebase 控制台,选择新创建的项目
My Notification Client,单击左侧窗格中的Notifications链接,并通过粘贴在上一步中捕获的 Firebase 令牌向设备发送通知。
效果很好!下一步是使用单独的简单 Java 应用程序(最终将成为通知服务器)将通知发送到客户端,而不是使用 Firebase 控制台。
为此,我遵循了此处列出的步骤 -- https://firebase.google.com/docs/server/setup#prerequisites。具体来说,这些是我执行的步骤:
- 在 Firebase 控制台中创建了一个名为
My Notification Server的新项目。 - 在 Firebase 控制台中使用
Settings > Permissions,创建一个新的服务帐户并下载serviceAccountCredentials.json文件。 - 在Eclipse中新建了一个maven项目,在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>
-
然后,我扩展
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(); } } -
我的 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 = <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(); } }
当我运行 Java 应用程序时,我收到 MismatchSenderId 错误。我尝试使用curl 进行故障排除,如下所示,但得到了相同的错误:
$ 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"}]}
我尝试使用 Project Number 而不是在 Firebase 控制台中的 My Notification Server 项目中使用 Project Settings > Cloud Messaging 选项卡上列出的 Server Key,但这会导致 InvalidRequestException: HTTP Status Code: 401。
错误代码的 Firebase 文档说明了 MismatchSenderId:
发件人不匹配 200 +
error:MismatchSenderId
注册令牌与特定的发件人组相关联。当客户端应用注册 FCM 时,它必须指定允许哪些发件人发送消息。在向客户端应用程序发送消息时,您应该使用其中一个发件人 ID。如果您切换到其他发件人,现有的注册令牌将不起作用。
我不知道在 Firebase 控制台中的何处/如何配置 Android 应用(已添加到 My Notification Client 项目)以能够接收消息。
对此的任何帮助,将不胜感激!
【问题讨论】:
-
你可以查看这个答案stackoverflow.com/a/51172021/3073945
标签: java firebase firebase-cloud-messaging