본문 바로가기

안드로이드/신입 안드 개발자를 위한

[And] FCM (Firebase Cloud Messaging) 구현및 테스트

반응형

FCM은 앱의 업데이트와 같은 중요 정보를 전달하거나 마케팅 정보를 전달할때 유용합니다. 그리고 무료라는 점이 매력 있는 서비스 입니다.

FCM으로 전달받은 메세지를 꾸미는 방법은 제 포스팅을 참고해주세요 

 

[안드로이드/Android] 푸시(push) 종류별 구현 방법 및 오레오 대응

푸시는 사용자에게 정보(광고)를 전달하기 위해 앱 외부의 표시하는 UI입니다. 간단한 텍스트 형태부터 큰 이미지, 큰 텍스트 형태로 표시할 수 있습니다. 기본 알림 예제 var title = "알림 타이틀"

superwony.tistory.com

| Firebase 앱 추가 

Firebase 콘솔에 프로젝트가 없다면 생성하시고, 생성된 프로젝트에 안드로이드 앱을 추가해 정보를 입력합니다. 

 ( 생성된 프로젝트 > 프로젝트 설정 > 앱추가  >안드로이드 플랫폼 선택, 아래 그림1 참고 )

그림1

앱의 패키지 명과 닉네임을 입력해 등록 과정을 거치면 'google-services.json' 파일을 다운받아서 앱 프로젝트 파일 app 폴더에 붙여 넣습니다.  SHA-1 키는 지금 당장 필요하진 않아서 넣지 않으셔도 됩니다. 

( google-services.json 파일은 구글 서비스를 이용하기 위한 파일입니다. )

| SDK 추가 

build.gradle ( Project.level ) 

buildscript {
  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
  }
  dependencies {
    ...
    // Add this line
    classpath 'com.google.gms:google-services:4.3.5'
  }
}

allprojects {
  ...
  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
    ...
  }
}

build.gradle ( app.level ) 

apply plugin: 'com.android.application'
// Add this line
apply plugin: 'com.google.gms.google-services'

dependencies {
    implementation 'com.google.firebase:firebase-core'
    implementation 'com.google.firebase:firebase-messaging'
    implementation platform('com.google.firebase:firebase-bom:26.8.0')
}

firebase-bom사용시 bom의 버전만 관리하면 다른 Firebase 라이브러리 버전을 관리할 수 있습니다. 위 처럼 개별 버전을 지정하지 않아도 됩니다. 보다 자세한 내용은 공식 문서를 참고해주세요

| 메세지 수신 작업 추가

Firebase에서 전송한 푸시는 수신된 앱의 상태(백그라운드/포그라운드) 에 따라 다르게 처리됩니다.

앱이 백그라운드일 경우 별도 처리를 하지 않아도 firebase에서 전송한대로 노출합니다.

( 푸시 전송 테스트는 밑에서 안내하겠습니다. ) 

포그라운드일 경우 'onMessageReceived' 를 오버라이드 해서 직접 처리하지 않으면 노출되지 않습니다.

import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage

class FcmService: FirebaseMessagingService() {

    override fun onMessageReceived(p0: RemoteMessage) {
        super.onMessageReceived(p0)
        
        p0.notification?.let{
            var title = it.title ?: ""
            var message = it.body ?: ""

            L.d("push title=$title, message=$message")
        }
    }

    override fun onNewToken(p0: String) {
        super.onNewToken(p0)

        L.d(" 토큰 생성 = $p0")
    }
}

위 코드에서 로그로 출력되는 'title''message' 가 전송된 푸시의 타이틀과 메세지 입니다.  적절하게 푸시에 노출하면 됩니다.

Androidmanifest.xml

    <application
        android:name=".base.BaseApplication">
       
       ...
        <service android:name=".fcm.FcmService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
    </application>

| 테스트 푸시 전송하기

제일 처음에 추가한 firebase console에서 '참여 > Cloud Messaging > 새 알림' 경로로 들어가면 테스트 푸시를 전송할 수 있습니다.

알림 제목과 알림 텍스트가 위 FcmService에 onMessageReceived에서 처리한 'title' 과 'message' 변수에 해당하는 값입니다.

우측에 있는 '테스트 메세지 전송' 은 알림 제목과 텍스트를 입력하면 활성화 되는데, 특정 기기에만 전송할 수 있는 기능입니다.

( 특정 기기에 전송하기 위해선 기기의 토큰을 얻어 등록하면 됩니다. )

그렇지 않으면 설치되어 있는 전체 유저에게 전달되기 때문입니다.

특정 기기 토큰 값 얻기 

    private fun getFirebaseToken() {
        FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
            if (!task.isSuccessful) {
                L.d("Fetching FCM registration token failed ${task.exception}")
                return@OnCompleteListener
            }

            val token = task.result
            L.d("token=${token}")
        })
    }

위 메소드를 실행시켜 얻은 토큰을 이용하면 등록된 기기에만 푸시를 보낼수 있습니다.

푸시 전송시 헤드업 알림으로 노출하기

콘솔에서 전송시 헤드업 알림으로 푸시가 노출되지 않고 상태바에만 머무르는 경우가 있습니다. 앱이 포그라운드에 있을 경우 코드로 처리하면 되지만 백그라운드에 있을땐 코드로 제어가 안됩니다. 

그럴 경우 테스트 전송시 '추가 옵션' 에 알림 채널을 등록해야 합니다. 알림 채널은 오레오부터 추가된 개념으로 상세한 내용은 제 포스팅을 참고해주시고, 헤드업 알림에 대한 내용도 기재되어 있습니다.

 

앱에 필수 기능중 하나인 FCM, 마케팅을 위해서라도 선택이 아닌 필수입니다.  

적용 하시다가 문제가 생기거나 제 포스팅에 잘못된 정보가 있으면 댓글을 통해 남겨주시면 확인 후 반영하도록 하겠습니다.

감사합니다.

반응형