FCM notification 삽질

timothy jeong·2022년 3월 2일
0

Android 개발 기록

목록 보기
4/8

삽질 리스트

  • [삽질 1] 서버와 클라이언트는 동일한 파이어베이스 콘솔에 속해있어야 한다. 너무 당연하게도...
  • [삽질 2] data only 메시지가 앱이 백그라운드일때와 포어그라운드일 때 동일한 결과를 보장한다.
  • [삽질 3] notification 클릭시 원하는 액티비티를 원하는 intentExtra 값으로 실행하려고 고생을 했다.

상세 내용

[삽질 3] notification 클릭시 원하는 액티비티를 원하는 intentExtra 값으로 실행하려고 고생을 했다.

나는 모든 푸시 클릭시 LoginActivity 로 도달 후, intentExtra 의 데이터에 따라 다른 화면으로 넘어가도록 하였다.
서비스 특성상 회원 인증을 요구하는 화면이 많기 때문에 로그인 과정을 먼저 거치도록 한 것도 있지만, 찾아본 자료 중에 특정한 경우에 대해서는 android.intent.category.LAUNCHER 로 지정된 액티비만 실행시킨다는 글을 보았었고 LoginActivity 를 LAUNCHER 로 지정하였기 때문이다.

이때 LoginActivity 에서 onNewIntent 콜백을 override 하였지만, 로그를 찍어본 결과 해당 콜백이 호출된 적이 없었기 때문에 내일 추가로 확인이 필요하다.

확인한 결과 notification 을 클릭했을 때 해당 activity 를 onCreate 콜백부터 시작시키기 때문에 이에 이를 인지해두고 설계해야한다. 어쩌면 펜딩인텐트 생성시 인텐트에 줬던 플레그 때문일지도 모르겠다.

그리고 모든 문제를 해결해줬던건 펜딩 인텐트의 플레그였다.

코드로 보자면, FirebaseMessagingService 의 onMessageReceived() 함수 쪽에는 아래의 함수를 통해 notificationBuilder 에 PenddingIntent 를 더했다.

 private fun addPendingIntent(
        builder: NotificationCompat.Builder, pushIdx: Int, data: Map<String, String>) {
        val loginIntent = Intent(this, LoginActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_NEW_TASK

            // intent 에 데이터 집어넣기 (ex putExtra(..., ...))
        }

        val pendingIntent = PendingIntent.getActivity(
            applicationContext,
            pushIdx,
            loginIntent,
            PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
        )
        builder.setContentIntent(pendingIntent)
    }

이때 PendingIntent.FLAG_UPDATE_CURRENT 플래그를 더하니까 모든 문제가 해결되었다. penndingIntent 자체에 대한 공부가 부족한것 같다.
공부한 내용

profile
개발자

0개의 댓글