관리 메뉴

꿀맛코딩

How to send FCM topic for App 본문

공부방/Node.js

How to send FCM topic for App

soycrab 2020. 1. 14. 20:04

 

 

 

토이 프로젝트에서 기존 FCM의 Message 전송 방식을 사용하다가,

 

토큰이 계속해서 누적이 되면서 전체 푸시를 보낼 때, 

 

점점 반응이 느려지기 시작했다. 

 

 

기존방식은 

 

fcm.send(message) 로 보냈었는데, 

 

var message = { 
        data: {  
            message : {
                type:'100',
                channel: '100',
                title: '메시지가 도착했습니다.',
                content: tempMsg
            }
        },
        to: "토큰"
    };

 

message의 

 

to 또는 registration_ids 를 통해 한번에 여러 기기에 보내는 방식이었다.

 

하지만 위의 방법은 단점이 있다. 

 

첫 번째 to는 단일 사용자에게 보내는 방식으로  

 

여러 명에게 보내려면 반복문을 돌면서 실행시켜야 하며,

 

이는 나 같이 적은 리소스를 가지고 서버를 돌리는 

 

입장에서는 부담스러운 작업이다. 

 

registration_ids 를 이용해서 여러 사용자의 token 을 담아 보내면,

 

그나마 좋은 구조이지만 이 역시 한 번에 1000명이라는 제약 조건이 있다.

 

따라서 대량의 기기에 메시지를 전송하고 싶다면  Firebase에서 권장하는 

 

Topic 형식에 맞추어서 보내야 한다.

 

 

 

자 토픽을 보내기 전에 먼저 App (Android) 에서 어떤 식으로 구독을 신청하는지 알아보자. 

 

먼저 구독 신청을 하는 코드이다. 

 

.subscribeToTopic("Test") 에서 "Test" 는 구독할 주제가 된다. 

 FirebaseMessaging.getInstance().subscribeToTopic("Test").addOnCompleteListener { task ->
          if (task.isSuccessful) {
               Log.i("Test","구독 요청 성공")
          } else {
               Log.i("Test, "구독 요청 실패")
          }
}

 

 

그다음  Listener를 통해 구독이 성공하면 결과를 반환한다. 

 

다음으로 구독을 해제하는 방법도 알아보자. 

FirebaseMessaging.getInstance().unsubscribeFromTopic("Test").addOnCompleteListener { task ->
          if (task.isSuccessful) {
                Log.i("Test","구독 해제 요청 성공")
          } else {
                Log.i("Test","구독 해제 요청 실패")
          }
}

 

구독과 달라진 점이라고 하면 unsubscribeFromTopic("Test") 

 

호출하는 메서드가 변경이 되었다. 

 

 

자 그럼 클라이언트에서는 이제 구독을 했으니 서버 쪽에서

 

 

어떻게 구독자에게 Message를 전달하는지 알아보자. 

 

 

const admin = require('firebase-admin');


const options = {
        priority: "high",     //메시지 중요도 설정 
        timeToLive: 60 * 60 * 2 ////메시지 Live Time 설정
}; 

var message = {
        data: {  
            message : JSON.stringify({
                type:'10',
                channel: '10',
                title: '매시지가 도착했습니다.',
                content: 'content'
            })
        }
};
    
 admin.messaging().sendToTopic('Test', message, options).then(function(response) {
        console.log("Successfully sent message:", response);
 })
 .catch(function(error) {
        console.log("Error sending message:", error);
 });

 

 

가장 중요한 부분은 

 

var message = {
        data: {  
            message : JSON.stringify({
                type:'10',
                channel: '10',
                title: '매시지가 도착했습니다.',
                content: 'content'
            })
        }
};

빨간색으로 표시된 부분이라고 할 수 있다.

 

data 안의 내용을  String으로 변환시키지 않고  Object 형태로 보내게 되면 

 

Error를 발생시킨다. 

 

따라서 data안의 모든 내용은 String으로 변환시켜서 보내주면 된다. 

 

위의 코드처럼 Message을 보내면 아주 신속하고 정확하게 

 

구독자들이 Topic에 대한 Message를 전달받을 수 있다. 

 

 

 

 

예제의 데이터 구조, 변수명은 임의로 지어낸 것들입니다.

 

 

 

 

 

 

 

 

 

 

 

반응형
Comments