네이티브 | 안드로이드에서 파이어베이스 푸시메시지에 대한 모든것
페이지 정보
작성자 강석호 조회13,628회 댓글0건본문
파이어베이스 푸시메시지를 받으면 앱 내부에 FirebaseMessagingService() 클래스를 상속받는 클래스를 만들고 onMessageReceived() 함수를 오버라이딩 해야 합니다.
서버에서 전달 된 푸시메시지는 onMessageReceived() 함수로 전달 되게 되는데 가끔 백그라운드에서 onMessageReceived() 함수의 매개변수인 RemoteMessage 를 받지 못할 때가 있습니다.
이때는 서버측에서 메시지를 보내는 키 타입 2개 중(data, notification) notification을 삭제하고(꼭 삭제 해야함) data로만 보내야 백그라운드에서도 푸시 데이터를 받을 수 있습니다.
참고 사이트 : https://blogdeveloperspot.blogspot.com/2018/03/fcm-notification-foreground-background.html
그리고 안드로이드 8버전(오레오) 이후 부터는 notification channel을 생성 해 주어야 합니다.
channel은 간단히 설명하자면 알림 종류를 묶어놓는 카테고리라고 보시면 됩니다.
위 사진을 보시면 각 용도에 맞는 알림을 수신할지에 대한 여부를 설정할 수 있는데 각 항목이 channel이 되는 것입니다.
channel은 한번 생성이 된 이후는 앱 삭제 혹은 코드에서 강제 삭제 하지 않는 이상 삭제되지 않습니다. 그래서 만약 쓰지 않는 채널이 있다면 코드에서 직접 삭제를 하셔야 합니다.
private fun createNotificationChannel(context: Context, importance: Int, showBadge: Boolean,
name: String, description: String) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channelId = "${context.packageName}-$name"
val channel = NotificationChannel(channelId, name, importance)
channel.description = description
channel.setShowBadge(showBadge)
val notificationManager = context.getSystemService(NotificationManager::class.java)
notificationManager.createNotificationChannel(channel)
}
}
채널은 위 소스와 같이 만들 수 있습니다.
- Channel Id : 앱마다 unique한 ID를 생성해야 하며, 길면 잘릴 수 있습니다.
- Channel Name : 사용자에게 보여지는 채널의 이름입니다.
- Channel Importance: 채널이 중요도를 의미하며, IMPORTANCE_DEFAULT, IMPORTANCE_HIGH 등으로 설정할 수 있습니다.
채널이 생성되면, 노티피케이션을 등록할 수 있습니다. 노티피케이션을 등록할 때 채널을 만들 때 사용한 Channel Id를 사용해야 합니다.
channel에는 중요도를 설정할 수 있습니다. 중요도 설정에 따라 푸시가 오는 타입이 달라집니다. 중요도를 high로 설정할 경우 헤드업 알림으로 표시되게 됩니다.
채널을 생성하는 함수를 만들었다면 앱에 푸시 메시지를 전달하여야 합니다.
그 전에 PendingIntent를 설정해야 합니다. PendingIntent란 푸시 메시지를 사용자가 터치하였을 때 이동하는 액티비티를 지정하는것입니다.
makeIntent() 라는 함수를 하나 만들어서 intent를 return 합니다.
makeIntent() 함수에는 푸시의 상태에 따라 이동할 수 있는 액티비티를 다르게 주면 됩니다. 그러면 푸시 메시지 타입마다 이동하는 액티비티가 달라지게 됩니다.
그리고 PendingIntent를 해당 intent로 만들고 notificationManager 를 생성하여 푸시를 보내면 됩니다
val pendingIntent = PendingIntent.getActivity(
this@MyFirebaseMessagingService,
100,
makeIntent(),
PendingIntent.FLAG_UPDATE_CURRENT
)
var builder: NotificationCompat.Builder = if (Build.VERSION.SDK_INT >= 26) {
createNotificationChannel(
this@MyFirebaseMessagingService,
NotificationManagerCompat.IMPORTANCE_HIGH,
false,
getString(R.string.app_name_eng),
"App notification channel"
)
NotificationCompat.Builder(
this@MyFirebaseMessagingService,
"$packageName-${getString(R.string.app_name_eng)}"
)
} else {
NotificationCompat.Builder(this@MyFirebaseMessagingService)
}
builder.apply {
setSmallIcon(R.mipmap.ic_launcher)
setContentTitle(title)
setContentText(message)
priority = NotificationCompat.PRIORITY_HIGH
//setDefaults(Notification.DEFAULT_SOUND)
setAutoCancel(true)
setContentIntent(pendingIntent)
}
NotificationManagerCompat.from(this@MyFirebaseMessagingService)
.notify(if (send_type == "admin_notice") 1000 else 1001, builder.build())
이렇게 모든 필요한 사항을 만들고 notify에 id, notificationBuilder를 지정하면 앱에 푸시메시지가 전송됩니다.