FCM PUSH 알림 보내기
먼저 파이어베이스에 들어가서 프로젝트의 서버키를 받아오도록 한다.
프로젝트 설정에서 클라우드 메시징에서 확인할 수 있다.
class FCMService {
fun sendPostToFCM(token: String, chatData :UserDTO, message :String) {
var mFirebaseDatabase = FirebaseDatabase.getInstance()!!
mFirebaseDatabase.getReference("users")
.child(chatData.email)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
var userData = dataSnapshot.getValue(UserDTO::class.java)
val toTimeStamp = Date()
val datef = SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS", Locale.getDefault())
val createAt= datef.format(toTimeStamp)
Thread(
Runnable {
kotlin.run {
try {
val root = JSONObject()
val notification = JSONObject()
notification.put("title", "write anything")
notification.put("body", message)
root.put("data", notification) // 여기서 data와 notification 두가지 중 설정하면 된다.
root.put("channel_id",CHANNEL_ID)
root.put("to", token)
val Url = URL(FCM_MESSAGE_URL)!!
val conn = Url.openConnection() as HttpURLConnection
conn.setRequestMethod("POST")
conn.setDoOutput(true)
conn.setDoInput(true)
conn.addRequestProperty("Authorization", "key=" + SERVER_KEY) //받아 온 서버키를 넣어주세요
conn.setRequestProperty("Accept", "application/json")
conn.setRequestProperty("Content-type", "application/json")
val os = conn.getOutputStream()
os.write(root.toString().toByteArray(Charsets.UTF_8));
os.flush();
conn.responseCode
} catch (e: Exception) {
e.printStackTrace()
}
}
}
).start()
}
override fun onCancelled(error: DatabaseError) {
TODO("Not yet implemented")
}
})
}
}
아래와 같은 포맷으로 전달되게 된다.
data 객체는 원하는데로 format해서 사용하면 됩니다!
{
"data": {
"title": "write anythig",
"body": "test body",
"createAt":"2022-03-01 11:11:11.111"
...
},
"to": device_token,
"channe_Id": "your chanel id"
}
이렇게 보내면 cloude message 에서 테스트 했던거와 동일하게 해당 token의 디바이스에 알람이 가게 된다.
data 에 보내는 사람의 token이나 email을 함께 실어서 보내면, 서로 메세지를 주고 받는 것이 가능해진다. 👍
메세지 내역을 DB에 저장해서 load 할 수도 있겠다.
지금 하고 있는 프로젝트에서는 카카오톡 처럼 실시간 메세지 창이 필요하지 않아 채팅창을 만들어 보지는 않았지만, 추후에 더 공부해서 만들어보고 싶다.