Android FCM Data와 Notification

Data Message와 Notificiation Message의 차이

Harry The Great
해리의 유목코딩
5 min readDec 1, 2018

--

들어가기에 앞서

처음 Document를 읽고 테스트를 해보았을때는 잘 동작을 했습니다 하지만 Data를 처리해야할 일이 생길때부터 혼돈이 시작됩니다. 데이터를 보낼때 제가 예상했던것과 다르게 Notication이 동작하고 Document를 보면 볼수록 더 큰 혼돈에 빠지게 됩니다. 게다가 Doze 모드나 절전상태에서는 더 혼란스럽게 동작합니다.

Notification Message

Notification만 보내는 경우

Notification Message는 위와같이 Notification만 보내는 메세지입니다. 또한 우리가 Firebase Console에서 Cloud Message를 통해 보내는 경우에 해당합니다. 이 경우 메세지는 높은 우선순위를 가지며 디바이스가 잠자기 상태나 절전상태에 있더라도 Notification에 메세지가 표시됩니다.

앱이 백그라운드 상태에 있다면 시스템 트레이를 통하여 Notificiation이 표시가되고 포어그라운드 상태에 있다면 onMessageReceived를 통해 데이터가 처리됩니다.

Notification과 data를 함께 보내는 경우

Data와 Notifcation Message를 함께보낼때는 Data만 보냈을때와는 다르게 동작합니다. 포어그라운드 상태때는 동일하게 onMessageReceived를 처리가 되지만 백그라운드일때는 조금 다릅니다. 우선 Notification이 시스템 트레이를 통해 기기에서 표시가되고 onMessageReceived를 통해 data가 전달되지 않습니다.

사용자가 표시된 Notification을 탭한경우 앱이 실행되며 액티비티에서 getIntent를 통해서만 데이터를 수신받습니다. 하지만 사용자가 Notification을 지우거나 탭하지 않는다면 이때 함께 전달된 data는 앱에서 전달받을 수 없습니다.

Data Message

데이터 메세지는 클라이언트 앱에서 데이터를 처리해야하거나 혹은 커스텀된 알림을 보여줄때 사용합니다. 데이터 메세지는 Normal Priority를 기본으로 가지며 모바일 기기가 Doze상태 혹은 절전상태에 있을때 처리를 미루게됩니다.

onMessageReceived()을 통해 데이터를 처리해야하며 이 경우 짧은 시간의 처리기간을 가지게됩니다. 또한 4KB 이상의 Payload 제한을 가지기때문에 이 경우 Workmanger나 Job Schduler를 쓰는것이 바람직합니다.

Data Message의 Workflow

  • FCM을 통해 메세지를 전송합니다.
  • onMessageReceived에서 사용자에게 Nofication을 먼저 보여줍니다.
  • 수신받은 데이터를 처리합니다.
  • 사용자에게 먼저 보여준 Nofication에서 변동사항이 생긴다면 Notifcation을 업데이트합니다.

위와같은 Workflow를 구성하는것은 메세지를 처리하는도중 inactive가 될 수 있기때문에 변동사항에 대해 Notification해야하는 내용이 있다면 수신받은 즉시 메세지를 보여준 후 데이터를 처리한 후에 조금 전 보여준 메세지를 업데이트하는것이 바람직합니다.

만약 데이터의 처리가 끝나지 않았는데 앞서 보여준 메세지를 사용자가 탭하여 앱을 실행한경우 클라이언트에서 스케쥴링을 체크한 후 업데이트하여줍니다.

때때로 알림이 오지 않다가 핸드폰의 잠금을 풀었을때 오는 메세지들을 볼 수 있습니다. 이 경우 모바일에서 절전상태 혹은 Doze상태에서 Data Message의 처리를 미루었다가 잠금을 풀었을때 Data Message를 처리하는것입니다. 때문에 Data Message를 보낼때는 꼭 사용자 디바이스에서 Doze상태에 대해 고려해야합니다.(Doze 상태에대한 자세한 내용은 도큐먼트에서 확인할 수 있습니다.) Alarmy앱의 경우 갤럭시에서 설치시 사용자에게 절전모드 제외앱으로 설정하도록 안내 Dialog를 표시하고있습니다.

마치며

기존 GCM 레퍼런스는 많은데 반하여 FCM은 상대적으로 적고 또한 Data와 Message에 대해 상세하게 다룬 데이터를 찾기 힘들어 많은 삽질을 하였습니다. 저와 비슷한 난관에 봉착하신 분들이 이 글을 읽고 더 빠르게 문제들을 해결했으면 좋겠습니다.

도움이 되셨다면 Clap 한번씩 눌러주세요!

--

--

Harry The Great
해리의 유목코딩

Android & IOS Developer 😀 미디움 이외에 스니펫이나 디버그노트로 활용하는 https://www.harrymikoshi.com/ 블로그도 운영하고있습니다.