FCM 푸시를 보내고 해당 인텐트의 데이터를 받을때 지속해서 이전 알림 내용을 가져오는 경우가 있습니다.
분명 디버깅을 통해서도 sendNotification, onNewIntent 함수에서도 푸시 보낸 데이터가 유지되어 있는데
delegatePushNotification 함수에서는 Intent값이 달라지는 경우가 발생합니다.
정확히 말해서,, 최신화가 되지 않는 느낌입니다.
이러한 문제를 해결하려면 두 가지를 확인해야 합니다.
class KBFirebaseMessagingService : FirebaseMessagingService() {
companion object {
private const val TAG = "FirebaseMessaging"
}
private var pendingIntent: PendingIntent? = null
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
// [START receive_message]
override fun onMessageReceived(remoteMessage: RemoteMessage) {
SBLog.i(TAG, "From: ${remoteMessage.from}")
if (remoteMessage.data.isNotEmpty()) {
SBLog.i(TAG, "Message data payload: ${remoteMessage.data}")
sendNotification(remoteMessage.data)
}
// Check if message contains a notification payload.
remoteMessage.notification?.let {
SBLog.i(TAG, "Message Notification Body: ${it.body}")
}
}
override fun onNewToken(token: String) {
SBLog.i(TAG, "Refreshed token: $token")
}
@SuppressLint("WrongConstant", "UnspecifiedImmutableFlag")
private fun sendNotification(map: Map<String, String>) {
val intent = Intent(this, MainActivity::class.java)
val dataJson = map["data"]
val data = SBJSON.parse(dataJson) as Map<String, Any>
val title = SBJSON.getStringValue(data, "title", "")
val body = SBJSON.getStringValue(data, "body", "")
SBLog.e(TAG,Constants.ARG_PUSH_DATA +"///"+SBJSON.toJSONString(data["bizParam"]));
if (data.containsKey("bizParam")) {
val bizParam = data["bizParam"] as HashMap<String, Any>
intent.putExtra(Constants.ARG_PUSH_DATA, SBJSON.toJSONString(bizParam))
}
// intent flags
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
// create pending intent
// FLAG_UPDATE_CURRENT
pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.getActivity(
this,
0 /* Request code */,
intent,
PendingIntent.FLAG_IMMUTABLE
)
} else {
PendingIntent.getActivity(
this,
0 /* Request code */,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
)
}
// create notification
val CHANNEL_ID = getString(R.string.notification_default_channel_id)
val CHANNEL_NAME = getString(R.string.notification_default_channel_name)
val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_stat_name)
// .setColor(ContextCompat.getColor(this, R.color.kb))
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// Since android Oreo notification channel is needed.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
CHANNEL_ID,
CHANNEL_NAME,
NotificationManager.IMPORTANCE_DEFAULT
)
notificationManager.createNotificationChannel(channel)
} else {
}
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build())
}
}
[해결책]
1. PendingIntent에서 Flag 셋팅값을 변경한다.
pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.getActivity(
this,
0 /* Request code */,
intent,
PendingIntent.FLAG_IMMUTABLE
)
}
else {
PendingIntent.getActivity(
this,
0 /* Request code */,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
)
}
마시멜로우 버전 이상
PendingIntent.FLAG_IMMUTABLE -> PendingIntent.FLAG_MUTABLE
마시멜로우 버전 미만
PendingIntent.FLAG_UPDATE_CURRENT
Immutable로 두게되면 푸시가 왔을때 이전에 온 것이 있다면 새로 뜨지 않고 PendingIntent를 유지하는 것입니다.
변경할 수 없기 때문에 데이터 유실에 대해 안정성이 있지만, 전송된 데이터(인텐트)에 대해서는 값이 유지되는 경향이 있어
빠른 업데이트가 되지 않는 문제가 있습니다.
예를 들어 "A라는 푸시 알림을 보냈고 그 다음 B라는 푸시 알림을 보냈다면, A 푸시에 대해 확인하지 않고 있다가 B가 왔을때,
A 푸시 상태가 지속해서 유지되기 때문에 B라는 최신 푸시에 대해 업데이트가 되지 않는 문제가 있을 수 있다는 점입니다."
2. Request Code를 고정해두지 않고 지속해서 변경을 해줘야 한다.
var requestCode = (System.currentTimeMillis() % Int.MAX_VALUE).toInt()
PendingIntent.getActivity (
this,
requestCode,
intent,
PendingIntent.FLAG_MUTABLE
)
다음과 같이 requestCode를 실시간으로 변경해준다면, PendingIntent는 실시간으로 고유한 요청 값을 갖기 때문에
앞서 보낸 알림과 지금 보낸 알림을 구분지어 업데이트합니다.
따라서 푸시 데이터가 업데이트가 되지 않는 문제는 없을 것입니다.
다음 두 가지 방법에 대해서는 직접 수행해보고 잘 이행되는 점을 확인해봤고 푸시 알림으로 들어온 데이터가 실시간으로
업데이트가 잘 되는 점을 확인했습니다.
감사합니다.
'Android' 카테고리의 다른 글
BottomNavigationView (0) | 2024.07.07 |
---|---|
Jetpack Compose란..? (2) | 2024.06.30 |
카메라/갤러리 기능 (0) | 2023.01.17 |
Firebase Messaging 관리 (2) | 2023.01.17 |
Kotlin 문법2 - Class (0) | 2023.01.17 |