FCM (Firebase Cloud Messaging)

k_hyun·2023년 5월 2일
0

파이어베이스 서버에서 앱에 알림을 전달하는 기능이다.
서버에서 어떤 상황이 발생할 때 클라이언트에 데이터를 전달하는 것을 서버 푸시라고 한다.
클라우드 메시징은 서버의 데이터를 앱에 직접 전달하지 않고 FCM 서버를 거쳐 앱에 전달하는 방식이다.
서버와 앱이 네트워크 연결을 지속해서 유지하지 않아도 되며, 앱이 포그라운드 상황이 아니어도 데이터를 받을 수 있다는 장점이 있다.

원리

토큰 발급

FCM 서버에 전달된 데이터를 기기의 앱에 전달하려면 앱을 구분하는 식별값이 필요하다.

이 식별값을 토큰이라고 하며, 안드로이드 시스템이 FCM 서버에 자동으로 의뢰해서 발급받는다.

과정은 다음과 같다.

  1. 앱이 폰에 설치되면 안드로이드 시스템에서 FCM 서버에 토큰 발급을 요청
  2. FCM 서버에서 토큰을 발급해 폰에 전달
  3. 전달받은 토큰은 FCM 서버에서 메시지가 발생할 때 사용되므로 서버에 전달
  4. 서버에서 전달받은 토큰을 DB에 저장

서버에서 앱으로 데이터 전송

  1. 서버에서 특정 상황이 발생하면 DB에서 토큰을 추출해 앱을 식별한다.
  2. 서버에서 사용자에게 전달할 메시지와 앱을 식별할 토큰을 FCM 서버에 전달한다.
  3. 토큰을 분석해 해당 사용자의 폰에 메시지를 전달한다.

클라우드 메시징 설정

그래들 설정

// 구글 서비스 등록(프로젝트 수준 그래들)
plugins {
	id 'com.google.gms.google-services' version '4.3.14' apply false
}

// FCM 관련 라이브러리 등록(모듈 수준 그래들)
plugins {
	id 'com.google.gms.google-services'
}
dependencies {
	implementation platform('com.google.firebase:firebase-bom:30.4.1')
    implementation 'com.google.firebase:firebase-messaging-ktx:23.0.08'
    implementation 'com.google.firebase:firebase-analytics-ktx:21.1.1'
}

매니페스트

서버에서 FCM 서버에 전덜하는 정보는 토큰, 알림, 데이터로 구분된다.

{
	notification: {
    	title: '...',
        body: '...'
    },
    data: {
    	title: '...',
        value: '...'
    },
    token: token
}

notification 정보가 있으면 코드에서 알림을 발생시키지 않아도 자동으로 발생하게 할 수 있다. 그러려면 매니페스트 파일에 다음과 같은 메타 데이터를 설정해 둬야 한다.

<meta-data
	android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<meta-data
	android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@drawable/colorAccent" />
<meta-data
	android:name="com.google.firebase.messaging.default_notification_channel_id"
    android:resource="fcm_default_channel" />

서비스 컴포넌트 작성

// 서비스 등록
<service
    android:name=".fcm.MyFirebaseMessageService"
	...>
    <intent-filter>
		<action android:name="com.google.firebase.MESSAGING_EVENT" />
	</intent-filter>
</service>
                              
// 서비스 코드
class MyFirebaseMessageService : FirebaseMessagingService() {
	override fun onNewToken(p0: String) {...}
    override fun onMessageReceived(p0: RemoteMessage) {...}
}

onNewToken() 함수는 FCM 서버로부터 토큰이 전달될 때 자동으로 호출되며 매개변숫값이 토큰임

onMessageReceived() 함수는 FM 서버에서 메시지가 전달될 때 자동으로 호출되며, 매개변수 객체의 data 프로퍼티로 메시지를 얻을 수 있다.

0개의 댓글