ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • spring에서 FCM (firebase cloud messaging) push 보내기.
    IT/spring 2021. 2. 4. 11:01

    spring에서 fcm (firebase cloud messaging) push 보내기.

    공식문서: https://firebase.google.com/docs/cloud-messaging/server?hl=ko

    설정방법

    - firebase 에서 키생성 파일다운로드 ...key.json 받기.

      다른방법도있다 위공식문서 참고.

     

    build.gradle

    compile group: 'com.google.firebase', name: 'firebase-admin', version: '7.1.0'

     

    service

    
    @Service
    @Slf4j
    public class FcmService {
    
    
        @Value("${project.properties.firebase-create-scoped}")
        String fireBaseCreateScoped;
    
        private FirebaseMessaging instance;
    
        public void sendTargetMessage(String targetToken, String title, String body) throws FirebaseMessagingException {
            this.sendTargetMessage(targetToken, title, body, null);
        }
        public void sendTargetMessage(String targetToken, String title, String body, String image) throws FirebaseMessagingException {
            Notification notification = Notification.builder().setTitle(title).setBody(body).setImage(image).build();
            Message msg = Message.builder().setToken(targetToken).setNotification(notification).build();
            sendMessage(msg);
        }
    
        public void sendTopicMessage(String topic, String title, String body) throws FirebaseMessagingException {
            this.sendTopicMessage(topic, title, body, null);
        }
        public void sendTopicMessage(String topic, String title, String body, String image) throws FirebaseMessagingException {
            Notification notification = Notification.builder().setTitle(title).setBody(body).setImage(image).build();
            Message msg = Message.builder().setTopic(topic).setNotification(notification).build();
            sendMessage(msg);
        }
    
        public String sendMessage(Message message) throws FirebaseMessagingException {
            return this.instance.send(message);
        }
    
        @PostConstruct
        public void firebaseSetting() throws IOException {
            GoogleCredentials googleCredentials = GoogleCredentials.fromStream(new ClassPathResource("google-fcm-...-key.json").getInputStream())
                    .createScoped((Arrays.asList(fireBaseCreateScoped)));
    
            FirebaseOptions secondaryAppConfig = FirebaseOptions.builder()
                    .setCredentials(googleCredentials)
                    .build();
            FirebaseApp app = FirebaseApp.initializeApp(secondaryAppConfig);
            this.instance = FirebaseMessaging.getInstance(app);
        }
    
        public BatchResponse sendMessage(MulticastMessage message) throws FirebaseMessagingException {
            return this.instance.sendMulticast(message);
        }
    }

     

    application.yaml

    project:
      properties:
        firebase-create-scoped: "https://www.googleapis.com/auth/firebase.messaging"
        firebase-multicast-message-size: 500
    

     

     

    controller

    @Slf4j
    @RestController
    @RequestMapping(NotificationsController.URI_PREFIX)
    @Api(tags = "알림")
    public class NotificationsController {
        public static final String URI_PREFIX = ApisController.URI_PREFIX + "/notifications";
    
        @Autowired
        FcmService fcmService;
    
        @Autowired
        CoreUserService coreUserService;
    
    
        @Value("${project.properties.firebase-multicast-message-size}")
        Long multicastMessageSize;
    
    
        @ApiOperation(value = "토픽푸쉬")
        @PostMapping(value = "/pushs/topics/{topic}")
        public void notificationTopics(@PathVariable("topic") String topic, @RequestBody RequestPushMessage data) throws FirebaseMessagingException {
            Notification notification = Notification.builder().setTitle(data.getTitle()).setBody(data.getBody()).setImage(data.getImage()).build();
            Message.Builder builder = Message.builder();
            Optional.ofNullable(data.getData()).ifPresent(sit -> builder.putAllData(sit));
            Message msg = builder.setTopic(topic).setNotification(notification).build();
            fcmService.sendMessage(msg);
        }
    
        @ApiOperation(value = "전고객푸쉬")
        @PostMapping(value = "/pushs/users")
        public void notificationUsers(@RequestBody RequestPushMessage data) throws IOException, FirebaseMessagingException {
            List<CoreUser> targetUser = null == data.getUserNos() ? coreUserService.findAllByEnabledAndPushTokenIsNotNull(UseCd.USE001) : coreUserService.findAllByEnabledAndPushTokenIsNotNullAndNoIn(UseCd.USE001, data.getUserNos());
            AtomicInteger counter = new AtomicInteger();
            Collection<List<CoreUser>> sendUserGroups = targetUser.stream().collect(Collectors.groupingBy(it -> counter.getAndIncrement() / multicastMessageSize.longValue())).values();
            for (List<CoreUser> it : sendUserGroups) {
                Notification notification = Notification.builder().setTitle(data.getTitle()).setBody(data.getBody()).setImage(data.getImage()).build();
                MulticastMessage.Builder builder = MulticastMessage.builder();
                Optional.ofNullable(data.getData()).ifPresent(sit -> builder.putAllData(sit));
                MulticastMessage message = builder
                        .setNotification(notification)
                        .addAllTokens(it.stream().map(sit -> sit.getPushToken()).collect(Collectors.toList()))
                        .build();
                this.fcmService.sendMessage(message);
            }
        }
    
    
        @ApiOperation(value = "특정 고객푸쉬")
        @PostMapping(value = "/pushs/users/{no}")
        public void notificationUser(@PathVariable("no") Long no, @RequestBody RequestPushMessage data) throws FirebaseMessagingException {
            Optional<CoreUser> user = coreUserService.findById(no);
            if (user.isPresent()) {
                CoreUser it = user.get();
                Notification notification = Notification.builder().setTitle(data.getTitle()).setBody(data.getBody()).setImage(data.getImage()).build();
                Message.Builder builder = Message.builder();
                Optional.ofNullable(data.getData()).ifPresent(sit -> builder.putAllData(sit));
                Message msg = builder.setToken(it.getPushToken()).setNotification(notification).build();
                fcmService.sendMessage(msg);
            }
        }
    
    
    
    }
    

     

    어플테스트

    - android app

    https://github.com/firebase/quickstart-android/tree/master/messaging

     

     

    감사합니다.

    댓글

Designed by Tistory.