Firebase Cloud Messaging (FCM) 可以讓我們傳送訊息給 Android、iOS、或 Web 應用程式,也就是所謂的 push notifications(推播)。本文章將介紹如何在 Spring Boot 透過 FCM 發送 push notification。
Table of Contents
設定 Firebase Console
打開 Firebase Console。如果你還沒有任何 Firebase project 請先建立一個新的 Firebase project。之後,你必須要先建立一個 app。如果不熟悉如何建立一個 app 的話,可以參考以下的文章。
在這邊我們建立一個叫 FCM Example 的 app。
點選你建立的 app 來進入專案設定,並切換至 Service accounts。
點選 Generate new private key 按鈕,它會跳出以下的視窗。點選 Generate key 按鈕後,你會下載一個 JSON 檔案。下載後,將這個 JSON 檔案重新命名為 fcm_service_account.json。
建立 Spring Boot Server 來發送 FCM
引入 Firebase Admin SDK 到專案
首先建立一個新的 Spring Boot 專案。接下來,你必須要將剛剛下載的 fcm_service_account.json 加入到專案下面,路徑為 project/fcm_service_account.json。
打開專案的 build.gradle.kts,並加入 Firebase Admin SDK。
dependencies { ... // Firebase cloud message implementation("com.google.firebase:firebase-admin:7.1.1") ... }
初始化 FCM
在發送 FCM 之前,我們必須要先初始化 Firebase SDK。
建立 FcmInitialization,並且加上 @Configuration annotation,並且宣告一個 @Bean 叫 initFcm()。initFcm() 是一個 ApplicationRunner,所以在 Spring Boot app 初始化完成後,就會先被執行。
initFcm() 會讀取我們加入到專案的 fcm_service_account.json,並利用它來初始化 FirebaseApp。
@Configuration class FcmInitialization { @Bean fun initFcm() = ApplicationRunner { val fcmCredential = FileInputStream("./fcm_service_account.json") val options = FirebaseOptions.builder() .setCredentials(GoogleCredentials.fromStream(fcmCredential)) .build() FirebaseApp.initializeApp(options) } }
發送 FCM
發送至單個裝置
在 Spring Boot,可以利用 Message 來建立要發送的訊息,並且用 FirebaseMessaging 來發送。
val message = Message.builder() .setNotification(Notification.builder() .setTitle("From Wayne's Talk") .setBody("Hello Wayns's Talk") .build()) .putData("payload1", "data1") .putData("payload2", "data2") .setToken(fcmToken) .build() FirebaseMessaging.getInstance().send(message)
其中 fcmToken 是接收裝置的 FCM token。一般來說,客戶端程式會將自己收到的 FCM token 發送給 Spring Boot 伺服端,伺服端會將 FCM token 存起來。等要發送 FCM 時某個使用者時,再取出使用者相對應的 FCM token,然後再利用上面的程式碼發送 FCM。
除了標題和內文之外,FCM 還可以夾帶 key-value 資料。
發送至多個裝置
FCM 也可以讓你一次發送給多個裝置,只要改用 MulticaseMessage 即可。但是,每次發送最多 500 個裝置。
val message = MulticastMessage.builder() .setNotification(Notification.builder() .setTitle("From Wayne's Talk") .setBody("Hello Wayns's Talk") .build()) .putData("payload1", "data1") .putData("payload2", "data2") .addAllTokens(arrayListOf(fcmToken1, fcmToken2)) .build() FirebaseMessaging.getInstance().sendMulticast(message)
非同步方式發送至裝置
FirebaseMessaging 還提供了相對應的非同步發送的方法。這些方法都會回傳一個 Future。
val future1 = FirebaseMessaging.getInstance().sendAsync(message) val future2 = FirebaseMessaging.getInstance().sendMulticastAsync(message)
FCM 訊息型態
在官網中有提及到 FCM 的訊息有兩種,一種是 Notification message,另一種是 Data message。
- Notification message:FCM 會自動將這種訊息顯示在裝置的通知中心,所以使用者可以看到標題和內容。此外,這種訊息也可以夾帶 key-value 的資訊,但不會被顯示。
- Data message:此種訊息只會有 key-value 的資料,所以 FCM 不會自動將它顯示在裝置的通知中心。而是要由客戶端程式自行處理訊息中的資料。
建立 Android App 來接收 FCM
你可以參考下面的文章,來建立一個 Android App 來接收 Spring Boot 發送出的 FCM。
結論
Firebase Cloud Messaging (FCM) 提供了一套前後端的整合套件。讓你可以發送並接收 push notifications。此外,接收的客戶端程式還提供了多種平台,如 Android、iOS、和 Web。下次當你有需要使用到 push notifications 時,FCM 是不錯的選擇。