클라이언트에게 배포할 앱을 개발하며 문제가 생겼었다.
5분단위로 푸시가 발송되는데 어느순간 최신푸시가 안오고 멈춘다는 것이었다.
Android 10(Q - API29) 부터 기존 50개에서 24개로 줄어들었다는 내용이 검색되긴 하는데 확신하진 못하겠다..
테스트폰은 갤럭시 s10, flip4 그리고 기종은 잘모르는 클라이언트 폰들인데
공통적으로 24개이상일 때 푸시가 갱신이 안되는다는 내용이었다.
해결법은 간단하지만 서버에서도 작업을 해줘야 한다.
1. 서버파트
회사에서는 node.js + typescript 를 이용하고 있기지만 그리 어렵지 않게 이해할 수 있을 것이다.
const message: TokenMessage = {
data: pushData,
token: doc['fcmToken'] as string,
notification: {
title: pushData['title'],
body: pushData['contents'],
},
apns: {
payload: {
aps: {
contentAvailable: true,
sound: 'default',
},
} as ApnsPayload,
},
android: {
priority: 'high',
},
};
if (Object.keys(pushTokenInfo).includes('platform') && pushTokenInfo.platform === 'android') {
delete message.notification;
}
안드로이드 소스에서 notification를 받기위해 구현하는 FirebaseMessagingService 서비스에서 백그라운드로 접근해야 하기때문에 platform === android 일때는 notification 속성 대신 data 속성만 보내야 한다.
2. 안드로이드파트
Service가 백그라운드에서 notification를 인식할 수 있게 data 속성만 존재하게 되었으니 remoteMessage.data 로 push 데이터를 접근하면 된다.
package com.wisesolution.modl
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
super.onNewToken(token)
...
}
override fun onMessageReceived(remoteMessage: RemoteMessage) {
showNotification(this, remoteMessage.data)
...
}
}
fun showNotification(context: Context, data: Map<String, Any?>) {
...
removeOldestNotification(context)
...
notificationManager.notify(...)
}
fun removeOldestNotification(context: Context) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val activeNotifications = notificationManager.activeNotifications
for(i in 0 until activeNotifications.size - 23) {
activeNotifications.minByOrNull { noti ->
noti.postTime
}?.let {
notificationManager.cancel(it.id)
}
}
}
이후 fun removeOldestNotification() 을 보면 notificationManager.activeNotifications 으로 현재 알림창에서 확인할 수 있는 notification 목록을 가져올 수 있다.
이 후 noti.postTime 값 중 가장 오래된 notification 을 찾아 cancel() 해서 여유공간을 만들어주는 방법이다.
해당 기능을 추가한 이후로는 더이상 푸시가 안온다는 얘기를 듣지 않게되었다!
물론 이 기능은 서비스의 특성상 오래된 푸시가 사라져도 무방해서 적용된 케이스로 상황마다 다를 수 있으니 참고만 해도 되겠다.