About Firebase Cloud Messaging - YJGwon/connectruck GitHub Wiki
Firebase Cloud Messaging(FCM)
iOS, Android, Web λ± λ€μν νκ²½μμ λ©μμ§λ₯Ό 무λ£λ‘ μ μ‘ν μ μλ ν¬λ‘μ€ νλ«νΌ λ©μμ§ μ루μ
μ²λ¦¬ νλ¦
- server β FCM backend λ©μμ§ λ°μ‘ μμ²
- FCM backend β λ©μμ§ ID λ± λ©ν λ°μ΄ν° μμ±, topic ν΅ν΄ fan-out μν
- νλ«νΌ μ μ‘ λ μ΄μ΄ β client κΈ°κΈ°λ‘ λ©μμ§ λΌμ°ν
, νμν κ²½μ° νλ«νΌ λ³ κ΅¬μ± μ μ©
- Androidμ© ATL, iOSμ© APN, Web push protocol λ±μ΄ ν¬ν¨
- client κΈ°κΈ°μ FCM SDKκ° λ‘μ§μ λ°λΌ λ©μμ§ μ²λ¦¬
νμν κ²
- μλ¦Ό μ μ‘ν client κΈ°κΈ° ν ν° (FCM js SDK ν΅ν΄μ νλ)
- μλ²μ FCM λ°μ‘ μμ² λ‘μ§ (Firebase Admin SDK μ¬μ© λλ API μμ²)
- client appμ λ©μμ§ μ²λ¦¬ λ‘μ§ (FCM js SDK μ¬μ©)
- λ°±κ·ΈλΌμ΄λ μ²λ¦¬ μν΄μλ service worker λ±λ‘
FCM λ©μμ§ μ’ λ₯
μ ν
- μλ¦Ό λ©μμ§: FCM SDKμμ μλμΌλ‘ μ¬μ©μμκ² νμ
- push μλ¦Ό λ°μ λ° λ°±κ·ΈλΌμ΄λ μ²λ¦¬ λ±μ FCM SDKμμ μλμΌλ‘ μ²λ¦¬
- optionalνκ² data payload ν¬ν¨ν μ μμ - notification κ΄λ ¨ payloadλ FCM SDKκ°, data payloadλ client appμ΄ μ²λ¦¬
- λ°μ΄ν° λ©μμ§: client appμμ μ²λ¦¬
μλ¦Ό λ©μμ§ νμ
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
}
}
- token: μ¬μ©μ κΈ°κΈ° ν ν°
- notification.title, body: μ¬μ©μμκ² νμλλ μλ¦Ό μ λͺ©, λ³Έλ¬Έ
- ν΄λΉ νλλ€μ νλ«νΌμ κ΄κ³ μμ΄ ν΄μλ μ μλ κ³΅ν΅ νλ
λ°μ΄ν° λ©μμ§ νμ
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
}
- data: client appμ΄ ν΄μν΄μ μ²λ¦¬ν data
- νλ«νΌμ κ΄κ³μμ΄ ν΄μλλ κ³΅ν΅ νλ
- custom key-valueμ μμ½μ΄λ μ¬μ©νμ§ λ§κ²(
from
,notification
,message_type
,google*
,gcm*
)
λ°μ΄ν° νλ ν¬ν¨ν μλ¦Ό λ©μμ§ μμ
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
},
"data" : {
"Nick" : "Mario",
"Room" : "PortugalVSDenmark"
}
}
}
Firebase Admin SDK
λ°±μλμ FCM λ°μ‘ μμ²μ ꡬννλ λ°©λ²μ ν¬κ² λ κ°μ§
- SDK μ¬μ© - Java, Node.js, Python, C#, Go μ§μ
- API μ§μ νΈμΆ - μΈ κ°μ§ νλ‘ν μ½ μ§μ(μ΅μ HTTP v1 API, κΈ°μ‘΄ HTTP, κΈ°μ‘΄ XMPP - μ΅μ νλ‘ν μ½ κΆμ₯)
SDKλ μ΅μ HTTP v1 API νλ‘ν μ½ κΈ°λ° β μ§μλλ μΈμ΄μΌ κ²½μ° SDK μ¬μ©νλ©΄ νΈλ¦¬
μλ²μ SDK μΆκ°
- gradle μμ‘΄μ± μΆκ°
- Firebase νλ‘μ νΈ μμ± λ° ν€ νμΌ μμ±
- Firebase Consoleμμ μμ± κ°λ₯, json νμΌ
- ν€ νμΌμ μΈμ¦ μ 보 μ΄μ©ν΄μ FirebaseApp μ΄κΈ°ν
Gradle μμ‘΄μ± μΆκ°
build.gradle
dependencies {
implementation 'com.google.firebase:firebase-admin:9.2.0'
}
build.gradle.kts
dependencies {
implementation("com.google.firebase:firebase-admin:9.2.0")
}
json ν€ νμΌλ‘ Firebase App μ΄κΈ°ν
Springμ ClassPathResource
μ¬μ© (μλ μ½λλ bean λ±λ‘ methodμ λ΄μ©)
final ClassPathResource firebaseAccountResource = new ClassPathResource("/config/firebase-admin-account.json");
try {
final FirebaseOptions options = FirebaseOptions.builder()
.setCredentials(GoogleCredentials.fromStream(firebaseAccountResource.getInputStream()))
.build();
if (FirebaseApp.getApps().isEmpty()) {
FirebaseApp.initializeApp(options);
log.info("Firebase app initialized");
}
return FirebaseMessaging.getInstance();
} catch (IOException e) {
throw new RuntimeException("FirebaseAppμ μ΄κΈ°νν μ μμ΅λλ€.", e);
}