FCM 푸시 알림 쌓일 때

Seok-woo Kim·2020년 8월 25일
0

안드로이드

목록 보기
1/9

1. 문제

최근 이직 후 수습기간이라 여유롭게 코드분석 위주로 업무를 보고 있는데, 급하지만 아주 간단한 문제들 몇개를 해결하다보니 점점 묵혀왔던 문제들도 분석좀 해달라는 요청이있었다. 그 중 하나가 특정 토픽에 대한 FCM 알림이 계속 중복해서 쌓이다보니 최신 알림은 못보는 경우가 있다고 했다.

2. 요구사항

특정 토픽에 대해 알림창을 재사용하도록 수정해달라는게 요구사항 이었고, 알림창을 재사용하는 앱들이 많았기에 어렵지 않을거란 판단이 들었다.

3. 수정과정

가장 먼저 확인할 수 있는건 역시 Firebase 공식 문서였고, 문서에서 FCM 메시지 형태와 각 필드설명만 읽어봐도 해결이 가능할 정도였다.

1) 백그라운드
FCM 메시지를 JSON으로 만들어 Restful Api로 쏘면 앱의 알림창에서 Json Body의 notification 오브젝트에서 title과 body를 가져와 표시를 한다.
여기서 알림창을 재활용해 새로운 알림으로 업데이트 하고 싶으면 notification 오브젝트 안에 tag 항목만 추가해주면 된다. tag가 같으면 계속해서 알림이 쌓이지 않고, 이전 알림창을 업데이트 하는 방식으로 진행된다.

2) 포그라운드
포그라운드 상태의 경우 FCM메시지를 수신하게되면, 앱에서 등록한 서비스의 onMessageReceived가 무조건 호출되게되고, 여기서 메시지의 데이터를 읽어와 코드로 알림창을 만들어 표시를 해줘야한다.
여기서 메시지를 알림창에 표시할때 id는 필수로 설정하고, tag는 옵션인데, 기본적으로 id가 같으면 알림창을 업데이트하도록 돼있으나 notification 블럭에 tag값이 들어가있기때문에 tag와 id값이 모두 일치되도록해야 백그라운드든 포그라운드든 알림을 수신하면 업데이트되도록 할 수 있다.

4. 추가

FCM 메시지 Json body에 data블록과 notification블록이 함께 있으면 백그라운드시 서비스의 onMessageReceived가 호출되지 않는다.
백그라운드 상태에서 FCM 메시지 수신시 onMessageReceived를 호출하고 싶으면 notification블록은 삭제하고 data 블록만 송신해야 한다. 물론 이렇게되면 백그라운드상태일때 메시지 수신시 코드로 알림창을 생성하지않으면 사용자는 메시지를 수신한지 모른다.

profile
안드로이드 개발자 (6년 ~ )

1개의 댓글

comment-user-thumbnail
2021년 4월 24일

카톡처럼 중첩해서 오는게 tag를쓰면 되는거였군요^^ 한 수 배워갑니다.

답글 달기