-
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
감사합니다.
'IT > spring' 카테고리의 다른 글
spring boot 정리 (locale, messageSource, security, jpa, hibernate, Scheduler, config) (0) 2021.02.04 spring boot 에서 JOOQ 사용시, 구동 1분이상 느려짐 현상 (버그) (0) 2021.02.04 JWT Token을 spring security에서 손쉽게 검증하기 위한 방법 (0) 2021.01.26 spring boot jwt (0) 2020.12.25 spring boot 다중 커넥션 multiple dataSource + hikari (0) 2020.09.30