오늘 적어볼 주제는 내가 하루종일 고민했던 문제이다.
제목을 오해할 사람도 있을 것 같은데 설명을 추가하자면 앱이 백그라운드일 때 푸시 알림을 카카오톡처럼 받는 기능이다.
안드로이드 공식 사이트에서 부르는 이름은 헤드업 notification이다.
여기서 "카카오톡처럼이 뭔데;" 라고 할 사람은 보면 바로 이해할만한 스크린샷을 하나 준비했다.
이제 다들 내가 원한 기능을 이해했을 것이라 믿는다.
앱이 실행 중일 때는 헤드업 알림이 제대로 동작하는데 앱이 백그라운드로 진입 시 헤드업 알림이 오지 않았다.
여기서 수상했던 건 해당 앱의 알림 설정에 들어가 알림 카테고리를 확인하면 Miscellaneous라는 이름으로 알림이 왔다.
그리고 Miscellaneous를 클릭하면 앱 아이콘 배지 설정이 꺼져있었다.
물론 해당 설정을 켜주면 백그라운드에서도 헤드업 알림이 오지만 일반 사용자들에게 이 작업을 강요한다?
이런 미친 앱은 없을 것이라 생각했다.
아래는 이해를 돕기 위한 삼성 갤러리 앱의 알림 설정이다.
각 채널을 클릭하면 이미 '앱 아이콘 배지' 설정이 켜져 있을 것이다.
혹자는 '이거 그냥 되는거 아니냐? 기본적인 기능 하나도 못 만들고 뭐 대단한 거 해결한 것 마냥 글썼네'
라고 할 수도 있지만 나에겐 이런 경험이 처음이었다.
문제가 되는 지점을 가장 먼저 얘기해보자면 "서버 설정" 문제였다.
서버 설정이 문제가 될 게 있나? 라는 의혹을 제기하기 전에 나의 설정을 돌아보느라 엄청난 시간을 쏟았다.
쭉 나열해보자면,
- OS 13이상에서는 알림 권한이 제대로 적용되었나?
- google-services.json 파일을 제대로 넣어두었나? (위치 등)
- 내 경우, minSdkVersion이 26이라
무조건 notification에 channel을 만들어줘야 했는데 채널 생성을 제대로 했는가? - 채널 생성을 할 때 default 설정을 해줬는가? (Sound 혹은 Vibrate)
- 제대로 된 클래스를 사용했는가?
나는 파이어베이스 공식 문서와 똑같이 구현하기 위해
NotificationChannel, NotificationCompat.Builder, NotificationManager를 사용했다.
(이 녀석들은 Compat버전이 모두 존재하기 때문에 혼용하면 안될 것 같았다.)
파이어베이스에 게시된 깃허브 링크를 남긴다.
https://github.com/firebase/snippets-android/blob/d60225ad42a572f30a976459dc4c7a2ac82463f7/messaging/app/src/main/java/com/google/firebase/example/messaging/kotlin/MyFirebaseMessagingService.kt#L52-L64
내가 겪은 문제의 가장 중요한 파트였던 문서 링크를 남긴다.
https://firebase.google.com/docs/cloud-messaging/android/receive?hl=ko
여기서 한국어의 늪에 빠져버렸다.
해당 페이지의 데이터 처리 섹션에서 보이는 표를 보면
백그라운드에서 notification을 수신했을 때는 메시지를 작업 표시줄에서 처리한다.
하지만, 백그라운드에서 data를 수신했을 때는 onMessageReceived에서 처리한다.
포그라운드(앱 실행 중)에서는 notification, data 중 아무것이나 수신해도 onMessageReceived에서 처리한다.
그래서 푸시 알림을 서버 측에서 notification 타입으로 보내주면 헤드업 알림이 제대로 발생하지 않는 것이었다.
안드로이드에서는 data 타입으로 수신하여 해당 값을 가공해 알림을 사용자에게 보여주어야 한다.
다들 나같이 간단한 해결법에 시간을 많이 소모하지 않길 바라며 글을 마친다.
'Android' 카테고리의 다른 글
Codelab으로 DataBinding 알아보기 - 2. Add ViewModel data binding (0) | 2023.05.11 |
---|---|
Codelab으로 DataBinding 알아보기 - 1. 과정 소개 (0) | 2023.05.09 |
카카오톡 공유 앱 이름 바꾸기 (0) | 2023.05.06 |
Codelab으로 LiveData 알아보기 - 8. 정리(完) (0) | 2023.05.03 |
Codelab으로 LiveData 알아보기 - 7. Add the Play Again Button (0) | 2023.05.01 |