250117 TIL

나고수·2025년 1월 17일
0

2025 TIL

목록 보기
4/11
post-thumbnail

안드로이드에서 FCM 알림이 여러개 쌓여있을때 가장 마지막 알림의 데이터로 처리되는 이슈

[발생 상황]
fcm을 받으면 notification.data를 받아서 그 data를 메인액티비티 extra로 전달하고 메인액티비티에서 해당 데이터를 가져와서 처리함

예를들어 아래와 같은 3개의 fcm이 와서 알림 3개가 쌓여있다고 가정하자

  • 'home1'이라는 데이터가 들어있는 fcm 1 -> 가장 처음 수신받음
  • 'home2'이라는 데이터가 들어있는 fcm 2 -> 두번째로 수신받음
  • 'home3'이라는 데이터가 들어있는 fcm 3 -> 가장 마지막에 수신받음

이 상황에서 fcm1,2를 클릭해도 각각 home, home2라는 데이터를 가져와서 처리하지않고 가장 마지막에 수신받은 fcm3이라는 데이터를 가져와서 처리하는 이슈 발생

[발생 원인]
메인액티비티로 이동하면서 데이터를 extra로 전달하는 pendingIntent를 만들때 flag에는 'FLAG_UPDATE_CURRENT'을, requestCode는 다 같은 값을 주었기 때문이다.

requestCode는 공식문서에 의하면 'Private request code for the sender' 인데 쉽게 설명하면 pendingIntent를 구분하는 id라고 생각해도 된다.

FLAG_UPDATE_CURRENT는 기존 intent가 있으면 기존 intent를 사용하되 extra 데이터만 변경하는 flag이다.

즉, 새로운 알림이 오면 이미 requestCode가 동일한 기존 pendingIntent가 있기 때문에 이것을 사용하되, extra만 (home1,2,3)만 변경하는 방식으로 작동했던 것이다.

위의 예시처럼 알림을 3개 받는 동안, extra가 매번 새로 수신받은 알림의 data로 변경되면서 결국에는 어떠한 알림을 클릭해도 가장 마지막으로 수신받은 알림의 data를 사용해 처리되었던 것이다.

[해결]
requestCode에 모두 다른 값이 들어 갈 수 있도록 알림을 받은 시간을 설정하여 알림을 받을 때 마다 다른 pendingIntent가 만들어지도록 수정하였다.

 PendingIntent.getActivity(
   this @MyFirebaseMessagingService,
   System.currentTimeMillis().toInt(), //👈
   intent,
   PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
 )
profile
되고싶다

0개의 댓글