이번 포스팅은 삽질 포스팅이다.
무려 이 이슈 때문에 4일을 여러 가지 시도를 해보면서 고민해 봤던 거 같다.
우선 결론부터 말하자면 프론트 쪽을 바꿀게 아니라 백엔드 쪽을 바꿔야 한다.
나는 이것도 모르고 프론트에서 4일 동안 헤맸다.
# 문제 상황

내가 구현하려고 했던 로직이고 간단하게 그려보았다 여기서 문제 상황은 3~4번째 사이에서 문제가 일어났다.
푸시 메시지를 수신 시 자동으로 호출되는 onMessageReceived 메서드에서 노티 클릭 시 PendingIntent를 만들어 putExtra로 데이터를 SplashActivity에 넘겨주었다.
하지만 SplashActivity에서 getStringExtra로 값을 로그로 출력해 보면 값이 비어있었다.
여기서 나는 아래와 같은 시도들을 했다.
- 번들로 넘겨주기
- 전달받은 SplashActivity에서 onNewIntent 오버라이드 하여 전달받아보기
- onMessageReceived에서 바로 해당 Activity로 이동시키기
하지만 다 안되고 내가 내린 결론은 앱 실행중일 때는onMessageReceived를 잘 받아오는데 왜 Background일 때는 못 받아오지? 였다.
# 해결 방법
나는 처음에는 PendingIntent가 문제인가 싶어서 PendingIntent에 관한 구글링만 하였다. 하지만 전혀 되지 않았다.
그래서 위에서 내린 결론으로 그냥 단순하게 "fcm 백그라운드 수신"이라고 구글링을 해보았다.
그랬더니 내가 필요한 검색결과들이 나오면서 해결방법을 찾게 되었고 이제부터 찾은 방법을 공유해보겠다.
## 문제 상황의 발생 이유
파이어베이스 FCM 공식 문서에 보면 아래와 같이 작성이 되어있다.
Firebase 알림은 수신 앱의 포그라운드/백그라운드 상태에 따라 다르게 동작합니다. 포그라운드 앱이 알림 메시지 또는 데이터 메시지를 수신하도록 하려면 onMessageReceived 콜백을 처리하는 코드를 작성해야 합니다. 알림과 데이터 메시지의 차이점에 대한 설명은 메시지 유형을 참조하십시오.
나는 공식문서를 안 보고 작업을 했기 때문에 전혀 몰랐다..(공식문서의 중요성을 다시 한번 깨달았다)
아무튼 이유는 Firebase 알림은 수신 앱의 포그라운드/백그라운드 상태에 따라 다르게 동작하기 때문에 그랬다.
## Before
{
"to" : "토큰"
"notification" {
"title" : "테스트",
"body" : "테스트 입니다"
},
"data" : {
"message" : "Data 테스트"
}
}
}
보통 FCM을 보내는 백엔드 요청 양식은 위처럼 되어있다.
여기서 수정할 것은 notification키이다. notification키를 삭제하고 data에 필요한 정보들만 담아서 보내면 Foreground와 Background 동일하게 동작이 된다!
## After
{
"to" : "토큰"
"data" : {
"title" : "테스트",
"body" : "테스트 입니다"
"message" : "Data 테스트"
}
}
}
# 느낀 점
공식문서의 중요성을 다시 한번 느꼈고, 검색 키워드를 잘 잡아야 삽질하는 시간을 줄일 수 있다고 느꼈다..
이번 삽질로 인해 FCM 백그라운드에서 받는 방법을 다시는 안 잊어버릴 거 같아서 뿌듯하기도 하다!
참고
https://blogdeveloperspot.blogspot.com/2018/03/fcm-notification-foreground-background.html
https://firebase.google.com/docs/cloud-messaging/android/receive?hl=ko&authuser=2
https://ckbcorp.tistory.com/1115