class MyFirebaseMessagingService : FirebaseMessagingService() {
private val TAG = "FirebaseTest"
// 메세지가 수신되면 호출
override fun onMessageReceived(remoteMessage: RemoteMessage) {
if(remoteMessage.data.isNotEmpty()){
sendNotification(remoteMessage.notification?.title,
remoteMessage.notification?.body!!)
}
else{
}
}
// Firebase Cloud Messaging Server 가 대기중인 메세지를 삭제 시 호출
override fun onDeletedMessages() {
super.onDeletedMessages()
}
// 메세지가 서버로 전송 성공 했을때 호출
override fun onMessageSent(p0: String) {
super.onMessageSent(p0)
}
// 메세지가 서버로 전송 실패 했을때 호출
override fun onSendError(p0: String, p1: Exception) {
super.onSendError(p0, p1)
}
// 새로운 토큰이 생성 될 때 호출
override fun onNewToken(token: String) {
super.onNewToken(token)
sendRegistrationToServer(token)
}
private fun sendNotification(title: String?, body: String){
val intent = Intent(this,MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) // 액티비티 중복 생성 방지
val pendingIntent = PendingIntent.getActivity(this, 0 , intent,
PendingIntent.FLAG_ONE_SHOT) // 일회성
val channelId = "channel" // 채널 아이디
val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) // 소리
val notificationBuilder = NotificationCompat.Builder(this, channelId)
.setContentTitle(title) // 제목
.setContentText(body) // 내용
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// 오레오 버전 예외처리
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(channelId,
"Channel human readable title",
NotificationManager.IMPORTANCE_DEFAULT)
notificationManager.createNotificationChannel(channel)
}
notificationManager.notify(0 , notificationBuilder.build()) // 알림 생성
}
// 받은 토큰을 서버로 전송
private fun sendRegistrationToServer(token: String){
}
}
onMessageReceived 에서 메세지를 수신하여
sendNotification 메소드에 보내줌으로써 노티를 발생시킬 수 있다.
또한 토큰을 보내서 서버에서 관리하려고 할 때
onNewToken 에서 보내주는 로직을 작성하거나
FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w(TAG, "Fetching FCM registration token failed", task.exception)
return@OnCompleteListener
}
// Get new FCM registration token
val token = task.result
// Log and toast
val msg = getString(R.string.msg_token_fmt, token)
Log.d(TAG, msg)
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})
현재의 토큰을 가져오는 FirebaseMessaging.getInstance().token 메소드를 사용하여