파이어베이스와 앱 연결
2022.04.01 - [안드로이드[Android]] - 안드로이드[Android] 안드로이드 백그라운드에서 알림보내기(FCM)
위의 링크에서 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을 활용하여 안드로이드 기기 상단바에 띄울 수 있도록 하는 코드입니다.
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()
적용 화면
정상적으로 키값을 통해 데이터들을 받아와 알림창을 띄우게 되었습니다!
'안드로이드[Android]' 카테고리의 다른 글
안드로이드[Android] 기본 dialog(대화창) 만들기(기본, 리스트, 라디오버튼, 체크박스) (0) | 2022.05.04 |
---|---|
안드로이드 스튜디오[Android Studio] 파이어스토어 데이터베이스(Firestore Database) 연동(firebase) (0) | 2022.04.28 |
안드로이드[Android] 알림 만들기 / Notification (채널 설정) (0) | 2022.04.17 |
안드로이드[Android] ConcatAdapter / MergeAdapter 사용하기 (0) | 2022.04.08 |
안드로이드[Android] EditText 입력 글자수 제한, 표기 / 문장수 제한 (0) | 2022.04.05 |
최근댓글