0. FCM
푸쉬 알림이란 서버에서 모바일 장치에 보내는 알림 또는 메세지이다. 직접 구현한 서버에서 사용자 장치로 알림을 보내기 위해서는 앱과 서버의 연결을 지속적으로 유지해야 한다. 하지만 FCM(Firebase Cloud Messaging)은 구글 클라우드 서버를 이용해 앱에서 서버에 연결하지 않아도 기기의 내부 연결을 통해 메세지를 보낼 수 있다.
Firebase console 에서도 FCM token 을 넣어 푸쉬 메세지를 보낼 수 있지만, 서버와 연결한다면 이러한 과정을 거치게 된다.
1. FCM Message Type
when your app in background, the method onMessageReceived never invoked
FCM에서 보내는 메세지의 타입에 따라 앱의 포그라운드와 백그라운드가 서로 다르게 동작한다.
FCM 메세지 타입에는 총 세 가지가 있다.
- Notification
- Data
- Notification + data
FirebaseMessagingService를 상속받을 때 재정의하는 onMessageReceived()는 클라우드 서버에서 메시지를 전송하면 자동으로 호출되고, 콜백 메서드안에 RemoteMessage 객체가 온다. 이 메세지 객체안에는 data, notification, messageId 등이 있다.
2. Notification
클라이언트 앱이 백그라운드에서 실행 중일 때 FCM SDK가 앱을 대신하여 최종 사용자 기기에 메시지를 표시합니다. 그 외의 경우에는 알림이 수신될 때 앱이 포그라운드에서 실행 중이면 앱의 코드에 따라 동작이 결정됩니다. 알림 메시지에는 사용자에게 표시되는 사전 정의된 키 모음 및 맞춤 키-값 쌍의 데이터 페이로드(선택사항)가 포함됩니다.
여기서 fcm 콘솔에서 보내는 방식이 Notification 인데, 여기에 title, body를 담아서 보내준다. 포그라운드인 경우에 onMessageReceived로 가게 돼서 데이터 뽑아내서 쓸 수 있는데, 백그라운드일 경우에는 onMessageReceived로 가지 않고(notification을 쓰면 foreground일 때는 수신되지만 background일때는 수신 자체가 되지 않는다.) 시스템 Notification이 자동으로 title과 body를 뽑아와 푸쉬를 띄어주게 된다.
백그라운드에 있을 시 onMessageReceived 수신 자체는 되지 않지만 어쨌든 푸쉬 타입이 Notification이라면 포그라운드/백그라운드에 상관없이 System Notification이 자동으로 푸쉬 알림을 띄어주게 된다.
{
"notification": {
"title" : "title",
"body": "body",
"icon": "ic_notification"
}
}
3. Data
앱이 백그라운드에서 실행 중일 때 FCM SDK가 알림 표시를 자동으로 처리하게 하려면 알림 메시지를 사용하세요. 자체 클라이언트 앱 코드로 메시지를 처리하려면 데이터 메시지를 사용하세요.
클라이언트 앱이 데이터 메시지 처리를 담당합니다. 데이터 메시지에는 예약 키 이름 없이 커스텀 키-값 쌍만 있습니다.
만약 백그운드에서 푸쉬를 커스텀하고 싶다면 두 번째 방법인 Data 를 이용하여 커스텀해서 보내야한다.
커스텀하는 경우라면, 푸쉬 알림을 눌렀을 때 특정 액티비티로 이동해야 한다거나 특정 값을 받아서 처리해야하는 경우가 있을텐데 포그라운드라면 onMessageReceived 에서 수신하여 처리해줄 수 있지만 백그라운드라면 수신 자체가 되지 않으니 불가능하다. 수신이 되는 시점을 알 수가 없게 된다.
이 custom한 data를 보내기 위해서는 fcm 콘솔에서 바로 보낼 수 없고 서버에서 직접 구현해야한다. 푸쉬 타입이 data 라면, 앱이 데이터 메세지 처리를 담당할 수 있다. 예를 들어 액티비티를 실행하는데 사용된 인텐트에서 data 페이로드를 가져올 수 있다.
4. Notification + Data
알림 페이로드 표시는 FCM에서 처리하고 데이터 페이로드는 클라이언트 앱에서 처리합니다.
- 백그라운드 상태인 경우 알림 페이로드가 앱의 알림 목록에 수신되며 사용자가 알림을 탭한 경우에만 앱에서 데이터 페이로드를 처리합니다.
- 포그라운드 상태인 경우 앱에서 페이로드가 둘 다 제공되는 메시지 객체를 수신합니다.
5. 푸쉬 알림을 탭했을 때
푸쉬 알림을 탭했을 때 기본적으로 앱의 런처가 열린다.
포그라운드에서는 onMessageReceived()에서 수신해서 PendingIntent로 실행될 액티비티나 넘겨줄 값들을 커스텀하여 처리해주면 된다. 백그라운드에서는 공식문서에 아래와 같이 실행된다.
만약 data 페이로드가 포함되어있는 백그라운드로 수신된 메세지를 탭했을 경우 런처 활동의 인텐트로 전송된다.
따라서 런처 액티비티의 onCreate() 메소드안에서 intent.getExtras()를 이용하여 값을 가져와 원하는 동작을 지정해줄 수 있다.
참고자료
'🐸 Android' 카테고리의 다른 글
FCM Notification 1 - 안드로이드 13에서 Notification 권한 허가 변경 (0) | 2023.12.12 |
---|---|
[Android] 렌더링 관점에서 효율적인 ListAdapter (1) | 2023.09.07 |
[Android] Fragment의 LifeCycle과 viewLifecycleOwner 뜯어보기 (0) | 2023.08.13 |
[Android] 안드로이드의 Process와 Thread (0) | 2023.08.09 |
[Android] 안드로이드 로컬 데이터베이스에 데이터 저장 (0) | 2023.08.01 |