제이슨의 개발이야기

Firebase CloudFunction 을 이용한 FCM 을 이용한 푸시(push) 메시지 받기 && 보내기 본문

안드로이드

Firebase CloudFunction 을 이용한 FCM 을 이용한 푸시(push) 메시지 받기 && 보내기

제이쓰은 2021. 5. 27. 17:09
728x90
반응형

안녕하세요 오늘은 Firebase CloudFunction 과 FCM 을 이용해서 푸시메시지를 보내는 것과 받는 법에 대해서 공부했습니다 ㅎㅎ 

 

먼저 build.gradle (app)에서 

 

//fcm
implementation 'com.google.firebase:firebase-messaging:17.3.4' 

 

종속성을 추가해줍니다! 

 

그리고 나서 FirebaseMessagingService()를 상속받는 클래스를 하나 만들어야합니다 

 

class FcmService() : FirebaseMessagingService() {

    override fun onMessageReceived(remotemessage: RemoteMessage) {

            remotemessage.data.get("title")?.let { sendNotification(remotemessage.data.get("body")!!, it) }

    }

    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)

        }
    }

    private fun sendNotification(messageBody : String, messageTitle : String){
        createNotificationChannel(this, NotificationManagerCompat.IMPORTANCE_HIGH, false,
                getString(R.string.app_name), "App notification channel")   // 1

        val channelId = "$packageName-${getString(R.string.app_name)} "
        val title = messageTitle
        val content =messageBody

        val intent = Intent(baseContext, MainActivity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK


        val builder = NotificationCompat.Builder(this, channelId)

        builder.setSmallIcon(R.drawable.profile_human)
        builder.setContentTitle(title)
        builder.setWhen(System.currentTimeMillis())
        builder.setContentText(content)
        builder.priority = NotificationCompat.PRIORITY_HIGH // 3

        builder.setCategory(NotificationCompat.CATEGORY_MESSAGE)
        builder.setAutoCancel(true)

        val notificationManager = NotificationManagerCompat.from(this)
        notificationManager.notify(1001, builder.build())
    }
}

 

위에 클래스 코드를 보면 특이 한 점은 createNotificationChannel 메소드 입니다

안드로이드 오레오 버전 이후 부터는  채널 이름이 필요합니다 ! 저는 그냥 패키지 네임과 앱 네임을 붙어서 채널 이름으로 활용했습니다 

 

 onMessageReceived() 메소드는 푸시메시지를 감지하는 부분입니다 !

 

푸시메시지가 오면 데이터를 알맞게 sendNotification 메소드에 보내면 안드로이드 Notification 라이브러리를 활용해서 푸시메시지를 받을 수 있습니다! 

 

※위에 코드중 intent 부분은 있는 대 무시하셔도 상관없습니다!

 

var builder 부분부터는 Notification 메세지 에 해당하는 부분이고마지막에 notify 를 함으로써 푸시 메세지가 나타납니다!

 

그러면 Firebase CloudFunction 에서는 푸시메시지를 보내는 Function 이 있어야합니다

 

exports.sendCloudMessageByToken = functions.https.onCall((data) => {

    var registrationToken = data.token;
    var title = data.title;
    var body = data.body;

    var message = {
        data: {
            title: title,
            body: body
        },
        token: registrationToken
    };

    admin.messaging().send(message)
        .then((response) => {
            // Response is a message ID string.
            console.log('Successfully sent message:', response);
        })
        .catch((error) => {
            console.log('Error sending message:', error);
        });
});

위에 코드) node.js 로 코드 작성 후 Function에 올립니다

 

클라이언트는 푸시 메시지를 보낼 대상에 token 과 메시지 제목 , 내용 을 보내면 해당 function이 푸시 메시지를 보냅니다!

 

 

728x90
반응형