当前位置: 首页 > 面试题库 >

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

马宜民
2023-03-14
问题内容

我是Firebase的新手,我的Java应用程序尝试使用客户端的Firebase令牌发送通知/消息时,遇到了错误,例如发送者ID不匹配和HTTP状态为401的身份验证错误。请注意,使用Firebase控制台,我可以将消息发送到客户端。

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

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

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

为此,我遵循了此处概述的步骤-https:
//firebase.google.com/docs/server/setup#prerequisites。具体来说,这些是我执行的步骤:

  1. My Notification Server在Firebase控制台中创建了一个新项目。
  2. Settings > Permissions在Firebase控制台中使用,创建一个新的服务帐户并下载serviceAccountCredentials.json文件。
  3. 在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>
    
  4. 然后,我扩展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();
    }
    

    }

  5. main()我的Java应用程序的方法如下所示:

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

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

Firebase错误代码文档说明了以下内容MismatchSenderId

发送方不匹配200 + error:MismatchSenderId

注册令牌已绑定到特定的一组发送方。客户端应用程序注册FCM时,必须指定允许哪些发件人发送消息。将消息发送到客户端应用程序时,应使用这些发件人ID之一。如果您切换到其他发件人,则现有的注册令牌将不起作用。

我不知道在Firebase控制台中可以在何处/如何配置Android应用程序(已添加到My Notification Client项目中)以能够接收消息。

任何帮助,将不胜感激!


问题答案:

我遇到了同样的问题。问题出在行中:

String serverKey = <get_server_key_from_firebase_console>;

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



 类似资料:
  • 我是Firebase新手,当我的Java应用程序尝试使用客户端的Firebase令牌发送通知/消息时,我遇到了一些错误,例如发送者id不匹配和HTTP状态401的身份验证错误。请注意,使用Firebase控制台,我能够将消息发送到客户端。 对于客户端应用程序,我执行了以下操作: 从这里克隆Firebase快速入门应用--https://github.com/firebase/quickstart-

  • 我最近不得不迁移我的应用程序,复制并粘贴了一大堆代码。现在,当我构建项目时,我会在控制台中获得通常的firebase输出,但这次它是重复的。有谁知道可能导致这种情况的原因。代码太多,我无法完成

  • 我对通过关联has_many有问题。不知何故 u.groups.create!(:名称 = (0.1ms)开始事务SQL(4.5ms)插入"组"("created_at","findeble","name","学校","updated_at")值 (?, ?, ?, ?, ?) [["created_at", Tue,01 Oct 2013 08:13:36 UTC 00:00],["findeb

  • 我在一个Spring Boot应用程序中使用Logback。我在logback.xml中有配置。我试图为应用程序中的不同进程编写单独的日志文件。 无论如何,当我试图记录它总是写入控制台的文件时,它不会向文件本身写入任何内容。如果我尝试检查记录器实例本身(在转换为日志记录程序实例之后): 它向我展示了记录器的上下文是根记录器本身,并且没有附加到它的文件(因此是控制台编写)我需要对配置进行哪些更改才能

  • 问题内容: 我可以配置为将日志写在文件上,而不是在控制台上打印吗? 问题答案: 2013年更新- 围绕Node v0.2和v0.4编写;现在,围绕日志记录有更好的工具。我强烈推荐温斯顿 2013年末更新- 我们仍然使用winston,但现在有了记录器库,用于围绕自定义对象的记录和格式来包装功能。这是我们logger.js的示例 https://gist.github.com/rtgibbons/7

  • 我实现了Firebase,并测试了Firebase通知。当应用程序处于前台时,我没有问题,我实现了一个扩展FirebaseMessagingService的服务,并处理onMessageReceived中的消息和数据 我有问题,当应用程序在后台,我想发送一个通知,打开一个特定的活动,并做我计划做的事情,而不仅仅是打开应用程序。 我按照Firebase指南中描述的那样做了,但我无法启动特定的活动。