-
Notifications
You must be signed in to change notification settings - Fork 0
Firebase Cloud Messaging
일정 알림에 대한 Notification은 오프라인 환경에서도 일정 알림을 받을 수 있도록 처리하였다.
Follow나 일정 초대의 경우 서버에서 알림을 보내주어야 하기 때문에 어떤 방법으로 알림을 수신해야 할지 고민하였고, FCM, WebSocket, Polling의 기술 중 어떤 방식으로 알림을 수신할지 결정하였다.
- WebSocket은 양방향 통신을 통해서 메세지를 수신받고 응답을 처리할 수 있지만, 앱이 백그라운드에 있거나 종료되어 있는 경우 알림을 수신할 수 없는 단점이 있다.
- Polling은 앱이 백그라운드에 있거나 종료되어 있어도 알림을 수신할 수 있지만, 주기적으로 서버에 요청을 보내거나 연결을 유지하면서 알림을 가져오기 때문에 서버에 부하가 가고, 배터리 소모 문제도 발생한다.
- FCM은 앱이 백그라운드에 있거나 종료되어 있어도 알림을 수신할 수 있고, 디바이스의 고유한 토큰을 부여하고, 이를 통해 알림을 수신하기 때문에 효율적이지만, 알림 전달이 지연될 수 있고, 알림이 중간에 유실될 가능성이 있다.
이 기술들 중에서 FCM을 선택하였다.
- 앱이 백그라운드에 있거나 종료되어도 Follow알림이나 일정 초대 알림은 Notification으로 전달 받을 필요가 있다.
- Polling처럼 지속적으로 서버에게 요청을 보내는 방법이 아니기 때문에 서버의 부하가 적다.
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의 공식 문서에서 찾아볼 수 있었다.
https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ko
data
와 notification
을 모두 보냈을 경우, Notification의 구현을 하지 않아도 자체적으로 Notification을 보여줄 수 있다는 장점이 있다.
하지만 data는 onMessageReceived에서 처리할 수 없고, Notification을 탭한 경우에만 데이터 페이로드를 처리할 수 있기 때문에 추가적인 처리인 일정 초대 수락 거절과 같은 기능을 구현하기에는 어려움이 있었다.
결국 앱이 백그라운드나 종료된 상태에서도 data
를 받기 위해서 data
와 notification
을 모두 송신하지 않고, data
만 송신하기로 하여 앱이 모든 상황에서 data
를 받을 수 있도록 하였다.
그리고 수신한 data
를 통해서 자체적으로 notification을 띄우고, 일정 초대의 경우 추가적으로 notification에서 바로 수락과 거절을 할 수 있는 action을 추가하여 팔로우와 일정 초대에 대한 알림을 구현하기로 하였다.
- Week1 - Day01
- Week1 - Day02
- Week1 - Day03
- Week1 - Day04
- Week2 - Day01
- Week2 - Day02
- Week2 - Day03
- Week2 - Day04
- Week3 - Day01
- Week3 - Day02
- Week3 - Day03
- Week3 - Day04
- Week4 - Day01
- Week4 - Day02
- Week4 - Day03
- Week4 - Day04
- Week4 - Day05
- Week5 - Day01
- Week5 - Day02
- Week5 - Day03
- Week5 - Day04
- Week6 - Day01
- Week6 - Day02