如何使用Spring Boot在Google Firebase FCM上推送通知?

时间:2019-07-11 13:41:31

标签: android angular spring-boot firebase-cloud-messaging google-cloud-messaging

我正在寻找一种解决方案,以将通知从服务器(Spring Hibernate RESTful API)推送到以Angular和Android编码的客户端应用程序。我想实施一个不会占用太多带宽的解决方案,因为我的用户群的连接性有限(低带宽和3G / 2G移动网络)。这排除了将轮询作为可能的解决方案的可能性。接下来,我研究了套接字连接,但是看起来套接字连接可能保持打开状态并导致内存泄漏问题。接下来,我尝试使用Google FCM,但仍无法实施。具体来说,我试图在FCM上发送通知,但在客户端未收到通知。 回顾一下,我必须从JAVA层(春季启动)发送通知,并在angular和Android上接收它。我尝试了一些示例代码来使用FCM来完成这项工作。但这不起作用。请向我建议解决方案或以其他方式完成这项工作的方法。 这是我正在使用的代码:

    JSONObject body = new JSONObject();
            body.put("to", "/users/" + TOPIC);
            body.put("priority", "high");

            JSONObject notification = new JSONObject();
            notification.put("title", "JSA Notification");
            notification.put("body", "Happy Message!");

            JSONObject data = new JSONObject();
            data.put("Key-1", "JSA Data 1");
            data.put("Key-2", "JSA Data 2");

            body.put("notification", notification);
            body.put("data", data);

            HttpEntity<String> entity = new HttpEntity<>(body.toString());
            RestTemplate restTemplate = new RestTemplate();
            ArrayList<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
            interceptors.add(new HeaderRequestInterceptor("Authorization", "key=" + FIREBASE_SERVER_KEY));
            interceptors.add(new HeaderRequestInterceptor("Content-Type", "application/json"));
            restTemplate.setInterceptors(interceptors);
            String firebaseResponse = restTemplate.postForObject(FIREBASE_API_URL, entity, String.class);
            CompletableFuture<String> pushNotification = CompletableFuture.completedFuture(firebaseResponse);
            CompletableFuture.allOf(pushNotification).join();
        try {
            String firebaseResponse = pushNotification.get();
            System.out.println("reponse "+firebaseResponse);
            return new ResponseEntity<>(firebaseResponse, HttpStatus.OK);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

从firebaseResponse中,我在浏览器中收到以下响应:

{"multicast_id":6197426474050349577,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}

好像没有发送我的消息。 任何示例工作代码将不胜感激。 谢谢您的帮助。 -普拉纳夫

2 个答案:

答案 0 :(得分:0)

FIREBASE_SERVER_KEY错误。如果FIREBASE_SERVER_KEY是正确的,则响应应该在下面。

{"multicast_id":7163645588662808791,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1563534037236589%eec6c0c0eec6c0c0"}]}

答案 1 :(得分:0)

该问题的答案已被接受。但是对于那些在2020年阅读此书的人来说,有一种更简单,更清洁的方法,可以使用Java的firebase admin sdk进行firebase推送通知。

        <dependency>
            <groupId>com.google.firebase</groupId>
            <artifactId>firebase-admin</artifactId>
            <version>7.0.0</version>
        </dependency>

将以上内容添加到您的项目后,您只需从node-impala npm packet生成一个service-account.json并发送如下所示的通知即可。


    GoogleCredentials googleCredentials = GoogleCredentials
            .fromStream(new ClassPathResource("firebase-service-account.json").getInputStream());
    FirebaseOptions firebaseOptions = FirebaseOptions
            .builder()
            .setCredentials(googleCredentials)
            .build();
    FirebaseApp app = FirebaseApp.initializeApp(firebaseOptions, "my-app");
    FirebaseMessaging firebaseMessaging = FirebaseMessaging.getInstance(app);
        Notification notification = Notification
                .builder()
                .setTitle(note.getSubject())
                .setBody(note.getContent())
                .build();

        Message message = Message
                .builder()
                .setToken(token)            //this can be setTopic() too
                .setNotification(notification)
                .putAllData(note.getData())
                .build();

        return firebaseMessaging.send(message);

我在这里有一个有关如何在Spring Boot项目中实现此功能的详细信息。

FCM admin console