일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Git
- 데이터바인딩
- VisualStudio
- bitbucket
- gradle
- 뒤로가기 안됨
- sourcetree
- WPF
- 인증문제해결
- Kotlin
- Android
- 리액트
- 안드로이드 스튜디오
- 예제
- react
- 개발환경설정
- AWS
- flutter
- 안드로이드
- 안됨
- react-native
- aPK
- Invalid credentials
- not working
- git인증
- 디버깅
- EC2
- 설정
- 리액트 네이티브
- 빌드 오류
- Today
- Total
물에 살고싶은 개발자
안드로이드 FCM 푸시 및 화면이동 시 주의할점(with navcontroller) 본문
언제나 그랫듯 선결론. 또한 미리 말하자면 이 글은 가이드가 아니다.
내가 겪은 삽질을 기반으로 내가 겪은 문제들에 대한 해결방법을 의식의 흐름대로 써내려간것이다.
자세한건 아래 쭉 읽어보시고, 핵심은 이 세가지 !
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 안에 내용들로 세팅되게 된다.
그 외에도 푸시의 데이터구조 타입에 따라 백그라운드에서도 푸시알림을 커스텀할 수 있는 경우가 있는데,
시간관계상 이 블로그 링크로 대체하고 이만 줄인다.
끘