새소식

Android

푸시알람 24개 이상 띄워져서 최신 푸시가 안보일 때 해결방법

  • -

클라이언트에게 배포할 앱을 개발하며 문제가 생겼었다.

 

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() 해서 여유공간을 만들어주는 방법이다.

 

해당 기능을 추가한 이후로는 더이상 푸시가 안온다는 얘기를 듣지 않게되었다!

 

물론 이 기능은 서비스의 특성상 오래된 푸시가 사라져도 무방해서 적용된 케이스로 상황마다 다를 수 있으니 참고만 해도 되겠다.

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.