Skip to content

Firebase Cloud Messaging

p-chanmin edited this page Dec 13, 2023 · 1 revision

Firebase Cloud Messaging

일정 알림에 대한 Notification은 오프라인 환경에서도 일정 알림을 받을 수 있도록 처리하였다.

Follow나 일정 초대의 경우 서버에서 알림을 보내주어야 하기 때문에 어떤 방법으로 알림을 수신해야 할지 고민하였고, FCM, WebSocket, Polling의 기술 중 어떤 방식으로 알림을 수신할지 결정하였다.

  • WebSocket은 양방향 통신을 통해서 메세지를 수신받고 응답을 처리할 수 있지만, 앱이 백그라운드에 있거나 종료되어 있는 경우 알림을 수신할 수 없는 단점이 있다.
  • Polling은 앱이 백그라운드에 있거나 종료되어 있어도 알림을 수신할 수 있지만, 주기적으로 서버에 요청을 보내거나 연결을 유지하면서 알림을 가져오기 때문에 서버에 부하가 가고, 배터리 소모 문제도 발생한다.
  • FCM은 앱이 백그라운드에 있거나 종료되어 있어도 알림을 수신할 수 있고, 디바이스의 고유한 토큰을 부여하고, 이를 통해 알림을 수신하기 때문에 효율적이지만, 알림 전달이 지연될 수 있고, 알림이 중간에 유실될 가능성이 있다.

이 기술들 중에서 FCM을 선택하였다.

  • 앱이 백그라운드에 있거나 종료되어도 Follow알림이나 일정 초대 알림은 Notification으로 전달 받을 필요가 있다.
  • Polling처럼 지속적으로 서버에게 요청을 보내는 방법이 아니기 때문에 서버의 부하가 적다.

FCM Data, Notification

FCM을 테스트하면서 서버에서 보내는 데이터를 수신할 수 있도록 하였다.

로그인 시에 서버에 FCM 토큰을 제공하고, 이를 통해서 서버에서 데이터를 보낸다.

FCM에서는 Notification을 함께 보낼 수 있었기 때문에 FCM을 사용하여 알림 기능을 구현한다면 일정 알림과는 다르게 추가적으로 Notification을 만들지 않아도 앱에 Notification을 보낼 수 있을 것으로 예상했다.

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    },
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
  }
}

앱이 백그라운드 상태일 때도 팔로우 알림이나, 일정 초대 알림에 대해서 데이터를 전달 받아 처리해야했다.

  • Data만 전달 했을 경우

    {
      "message":{
        "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
        "data" : {
          "Nick" : "Mario",
          "Room" : "PortugalVSDenmark"
        }
      }
    }

    앱이 백그라운드나 종료된 상태일 때도 정상적으로 데이터를 받았다.

  • Data와 Notification을 모두 전달 했을 경우

    {
      "message":{
        "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
        "notification":{
          "title":"Portugal vs. Denmark",
          "body":"great match!"
        },
        "data" : {
          "Nick" : "Mario",
          "Room" : "PortugalVSDenmark"
        }
      }
    }

    앱이 백그라운드나 종료된 상태에서 Notification이 정상적으로 출력된다.

    하지만 data 는 onMessageReceived에 전달되지 않는 문제가 발생하였다.

관련된 문제는 Firebase Cloud Messaging의 공식 문서에서 찾아볼 수 있었다.

image

https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ko


Data & Notification

datanotification 을 모두 보냈을 경우, Notification의 구현을 하지 않아도 자체적으로 Notification을 보여줄 수 있다는 장점이 있다.

하지만 data는 onMessageReceived에서 처리할 수 없고, Notification을 탭한 경우에만 데이터 페이로드를 처리할 수 있기 때문에 추가적인 처리인 일정 초대 수락 거절과 같은 기능을 구현하기에는 어려움이 있었다.

Notification

결국 앱이 백그라운드나 종료된 상태에서도 data 를 받기 위해서 datanotification을 모두 송신하지 않고, data만 송신하기로 하여 앱이 모든 상황에서 data를 받을 수 있도록 하였다.

그리고 수신한 data를 통해서 자체적으로 notification을 띄우고, 일정 초대의 경우 추가적으로 notification에서 바로 수락과 거절을 할 수 있는 action을 추가하여 팔로우와 일정 초대에 대한 알림을 구현하기로 하였다.

⚽️협업 룰

코딩 컨벤션

📔회고

팀 회고

개인 회고

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

👨‍🏫멘토링 회의록

💻개발일지

Android

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

💡트러블슈팅

Android

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

📋회의록

스크럼 회의

스프린트 회의

밋밋 회의

공통

BackEnd

Android

기획

Clone this wiki locally