반응형

 

파이어베이스와 앱 연결

2022.04.01 - [안드로이드[Android]] - 안드로이드[Android] 안드로이드 백그라운드에서 알림보내기(FCM)

 

안드로이드[Android] 안드로이드 백그라운드에서 알림보내기(FCM)

진행중인 프로젝트에서 댓글, 대댓글간에 알림기능을 구현하기 위해서 푸쉬 메시지라고 불리는 서비스중 파이어베이스에서 사용하는 파이어베이스 클라우드 메세징(FCM)을 이용하려고 합니다.

soopeach.tistory.com

위의 링크에서 FCM에 대한 소개와 연동방법을 설명해 놓았습니다. 

 

HTTP 프로토콜 형식으로 메시지 보내기

이번에는 파이어베이스 콘솔에서 메시지를 직접 보냈던 형식과 다르게 HTTP 프로토콜 형식을 이용하여 백그라운드에서 알림을 보내도록 하겠습니다.

HTTP 프로토콜 방식은 2가지 방식이 있는데 FCM HTTP v1 API 이라는 최신 프로토콜과 기존의 HTTP 프로토콜이 있습니다. 공식문서상에서는 HTTP v1 API를 추천하지만 우선은 기존의 HTTP 프로토콜 방식을 사용하여 메시지를 보내겠습니다.

POSTMAN을 사용하였습니다.

POST 요청하기

https://fcm.googleapis.com/fcm/send 에 POST 요청을 보내야합니다.

Headers

Headers는 2개가 필요한데 하나는 Content-Type이고 나머지 하나는 Authorization 입니다.

Content-Type의 value에는 application/json를 넣어주고 

Authorization의 value에는 key=등록한 앱의 서버키 를 넣어줍니다. 

서버키가 asdf1234라면 Authorization의 value에는 key=asdf1234 와 같은 식으로 값을 넣어주면 됩니다.

앱의 서버키는

프로젝트 - 프로젝트 개요 - 프로젝트 설정 - 클라우드 메시징 - Cloud Messaging API(기존) - 서버키에서 확인할 수 있습니다.

 

토큰 아래 빨간색 네모칸에 있는 부분이 앱의 서버키입니다.

헤더는 이런식으로 값을 넣어주면 됩니다. Postman-Token ~ Connection 부분은 자동으로 생성되었습니다.

Body

{
   "to" : "토큰",
   "notification":{
       "title" : "알림의 제목",
       "body" : "알림의 내용"
   }

}

Body 부분에는 json 형식으로 위와 같이 데이터를 보내줍니다. "to"의 값인 "토큰"은 

onNewToken을 통해 구한 토큰을 넣어주면 됩니다. 그 토큰값을 가진 기기로 데이터가 전송됩니다.

타켓 기기의 토큰 값이 1234kkkk 라면 "to" : "1234kkkk" 로 입력하면 됩니다.

토큰 구하기 <-- FCM 토큰 구하는 방법

앱에서 메시지를 전달 받아 Notification으로 띄우기 

FirebaseMessagingService()를 상속 받는 서비스 내에서 onMessageReceived를 오버라이딩 해줍니다.

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    super.onMessageReceived(remoteMessage)

    val notificationManager = getSystemService(NotificationManager::class.java)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channel = NotificationChannel(
            CHANNEL_ID,
            CHANNEL_NAME,
            NotificationManager.IMPORTANCE_DEFAULT
        )
        notificationManager.createNotificationChannel(channel)
    }

    val notification = NotificationCompat.Builder(this, CHANNEL_ID)
        .setContentTitle(remoteMessage.notification?.title)
        .setContentText(remoteMessage.notification?.body)
        .setPriority(PRIORITY_DEFAULT)
        .setSmallIcon(R.drawable.sym_def_app_icon)
        .build()

    notificationManager.notify(1, notification)


}

위의 코드는 전달 받은 메시지를 Notification을 활용하여 안드로이드 기기 상단바에 띄울 수 있도록 하는 코드입니다.

Notification 사용법(알림 띄우기)

remoteMessage.notification?.title, remoteMessage.notification?.body를 통해 위에서 보낸 알림의 제목(title)과 내용(body)를 가져올 수 있습니다.

 

POST 요청을 해서 확인해보면 정상적으로 입력한 값들이 토큰을 가지는 기기로 보내지고 서비스에서 데이터를 처리하여 Notification을 띄우는 모습을 볼 수 있습니다.

Map 형식으로 데이터를 관리하기

데이터를 보낼 때 notification이 아니라 data 로 객체를 묶어서 데이터를 보내면 Map 형식으로 데이터를 주고받을 수 있습니다.

 

BODY 작성 예시

{
    "data"{
        "title" : "제목",
        "content" : "내용",
        "date" : "2022-04-17"
    },
   "to" : "dGK8p-LwQr-FOc1pGPPi30:APA91bG_cZBNIFONQmZ0UDPLk1icgf1wWx3s-ND5sBvhzxRCn5m4rabU7uhXaPUrdHGlO3Z3Cl6SToh-jF3x9Zx_A36VyxbGRuMgkIBagKDmWkD_bE_5i4FuSErtPt8ZU3T35X8b8Lom"
}

와 같이 data로 감싸서 데이터를 전송하면 Map 형식으로 데이터를 주고받을 수 있어 편리합니다.

 

Notification 생성

val notification = NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle(remoteMessage.data?.get("title"))
            .setContentText("${remoteMessage.data?.get("date")}에 발송된 ${remoteMessage.data?.get("content")}")
            .setPriority(PRIORITY_DEFAULT)
            .setSmallIcon(R.drawable.sym_def_app_icon)
            .build()

적용 화면

정상적으로 키값을 통해 데이터들을 받아와 알림창을 띄우게 되었습니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기