Spring Boot: 利用 FCM 發送 Push Notifications

Photo by Heidi Kaden on Unsplash
Photo by Heidi Kaden on Unsplash
Firebase Cloud Messaging (FCM) 可以讓我們傳送訊息給 Android、iOS、或 Web 應用程式,也就是所謂的 push notifications(推播)。本文章將介紹如何在 Spring Boot 透過 FCM 發送 push notification。

Firebase Cloud Messaging (FCM) 可以讓我們傳送訊息給 Android、iOS、或 Web 應用程式,也就是所謂的 push notifications(推播)。本文章將介紹如何在 Spring Boot 透過 FCM 發送 push notification。

設定 Firebase Console

打開 Firebase Console。如果你還沒有任何 Firebase project 請先建立一個新的 Firebase project。之後,你必須要先建立一個 app。如果不熟悉如何建立一個 app 的話,可以參考以下的文章。

在這邊我們建立一個叫 FCM Example 的 app。

Firebase Project
Firebase Project

點選你建立的 app 來進入專案設定,並切換至 Service accounts。

Firebase Service Accounts
Firebase Service Accounts

點選 Generate new private key 按鈕,它會跳出以下的視窗。點選 Generate key 按鈕後,你會下載一個 JSON 檔案。下載後,將這個 JSON 檔案重新命名為 fcm_service_account.json。

Firebase Generate Key
Firebase Generate Key

建立 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 是不錯的選擇。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like
Photo by Charles Jackson on Unsplash
Read More

Springdoc-OpenAPI 教學

Springdoc 是一個整合 OpenAPI Specification 和 Spring Boot 的套件。和 SpringFox 套件一樣,它產出 Swagger 文件。兩者不同在於,Springdoc 是用 Swagger 3,而 SpringFox 是用 Swagger 2。
Read More