파이어베이스 서버에서 앱에 알림을 전달하는 기능이다.
서버에서 어떤 상황이 발생할 때 클라이언트에 데이터를 전달하는 것을 서버 푸시라고 한다.
클라우드 메시징은 서버의 데이터를 앱에 직접 전달하지 않고 FCM 서버를 거쳐 앱에 전달하는 방식이다.
서버와 앱이 네트워크 연결을 지속해서 유지하지 않아도 되며, 앱이 포그라운드 상황이 아니어도 데이터를 받을 수 있다는 장점이 있다.
FCM 서버에 전달된 데이터를 기기의 앱에 전달하려면 앱을 구분하는 식별값이 필요하다.
이 식별값을 토큰이라고 하며, 안드로이드 시스템이 FCM 서버에 자동으로 의뢰해서 발급받는다.
과정은 다음과 같다.
// 구글 서비스 등록(프로젝트 수준 그래들)
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 프로퍼티로 메시지를 얻을 수 있다.