TAE

[android/Kotlin] 푸시 메시지 구현 - 푸시 메시지 구현(이미지 푸시, 긴글 푸시) 본문

android/코드

[android/Kotlin] 푸시 메시지 구현 - 푸시 메시지 구현(이미지 푸시, 긴글 푸시)

tg-world 2023. 3. 22. 20:06
반응형

이번 포스팅에는 기본 노티피케이션, 큰 텍스트 블록 추가(긴 글 메시지 푸시), 이미지 노티피케이션에 대하여 포스팅해보겠습니다.

확장형 알림이라고도 하며, 확장형 알림에 관한 문서는 아래에서 확인하시면 됩니다.

https://developer.android.com/training/notify-user/expanded?hl=ko#image-style

 

확장형 알림 만들기  |  Android 개발자  |  Android Developers

확장형 알림 만들기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 기본 알림에는 일반적으로 제목, 텍스트 행, 사용자가 응답으로 실행할 수 있는 하나 이

developer.android.com

구현내용

 


- 기본 노티피케이션

-  큰 텍스트 블록 추가(긴 글 메시지 푸시)

- 이미지 노티피케이션


코드

NotificationType.kt

enum class NotificationType(val title: String?, val notificationId : Int) {
    NORMAL("일반",0),
    EXPANDABLE("확장형",1),
    IMAGE("이미지",2)
}

MyFirebaseMessagingService.kt

class MyFirebaseMessagingService : FirebaseMessagingService() {
    companion object {
        private const val CHANEL_NAME = "myChanel"
        private const val CHANNEL_DESCRIPTION = "myChanel"
        private const val CHANNEL_ID = "Chanel ID"
    }

    override fun onNewToken(token: String) {
        super.onNewToken(token)
        Log.d("firebase","token==$token")
        //토큰이 변경 될 경우 작업
    }

    override fun onMessageReceived(message: RemoteMessage) { //메시지 처
        super.onMessageReceived(message)
        //8.0 이상일 경우 채널 생성
        //채널은 앱 실행할 때 생성 하는 것이 좋음
        createNotificationChannel()

        val type = message.data["type"]?.let {
            NotificationType.valueOf(it)
        }

        if (type != null) {
            NotificationManagerCompat.from(this)
                .notify(type.notificationId, createNotification(type, message))
        }

    }

    private fun createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel =
                NotificationChannel(CHANNEL_ID, CHANEL_NAME, NotificationManager.IMPORTANCE_HIGH)
            channel.description = CHANNEL_DESCRIPTION

            val notificationManager =
                getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(channel)
        }
    }

    private fun createNotification(type: NotificationType, message: RemoteMessage): Notification {
        val title = message.data["title"]
        val notificationMessage = message.data["message"]
        val imageUrl = message.data["imageUrl"]

        val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(notificationMessage)
            .setPriority(NotificationCompat.PRIORITY_HIGH)

        when (type) {
            NotificationType.EXPANDABLE -> {
                notificationBuilder.setStyle(
                    NotificationCompat.BigTextStyle().bigText(notificationMessage)
                )
            }
            NotificationType.IMAGE -> {
                val futureTarget = Glide.with(this)
                    .asBitmap()
                    .load(imageUrl)
                    .centerCrop()
                    .submit()

                val bitmap = futureTarget.get()

                notificationBuilder
                    .setLargeIcon(bitmap)
                    .setStyle(
                        NotificationCompat.BigPictureStyle()
                            .bigPicture(bitmap)
                            .bigLargeIcon(null)
                    )
            }
            else -> {}
        }
        return notificationBuilder.build()
    }
}

onNewToken

app마다 고유한 token값이 있는데 이 token값이 변경될 때 호출됩니다.

token값이 변경되는 케이스는 아래 케이스 일 경우 변경됩니다.

1. 새 기기에서 앱을 설치했을 경우

2. 기존 기기에서 앱을 제거/재설치했을 경우

3. 기존 기기에서 앱 데이터를 삭제했을 경우 등

 

onMessageReceived

실질적으로 메시지 처리가 되는 곳입니다.

안드로이드 8.0 단말 이상부터는 notificationChannel을 생성하여야 합니다.

 

createNotificationChannel

채널을 생성하는 메서드이며 ChannelID, ChannelName, importance(중요도)를 넘기며

중요도는 아래 표와 같이 구성되어 있습니다.

createNotification

메시지 처리를 위한 메소드이며 enum클래스에서 정의한 type과 bundle data인 RemoteMessage를 인자로 넘겨줍니다.

val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
    .setSmallIcon(R.mipmap.ic_launcher)
    .setContentTitle(title)
    .setContentText(notificationMessage)
    .setPriority(NotificationCompat.PRIORITY_HIGH)

setSmallIcon : 노티피케이션에서 표시될 아이콘

setContentTitle : 타이틀 표시

setContentText : 메시지 내용 표시

setPriority : 중요도 표시

 

기본적으로 알림 메시지를 구성후 타입별로 추가 구성을 하여줍니다.

확장형 알림일 경우

notificationBuilder.setStyle(NotificationCompat.BigTextStyle().bigText(notificationMessage))

setStyle로 BigTextStyle().bigText를 넘겨주며 bigText인자로는 사용하실 메시지 내용을 넘겨줍니다.

 

이미지일 경우

Glide로 imageUrl을 받아 bitmap으로 만든 후 BigPictureStyle().bigPicture(bitmap)으로 만들어준 bitmap을 넘겨줍니다.

 

마지막으로 notificationBuilder.build()를 return 하여 줍니다.

 

 

https://firebase.google.com/docs/cloud-messaging/android/receive?hl=ko

 

Android 앱에서 메시지 수신  |  Firebase 클라우드 메시징

Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기 의견 보내기 Android 앱에서 메시지 수신 컬렉션을 사

firebase.google.com

 

 

반응형
Comments