본문 바로가기
Android App/Kotlin

파이어베이스-클라우드 메시징(Cloud Messaging, FCM)

by AppJinny 2022. 12. 24.

*파이어베이스-클라우드 메시징(Cloud Messaging, FCM)

-스마트폰에 메시지를 전달하는 서비스

-서비스의 정식 명칭 : 푸시 메시징(Firebase Cloud Messaging(FCM))

-사용자 디바이스에 특별한 코드없이 메시지를 전달할 수 있음

-전달한 메시지를 사용자가 클릭하여 앱을 실행할 수 있음

-사용자 토큰을 기반으로 동작함

-토큰은 사용자 디바이스에서 생성되며 파이어베이스에서 제공하는 FirebaseMessagingService를 상속받아 사용

 

*메시지 기본구조

-메시지를 전송할 때 받는 사람의 토큰과 메시지가 담긴 알림(notification)을 함께 보냄

-알림 이외에도 메시지에 data를 함께 전달할 수 있음

{
    "message": {
        "token": "tototototo...", //받는 사람 토큰
        "notification": {
            "title": "Argentina vs. France"
            "body": "Final match!!" 
        }
    }
}

 

 

*FCM 접근 진행 방식 (보안문제)

-디바이스에서 직접 접근하지 않음

-백엔드 서버를 통해서 전송

--(백엔드 서버를 통해 전송하는 이유 : FCM 서버에 접속할 수 있는 서버키를 숨겨 보안을 유지하기 위함)

-FCM 서버는 전송받은 메시지와 서버키 확인

-메시지가 전송되어야 할 디바이스(웹, 앱)로 메시지 전송

 

 

*안드로이드 프로젝트 생성 및 파이어베이스 연동

-파이어베이스 웹 사이트 접속 : https://console.firebase.google.com/

-왼쪽 탭 상단 ⚙️ - 프로젝트 설정 - 앱 추가

-앱 등록 - 패키지명 - 앱 닉네임 - 앱등록

-구성파일 다운로드 후 추가 - google-services.json 다운로드 - 파일 복사

-안드로이드 스튜디오 프로젝트 - Project - app 디렉토리에 붙여넣기

-Firebase SDK 추가

-프로젝트 build.gradle(Project:) - plugins{} 코드 추가

//파이어베이스 SDK추가
id 'com.google.gms.google-services' version '4.3.13' apply false

 

-프로젝트 build.gradle(Module:) - plugins{} 코드 추가

//파이어베이스 사용을 위한 구글서비스 플러그인 
id 'com.google.gms.google-services'

 

-프로젝트 build.gradle(Module:) - dependencies{} 코드 추가

//파이어베이스 SDK추가
implementation platform('com.google.firebase:firebase-bom:31.1.1')
implementation 'com.google.firebase:firebase-analytics-ktx'
//파이어베이스 메시지 의존성 추가
implementation 'com.google.firebase:firebase-messaging-ktx'

 

-다음 - 콘솔로 이동

 

*클라우드 메시징 서비스 생성

-사용자 토큰을 기반으로 동작, 사용자 디바이스에서 생성됨

-파이어베이스에서 제공하는 FirebaseMessagingService를 상속받아 토큰 사용

 

-build.gradle

-- android{} 에 뷰바인딩 추가

//뷰바인딩
buildFeatures{
    viewBinding true
}

 

-MainActivity.kt

//1
//app - java밑 패키지명 우클릭 - New - Service - Service
//MyFirebaseMessagingService - Finish

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //2
        //토큰을 다시 출력하기위한 코드
        FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
            if (!task.isSuccessful){
                Log.e("토큰", "FCM registration token failed", task.exception)
                return@OnCompleteListener
            }
            val token = task.result.toString()
            Log.d("토큰", "재호출: $token")
        })

    }//onCreate
}//MainActivity

 

-MyFirebaseMessagingService.kt

//1
//기본으로 Service()를 상속받고 있음
//FirebaseMessagingService()를 상속받도록 수정
//클래스 안 코드 모두 삭제
class MyFirebaseMessagingService : FirebaseMessagingService() {

    //2
    //토큰을 받을 수 있는 상태가 되면 호출되는
    //onNewToken()메서드 오버라이드
    //onNewToken(): 토큰이 생성될 때마다 안드로이드가 호출해줌
    //메서드 안에서 받은 토큰은 디바이스나 서버에 저장해두어야 함...
    //현재 프로젝트에서는 일단 로그로 토큰 출력 후 복사해서 사용함...
    override fun onNewToken(token: String) {
        Log.d("토큰", "$token")
    }

    //3
    //AndroidManifest.xml의 <service>태그 수정
    //intent-filter에 MESSAGING_EVENT설정
    //메시지가 수신되면 MyFirebaseMessagingService 동작
    //수신코드를 작성하지 않았어도 토큰을 기반으로 동작하기 때문에
    //해당 토큰을 가진 디바이스 상단에 별도의 메시지 알림이 보여짐

    //4
    //앱 실행 시 로그캣 창으로 실제 토큰 문자열이 출력됨
    //토큰 복사해두기...

    //5
    //토큰이 갱신되기 전까지 앱을 재실행해도 토큰출력 호출이되지 않음
    //토큰을 다시 출력하기위해 MainActivity.kt 코드 추가

}

 

-AndroidManifest.xml

<!--    <service> 태그 수정    -->
<!--    intent-filter에 MESSAGING_EVENT를 달아    -->
<!--    메시지가 수신되면 MyFirebaseMessagingService가 동작하게 됨    -->
        <service
            android:name=".MyFirebaseMessagingService"
            android:exported="false">

            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
            
        </service>

 

*파이어베이스 콘솔에서 메시지 보내기

-파이어베이스 웹 사이트 접속 - 프로젝트 화면 이동

-왼쪽 메뉴탭 - 참여 - Messaging - 첫 번째 캠페인 만들기

-Firebase 알림 메시지 만들기 - 알림제목 및 텍스트 작성

-테스트 메시지 전송 - FCM등록 토큰 추가(로그창 토큰 복사 붙여넣기) - +버튼 - 테스트

 

 

-결과

 

 

 

 

 


이 포스팅에 작성한 내용은 고돈호, ⌜이것이 안드로이드다⌟, 한빛미디어(주), 2022 에서 발췌하였습니다.