티스토리 뷰

728x90

https://thdbs523.tistory.com/378

 

[안드로이드/코틀린] FCM를 이용하여 사용자 별로 Notification 보내기-1

FCM FCM는 Firebase Cloud Messaging의 약자로, 구글 클라우드 서버를 이용해서 사용자들에게 메시지를 보낼 수 있다. FCM에서는 디바이스 별로 Token을 부여하는데, 이 Token을 사용해서 특정한 사용자에게

thdbs523.tistory.com

위 포스팅에서 생성한 토큰을 가지고 디바이스 별로 메시지를 전송하는 방법은 아래와 같은 방법들이 있다고 했다.

 

1. Firebase Console에서 메시지를 전송하기

2. Postman으로 Firebase 서버에 POST 요청을 보내기

3. 안드로이드 상에서 Retrofit을 사용해 Firebase 서버에 네트워크 연결을 하기

4. 직접 구축한 서버에서 POST 요청을 보내기

 

이번 포스팅에서는 이러한 방법을 하나하나 자세히 알아볼 것이다.

현재는 FCM 연습을 위한 프로젝트라 서버를 따로 구축하지 않았기 때문에, 4번은 패스하고 1~3번만 알아보자.

 

 

 

1. Firebase Console에서 메시지를 전송하기

만들어둔 Firebase project로 이동한 후, 왼쪽 메뉴의 참여 - Messaging을 클릭한다.

 

오른쪽 상단에 있는 파란 버튼 "캠페인 작성"을 누르면 위와 같은 화면이 뜬다. 

여기서 Notification을 보낼 제목과 텍스트를 입력하고 "테스트 메시지 전송" 버튼을 누른다.

 

버튼을 누르면 뜨는 창에 메시지를 보내려는 디바이스의 FCM 토큰을 입력한다.

그리고 테스트 버튼을 누르면 해당하는 디바이스에 Notification이 전송됨을 확인할 수 있다.

 

 

 

2. Postman으로 Firebase 서버에 POST 요청을 보내기

Postman은 API에 요청을 보내고 결과를 확인하고 싶을 때 테스트할 수 있는 프로그램이다.

짧게 테스트하기 위한 용도라면 별도의 설치 없이 이용할 수 있다.

 

먼저 로그인하고 자신의 Workspace로 이동한다. 그리고 New Request를 클릭해 새로운 요청을 보낼 형식을 지정한다.

POST 요청을 보낼 Firebase 서버의 url은 https://fcm.googleapis.com/fcm/send 이다.

 

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

그리고 요청을 보낼 Body의 JSON 형태는 위와 같다.

notification을 보낼 것인지, 데이터만 전송할 것인지에 따라 JSON 구조가 달라지므로 아래의 링크를 참고하자.

https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ko 

 

FCM 메시지 정보  |  Firebase 클라우드 메시징

Google I/O 2023에서 Firebase의 주요 소식을 확인하세요. 자세히 알아보기 의견 보내기 FCM 메시지 정보 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Firebase 클라

firebase.google.com

 

  • Header 

http url과 API 유형을 선택하고, Header는 두가지를 추가한다.

1. Authorization : key=<서버 키>
2. Content-Type : application/json

 

프로젝트의 서버 키를 확인하는 방법은 아래와 같다.

1. Firebase Console에서 자신의 프로젝트 클릭

2. 프로젝트 설정-클라우드 메시징-Cloud Messaging API-서버 키

서버 키가 안 뜨는 경우에는 Google Cloud Console에서 API 관리를 클릭한다.

 

 

  • Body

Body는 위와 같이 입력한다. "to"의 value는 디바이스의 토큰을 입력한다. (priority 생략 가능)

그리고 Send 버튼을 누르면 FcmService의 onMessageReceived() 함수가 호출되고,

그 함수 안에 있는 Notification 코드가 실행되어 디바이스에 Notification이 발생한다.

 

 

 

3. 안드로이드 상에서 Retrofit2을 사용해 Firebase 서버에 네트워크 연결을 하기

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

위와 같은 형태의 JSON을 Firebase 서버에 POST 요청을 보내는 것은 2번과 동일하다.

Retrofit2에 대한 자세한 내용은 이 포스팅을 참고하자. https://thdbs523.tistory.com/376

 

 

interface API {
    @Headers("Authorization:key=$SERVER_KEY", "Content-Type:$CONTENT_TYPE")
    @POST("/fcm/send")
    suspend fun postNotification(@Body notification: PushNotification): Response<ResponseBody>
}

Retrofit API를 생성했다.

postNotification 함수를 호출하면 Retrofit 객체에 설정된 BASE_URL(Firebase 서버)로 POST 요청이 보내진다.

Header와 Body는 2번과 동일하게 설정했고, 서버 키는 상수로 선언했다.

POST 함수의 Body에는 PushNotification 타입이 들어가도록 구현했다.

 

data class PushNotification(
    val data: NotificationData,
    val to: String
)

data class NotificationData (
    val title: String,
    val message: String
)

여기에는 token과 notification의 title, message가 포함되도록 프로퍼티를 생성했다.

 

object RetrofitBuilder {
    private val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()

    var api: API = retrofit.create()
}

이러한 API를 사용할 수 있도록 Retrofit 객체를 생성했다.

 

class MainActivity : AppCompatActivity() {
    private lateinit var button: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        button.setOnClickListener {
            MyApplication.prefs.getData(TOKEN_KEY, "").let { token ->
                if (token == "") return@setOnClickListener
                Log.e(TAG, "test")
                sendNotification(PushNotification(NotificationData("title", "content"), token))
            }
        }
    }

    private fun sendNotification(notification: PushNotification) = lifecycleScope.launch {
        try {
            val response = RetrofitBuilder.api.postNotification(notification)
            if (response.isSuccessful) {
                Log.e(TAG, "Response: ${response.body()?.string()}")
            } else {
                Log.e(TAG, "Error: ${response.errorBody()?.string()}")
            }
        } catch (e: Exception) {
            Log.e(TAG, e.toString())
        }
    }

    companion object {
        private val TAG = MainActivity::class.simpleName
    }
}

 

특정 버튼을 누르면 자기 자신의 토큰을 서버에 전달하는 코드다. (일반적인 경우 다른 디바이스의 토큰을 넣겠지만 테스트를 위해)

여기서 sendNotification 함수를 통해 만들어진 POST 함수를 호출하고 응답을 받아온다.

응답값의 isSuccessful이 true라면 제대로 요청을 보낸 것이므로 FcmService의 onMessageReceived() 함수가 호출될 것이다.

 

 

 

 

 

실무에서 Firebase를 통해 애널리틱스 정보들을 보고, 애드몹을 띄우는 것을 많이 접했었다.

뭔가 Android project에 Firebase에서 제공하는 기능들을 넣는 건 어려울 것이라는 막연함이 있었는데

막상 구현해보니 어렵지 않았다. 플러그인 버전 맞추는데에 꽤 애를 먹긴 했지만..

FCM는 다른 프로젝트를 하면서 잘 사용하게 될 기능일 것 같다.

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함