Node.js

[Node.js] [ Firebase] FCM서버를 이용한 푸시 알림 보내기

오늘보다 더 나은 내일을 위해 2020. 10. 15. 13:51

 

 

firebase의 FCM 서버를 이용해 Android, IOS 에 푸시 알림을 보낼 수 있는 간단한 서버 예제를 만들어보겠습니다.

 

 

firebase.google.com/docs/cloud-messaging/server?hl=ko

firebase 공식 문서에도 잘 나와있습니다.

 

firebase에 프로젝트는 만들어둔 상태입니다

 

 

 

1. 먼저 Firebase Admin SDK를 설치해줍니다

$ npm install firebase-admin --save

 

2. 서버키 다운로드

 

SDK를 초기화 해주려면 서버키가 필요합니다

console.firebase.google.com/

 

firebase 콘솔 화면으로 들어가서 '설정 아이콘 > 프로젝트 설정 > 서비스 계정 > 새 비공개키 생성'

 

이렇게 생성된 키를 적당한 곳에 둡니다. 저는 node 프로젝트 파일 안에 뒀어요

 

그리고 SDK를 초기화해주는 코드를 입력합시다

 

 

3. SDK 초기화

const admin = require('firebase-admin')

let serAccount = require('../서버 키 이름.json')

admin.initializeApp({
  credential: admin.credential.cert(serAccount),
})

저는 프로젝트 파일 안에 서버키를 넣기 때문에 저렇게 썼지만 그냥 서버키 파알의 경로를 적어주시면 됩니다

 

 

4. PUSH 메시지 보내기

 

 

// push PAGE
router.get('/push_send', function (req, res, next) {
  let target_token =
    'e5p9Ul2BRc-MgZHP8Dx_wB:APA91bG9pnGqSJQLGrazz3tq0JkPKJlTY5cHmylMiR8dAdGAdKi9o_rf9y55H1mmvvAgHj0ZKjZyk23Q_trNrmgQx1A6h3LaoADdlPV-kX5czoDnL1F-gc2DOZJucEmf4To6hje4AfHl'
	//target_token은 푸시 메시지를 받을 디바이스의 토큰값입니다

  let message = {
    data: {
      title: '테스트 데이터 발송',
      body: '데이터가 잘 가나요?',
      style: '굳굳',
    },
    token: target_token,
  }

  admin
    .messaging()
    .send(message)
    .then(function (response) {
      console.log('Successfully sent message: : ', response)
    })
    .catch(function (err) {
      console.log('Error Sending message!!! : ', err)
    })
})

이렇게 하면 해당 토큰을 가진 앱에 푸시 알림이 갑니다

 

 

 

5. 전송 과정

 

이제 이 푸시 메시지가 어떻게 서버에서 디바이스로 전달되는지 알아봅시다

firebase의 클라우딩 메시지는 HTTP 프로토콜로 전달됩니다.

 

① 서버에서 FCM 서버로 HTTP Request를 post 방식으로 요청하면

② FCM서버에서 HTTP Response 응답이 옵니다

③ 그리고 FCM 서버에서 앱으로 메시지를 보냅니다

④ 앱에서는 받은 메시지를 처리하고 음답 메시지를 보냅니다.

 

 

FCM에 보낼 메시지 형식입니다

"to" : "[디바이스 토큰 값]", 
"priority" : "high", 
"notification" : { 
   "title" : "BackGround Title", 
   "body" : "Background Message"
}, 
"data" : { 
   "title" : "ForeGround Title", 
   "body" : "Foreground Message" 
}