물에 살고싶은 개발자

안드로이드 FCM 푸시 및 화면이동 시 주의할점(with navcontroller) 본문

Android

안드로이드 FCM 푸시 및 화면이동 시 주의할점(with navcontroller)

돼지사랑 2022. 11. 8. 21:26

언제나 그랫듯 선결론. 또한 미리 말하자면 이 글은 가이드가 아니다. 

내가 겪은 삽질을 기반으로 내가 겪은 문제들에 대한 해결방법을 의식의 흐름대로 써내려간것이다.

 

자세한건 아래 쭉 읽어보시고, 핵심은 이 세가지 ! 

1. 백그라운드에서 푸시 커스텀하고싶다 ->  이 블로그 를 참고해 푸시메시지의 구조를 세팅한 후 커스텀하자

2. 백그라운드에서 푸시 클릭 시 푸시메시지에 들어있는 data는 펜딩인텐트에 실려서 시동 액티비티로 보내진다 !

3. navController를 사용하여 프래그먼트 위주의 앱 구조라면, 매니페스트에서 그래프가 있는 액티비티옵션에 android:launchMode="singleInstance" 를 추가해주자 

 

 

 

본격 TMI 삽질기록 시작!!

우리의 경우 푸시에 data 페이로드에 topic과 파라미터가 온다(게시글id 등)

그걸 전제로 글을 써보자면, 일반적인 가이드와 같이 fcm 연동을 하고 시작하겠다.

 

1. 인텐트에 data 삽입

이건 뭐 크게 설명할것도 없다. 어디로 보낼건지 액티비티 정해주고 (나같은경우는 뒤에 나오겠지만, 메인액티비티 위에 네비그래프가 있기에 메인액티비티로 보낸 후 메인액티비티에서 처리했다.) 그 인텐트에 데이터들 넣어준다. putExtra()ㄱㄱㄱㄱ

 

2. 인텐트 플래그 설정

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 이걸로 끝

 

3. 펜딩인텐트 생성

val pendingIntent = PendingIntent.getActivity(
            this, 0 /* Request code */, intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )

이렇게 해준다. 눈여겨볼것은 FLAG_UPDATE_CURRENT 를 같이 추가해줘야 펜딩인텐트가 업데이트된다.

다른 방법이 있을지도 모르겠지만 나의 경우는 필수라고 할수있다.

 

4. 푸시알림 커스텀 

NotificationCompat.Builder(this, channelId) 을 이용해 타이틀,내용,사운드,아이콘 등등 커스텀할것들 커스텀해주고

3번에서 만든 펜딩인텐트를 .setContentIntent(pendingIntent) 로 세팅해준다. 이걸 해줘야 액티비티에서 데이터를 받음

 

5. 인텐트로 데이터를 받고 화면이동을 시킬 액티비티에 해당코드 세팅

일단 매니페스트에서 해당 액티비티에 android:launchMode="singleInstance" 이 옵션을 추가해준다. 이게 없을 경우

중복으로 발생하기때문에, navController를 컨트롤하거나 하는 경우 뷰가 세팅이 제대로 안된다던가 하는 에러로 앱이 뻗을 수 있다. 필자도 이거땜에 두어시간은 개고생한듯..꼭 해주자..

 

6. 액티비티 내부에 화면이동 로직 코딩하기

필자의 경우는 when에 topic을 넣고 종류별로 분기를 친 다음 인텐트 혹은 navController를 통해 화면이동 시켜줫다. 물론 파라미터가 필요한 경우 (맨위에서 말한 게시글id 등) 번들로 넣어주든 AppPreference에 세팅하든 했다. 

여기선 평범하게 각 프래그먼트들간에 이동하듯 해도 무관했다. 

다만, 이건 내가 이번에 했던 프로젝트가 그랬던것이지 그래프를 들고있는 액티비티가 많다던가 하는 경우엔 분기를 더 꼼꼼하게 해야할 수도있다. 

 

7. 백그라운드 푸시알림도 대비하기 

포어그라운드에선 1~6이면 충분히 처리가 되는데, 백그라운드에서는 펜딩인텐트가 데이터를 못가져오는 문제가 발생했다. 해당내용에 대해 구글링하다보니 아주 단순하게도 앱 시작 시 가장 먼저 호출되는 액티비티

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

요 두가지를 인텐트필터안에 갖고있는 액티비티에 알아서 data 페이로드에 있는 데이터들이 전달된다는것..!!

푸시알림 커스텀에 대해서는 자동으로 notification 안에 내용들로 세팅되게 된다. 

 

그 외에도 푸시의 데이터구조 타입에 따라 백그라운드에서도 푸시알림을 커스텀할 수 있는 경우가 있는데,

시간관계상 이 블로그 링크로 대체하고 이만 줄인다.

 

Comments