동아리 프로젝트에서 FCM 알림을 사용하며 찾아보고자 했던 자료들이 꽤 있었다.
하지만 여기저기 흩어져있고 정작 필요했던 정보들은 충분하지 않아, 결국 직접 다 로깅해보며 해결했고
이러한 정보가 필요한 누군가가 시간을 아끼길 바라는 마음에 총 정리를 해보려한다.
1. 가급적이면 Notification이 아닌 Data를 사용하자
앱이 Background에서도 FCM을 통한 화면전환, 즉 데이터 수신이 필요하다면 Data를 사용하자.
푸시 알림에 보여지는 Title과 Body는 Data에 동일한 이름으로 넣으면 된다.
Notification만을 사용하면 데이터 수신이 안 되고,
Notification + Data를 사용하면 백그라운드에서 Notification이 즉시 수신됨으로 인해 같이 담겨오는 Data가 휘발되는 것 처럼 보였다.
그리고 내 경우엔 푸시를 터치했을 시 앱이 열리지 않았다.
Data를 사용하자.
2. 백그라운드에서 푸시알림으로 넘어오는 데이터는 'intent-filter'의 category가 Launch인 액티비티로 들어온다.
즉, 일반적으로 열었을 때 맨 처음으로 보여지는 화면의 intent로 수신된다.
보통의 경우 Splash화면일 것이고, getIntent().extras?.get타입() 과 같은 형태로 수신 가능하다.
3. 포그라운드에서 푸시알림 클릭시 즉시 전환은 pendingIntent를 사용하면 된다.
val pendingIntent = PendingIntent.getActivity(this, (System.currentTimeMillis()).toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT)
중간에 파라미터로 들어가는 intent에 전환을 원하는 Intent를 파라미터로 넣어주면 된다.
첫 번째의 'System.currentTimeMills()' 의 경우는 푸시알림의 ID이다.
여기에 0 등으로 획일화해도 되지만, 그렇게 되면 푸시 알림이 쌓이지 않는다.
쉽게 생각하면 Set의 자료 구조형처럼 중복되는 ID의 푸시알림을 허용하지 않는다고 생각하면 되겠다.
그리고 NotificationManager의 notify() 의 ID값 역시 동일하다.
이 두 가지의 모두를 각 푸시알림만의 고유값으로 줘야 알림들이 쌓이고, 개별적으로 동작한다.
4. FCM Token 혹은 Device Token은 갱신주기가 없다.
FCM을 사용하려면 서버에 기기별 토큰을 저장해야하고, 그걸 언제 저장할지에 대한 고민도 있을것이다.
FCM토큰은 자체적인 갱신이나 생명주기가 없다.
사용자가 앱을 제거, 데이터를 제거하거나 다른 기기에서 로그인 등
현재 사용중인 기기에서 내 앱의 데이터가 변동되는 일이 있지 않는 이상 항상 동일하다.
5. 서버에서 내려주는 사진을 FCM의 LargeIcon으로 사용하고자 할 때
인스타그램 알림처럼 서버에서 내려주는 특정 사진 (인스타는 게시글의 첫 사진을 내려준다.) 을 사용하고 싶다면
BitmapFactory.decodeStream(URL(서버에서 넘어온 사진 URL).openConnection().getInputStream())
와 같이 사용하면 Bitmap 형식으로 변환되어 잘 보여진다.
6. FCM 토큰을 받아오고 싶다면
FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
if (task.isSuccessful) {
Log.e("----", "getFCMToken: ${task.result}")
}
}
위의 코드의 isSuccessful 안의 task.result에 해당 기기의 FCM Token이 담겨온다.
토큰을 받아와서 서버로 보내야할 때 사용하자.
FCM을 적용하고자 하는 모든 사람들의 모든 궁금증이 이 짧은 글로 다 풀리지는 않겠지만..
그래도 이 조촐한 모음집으로 누군가의 구글링이 조금이라도 줄어들었으면 좋겠다.
'[개발] > [안드로이드_이슈 일기]' 카테고리의 다른 글
[Android] ErrorBody 핸들링하기 (0) | 2023.10.14 |
---|---|
[Android] 카카오맵 SDK 사용시 간헐적으로 마커가 흰 박스로 보이는 현상 (1) | 2023.09.05 |
[Android] local.properties의 값 Manifest에서 사용하기 (2) | 2023.08.09 |
[Android] Fragment별 ViewModel? (1) | 2023.07.30 |
[Android] 멀티파트로 String 전송시 " 가 붙던 오류 트러블슈 (0) | 2023.07.30 |