Monday, March 26, 2018

FCM 적용시 앱이 foreground background 상관없이 동일하게 onMessageReceived 동작하도록 하는 방법

FCM에서 앱이 백그라운드일 때 onMessageReceived 메소드를 활용하는 방법

FCM(Firebase Cloud Messaging)을 사용하다 보면, 앱이 백그라운드 상태일 때 onMessageReceived 메소드가 호출되지 않는 문제에 직면할 수 있습니다. 이런 경우, 알림(notification)을 관리할 수 없게 되는데, 이 문제의 해결책은 간단합니다.

서버에서 메시지를 보낼 때의 구조 변경

문제를 해결하기 위한 핵심은 서버(server side)에서 메시지를 보낼 때 'notification' 키 대신 'data'만을 사용하는 것입니다. 기존에는 아래와 같은 구조로 데이터가 전송되었습니다:

{
  "notification": {//..},
  "data": {//..}
}

위의 구조에서 'notification' 부분을 제거하고 오직 'data'만 남기면 다음과 같습니다:

{
  "data": {//..}
}

메소드 통제 가능성

'data'만을 사용하여 서버에서 메시지를 보내게 되면, 앱이 포그라운드(foreground) 혹은 백그라운드(background) 상태와 관계없이 onMessageReceived 메소드에서 통제가 가능해집니다.

FCM과 관련된 세 가지 종류의 메세지

FCM은 전송된 메세지에 포함된 키에 따라 총 세 가지 종류의 메세지 형식이 있습니다: notification 메세지, data 메세지, 그리고 notification + data 조합의 복합형태입니다. 만약 notification 정보가 포함되어 있다면, 자동으로 notification이 띄워집니다. 이때 개발자는 해당 과정을 제어할 수 없게 됩니다.


2 comments:

  1. 안드로이드에서 키값을 data로 교체하니 포,백그라운드에서 모두 정상적으로 동작합니다. 하지만 앱이 실행되지 않았거나, 메모리에서 내려갔을 경우 푸시를 보내면 앱이 중지된다고 나옵니다...혹시 이럴경우 어떻게 해결해야 하는지 궁금합니다.

    ReplyDelete