[Android] FCM 메시지 동작의 이해 : Notification과 Data 차이점 정리
Firebase Cloud Messaging(FCM) 은 모바일 앱과 서버 간에 메시지를 전송하는 강력한 도구입니다.
FCM에서 메시지는 크게 Notification 와 Data Payload 로 나뉩니다.
이 두 가지는 각각 다른 방식으로 동작하고, 앱에서 호출되는 메소드도 다릅니다.
이를 이해하려면 먼저 각 메시지의 특성과 동작 방식을 파악해야 합니다.
Notification
Notification 은 주로 사용자에게 표시되는 푸시 알림을 위해 설계되었습니다.
메시지가 FCM 서버에서 클라이언트 앱으로 전송될 때 FCM이 자동으로 메시지를 처리하여 알림을 표시합니다.
이 메시지는 백그라운드 상태 또는 포그라운드 상태에서 다르게 동작합니다.
- 백그라운드 상태
- 앱이 백그라운드에 있거나 종료된 경우, 메시지는 FCM SDK에 의해 자동으로 처리됩니다.
- 알림이 기기의 작업 표시줄로 전송되며, 사용자가 알림을 탭하면 기본적으로 앱 런처가 실행됩니다.
(별도의 코드를 작성할 필요가 없습니다.)
- 포그라운드 상태
- 앱이 실행 중인 경우, 알림은 자동으로 표시되지 않습니다.
- 메시지가 onMessageReceived 메서드로 전달되며, 개발자는 원하는 방식으로 사용자에게 알림을 표시해야 합니다.
Data
Data 는 앱에서 더 복잡한 작업을 수행할 때 사용됩니다.
클라이언트로 전달되는 데이터는 개발자가 직접 처리하며, 메시지 페이로드의 모든 내용이 앱에서 접근 가능합니다.
Data 는 앱의 백그라운드 상태와 포그라운드 상태에서 동일하게 동작합니다.
- onMessageReceived 호출
- Data Payload 는 항상 onMessageReceived 메서드를 호출합니다.
- 앱이 백그라운드에 있거나 포그라운드에 있어도 FCM이 직접 메시지를 처리하지 않고 앱으로 전달합니다.
또한 FCM 는 Notification 과 Data Payload 를 함께 포함한 메시지를 보낼 수도 있습니다.
만일 Notification 와 Data Payload 를 동시에 사용하는 경우에는 앱이 백그라운드에 있을때
Notification 는 기기의 작업 표시줄로 전송되고 Data Payload 는 런처 활동의 인텐트 부가 정보로 전송됩니다.
onMessageReceived 수신
FirebaseMessagingService.onMessageReceived 메서드를 재정의하면 수신된 RemoteMessage 객체를 기준으로 작업을 수행하고 메시지 데이터를 가져올 수 있습니다.
override fun onMessageReceived(remoteMessage: RemoteMessage) {
// Check if message contains a data payload.
if (remoteMessage.data.isNotEmpty()) {
}
// Check if message contains a notification payload.
remoteMessage.notification?.let {
}
}
onMessageReceived 가 제공된 모든 메시지는 수신된 지 20초(Android Marshmallow의 경우 10초) 이내에 처리되어야 합니다.
onMessageReceived 호출 전에 발생하는 OS 지연에 따라 이 시간이 더 짧아질 수도 있습니다.