使用 Kotlin 從 0 到 1 Android 串接 Firebase 推播 — 進階篇

Sean Lin
verybuy-dev
Published in
9 min readSep 5, 2017

前面的文章中我們完成了基本的環境建立,也使用 Firebase 的後台介面發送出了第一個推播,

當然在一般真實環境中,我們通常會使用我們自已的後端來推送通知給裝置,

而不是用人工一個一個在 Firebase 的後台推送給裝置,

接下來這篇我們就會來介紹如何的使用我們自已的後端推送推播給裝置,

一開始先給大家一個觀念,Firebase 送出來的通知有三種類型 NotificationData 混合,

我們用 Firebase 後台推出來的一率屬於 Notification ,而我們的後端則是可以自已選擇要送出哪一種

接下來就來介紹我們接收通知過來的方式

一、建立 FirebaseMessagingService

首先我們要建立一個 FirebaseMessagingService 來處理 Firebase送過來的訊息

在資料夾下點右鍵選 New -> Kotlin/Class

然後在跳出的視窗中輸入 Class 的名稱,這裡輸入的是 MyFirebaseMessagingService

下面的 Kind 記得選擇 Class

完成 Class 的建立之後,我們要讓它繼承 FirebaseMessagingService

在 kotlin 中繼承的方法是在類別名稱後打一個「 : 」後接要繼承的類別就可以了

建立好類別好後,我們要在 AndroidManifest.xml 裡面加入下面這幾行

注意 .MyFirebaseMessagingService 是要輸入前面建立類別時所用的名稱

這樣我們就完成了這個 Service 的建立

下面來說說如何處理接收到的訊息

二、處理接收到的訊息

處理接收到的訊息我們要使用 override onMessageReceived 這個方法來接收訊息

所以只要在 FirebaseMessagingService 加入下面幾行就可以了

這樣我們就可以處理 Firebase 送出來的訊息了

不過這邊有很重要的一點要注意的是

通常只有 App 在前景的時候我們才能在 onMessageReceive 中處理訊息

當 App 沒有使用處於在背景的情況下時,我們的 onMessageReceive 有時候是接不到訊息的

為什麼會這樣子呢

依據 Firebase 的官方說明,App 在前景時接收到的訊息一率會進入到 onMessageReceived 內

如果要讓後台接收到訊息來讓我們處理的話,一定要傳送出的是 Data 類型

我們在這篇最前面有說用 Firebase 後台送出來的推播一定是屬於 Notification

而在上一篇我們最後測試用 Firebase 後台送出來通知只有 app 在背景才能收到就是因為這個原因

當時我們還沒有加入 MyFirebaseMessagingService 來處理送過來的訊息

所以不會收到通知

但是當我們的 app 在背景時

糸統就會幫我們推出了糸統制式的通知訊息了

接下來寫我們實際在 onMessageReceive 裡面接收訊息的方法

我們要接收的東西是 data 類型,所以所有的值都要自已自訂,

這邊就先自訂 titlebody 分別為通知的標題和內容,寫法如下

這裡的小重點是用 key 取值的時候,有可能會拿到 null 值,

在 kotlin 中我們可以用一個 Elvis Operator 來避免這種狀況

使用方法是在可能會是 null 的地方後面加上 ?: 在接上當拿到 null 時的處理方試,非常的簡單方便

寫好我們需要接收到的內容後,就可以發送出我們的通知了

發送通知的方法和我們以前送出的方法一樣,這裡直接附上程式碼

這裡比較重要的點是在 Android 8.0 以後,發送通知要加入通知頻道,不然會沒有辨法送出通知

寫到這邊,我們在手機端接收和送出通知的部份就完成了

只要 Firebase 的 server 送來我們指定格式的內容我們都可以順利接到並把通知發送出去

接下來我們來介紹如何與我們自已的後端串接

三、取得我們的 Firebase Token

要與後端得串接我們要先告訴我們的後端我們的 device token

這個 token 就像我們的地址一樣,我們要告訴後端(寄件人)我們的 device token (地址)

後端在要傳送的通知(信件)上寫入 device token 後,把通知傳給 Firebase (郵差)

然後 Firebase 就可以循者 device token 把通知丟我們的裝置

要獲取 Firebase 的 token ,我們需要加入另一個 service FirebaseInstanceIdService

我們先建立一個 MyFirebaseInstanceIDService 類別,

建立的方法在最前面有寫了,這邊不在贅述

建立好類別後,一樣要在 AndroidManifest.xml 裡加入下面幾行

這邊 .MyFirebaseInstanceIDService 記得填入自已取的名稱,不一定要跟這邊一樣

建立完成後,我們要在 MyFirebaseInstanceIDService 中覆寫 onTokenRefresh 這個方法,

只要每次 Firebase token 有新增或變動的時候都會觸發這個方法,

我們只要再使用 FirebaseInstanceId.getInstance().getToken() 就拿到 device token 了

一般情況下在這邊寫好一更新 token 就傳送給後端更新的功能就可以了,

因為這邊文章中我們沒有實際的後端,所以先簡單的 log 下 device token 讓我們等下使用

寫好這一段程式碼後,可以執行看看是不是有正確拿到 token

有正確拿到 token 後,記得把這串 token 記下來等下使用

四、模擬後端的推播

前面說過因為我們沒有真正的寫一個後端來發送推播給我們,

不過我們可以簡單的使用 postman 這個軟體來模擬送出推播的請求給 Firebase

首先先去 postman 的網站下載這這個程式

下載執行後,我們先建立一個 post 請求,

請求位置是 https://fcm.googleapis.com/fcm/send

切到 Headers 的頁籤新增兩個參數分別是

  1. [{“key”:”Content-Type”,”value”:”application/json”}]
  2. [{“key”:”Authorization”,”value”:”key=”你的伺服器金鑰””}]

注意 Authorization 的 value 是要墳入 “key=你的伺服器金鑰”

伺服器金鑰可以在 Firebase 的專案設定裡面找到

接下來切換到 body 的頁籤前選擇 raw 的類型後在旁邊的下拉選單選擇 JSON(application/json)

然後打入我們的推播內容

這邊 to 的地方要寫的是是我們前面有記下來的 device token,

接下來 data 下面的參數就是我們自訂的 title 和 body 兩個

並分別寫入我們想傳送的值

都完成已後按下藍色的 Send 送出請求

順利的話手機會收到我們送出去的通知

Firebase 也會回應我們成功的訊息如下

如果有失敗的話,這邊也會顯示原因,讓我們快速的處理問題

TL;DR

這篇文章主要在於幫助沒有串接過 Firebase 推播的 Android 開發者

從 Firebase 的專案申請、Android 專案的建立,到 Android 接收到訊息後的處理和跟後端的串接

簡單的從頭到尾走一遍串接的整個過程,希望能夠幫助到沒有串接過的開發者

如有任何疑問或不對的地方歡迎留言指教

也因為這篇的內容寫的比較基礎一點,實務上會有一些更複雜的狀況

如收到的推播通知當擊通知後導到自已預期的頁面,或是行銷團隊使用 Firebase 後台送出優惠通知的處理…等等

目前 Verybuy 的 app 都有實做這些功能,所以如果在處理這些問題碰到困難的時候,

也歡迎留言討論喔 😊

下面是本文的範利程式碼:

--

--