海外 App 的推送服務,試試 FCM 吧!!!

承香墨影發表於2017-09-02

版權宣告:

本賬號釋出文章均來自公眾號,承香墨影(cxmyDev),版權歸承香墨影所有。

每週會統一更新到這裡,如果喜歡,可關注公眾號獲取最新文章。

未經允許,不得轉載。

一、前言

推送服務在國內有很多服務商,但是如果是做海外 App ,推薦還是使用 Google 自己的推送服務,畢竟海外常用的手機型號,都是有 Google 服務在的。

Google 的推送服務,以前叫做 GCM(Google Cloud Message)。而自從 Google 將 Firebase 收購之後,就將推送服務併到 Firebase 的一項服務中了,現在叫做 FCM。

本文就在 Android 下,整合 FCM 的過程,做一個詳盡的講解。

二、什麼是 Firebase

Firebase 原本是一家實時後端資料庫的創業公司,主要用於幫開發者快速的寫出 Web 端和移動端的應用,類似於國內 Bmob 這種後端雲服務,讓前端或者客戶端開發者,一行服務端程式碼都不用寫,只需要簡單的配置,就可以快速的開發出一款引用來。

Bmob 我也只是看了文件,沒有實際使用過,具體怎麼樣不做評價。

之後 Firebase 被 Google 收購,開始使用 Google 的雲服務,又增加了一些 Google 本身的服務,更豐富了它的功能。

Firebase 除了支援 Android 之外,也支援其他的一些語言和平臺,例如:iOS、C++、Unity。

基本上你能想到的功能,Firebase 都是支援的,主要我覺得比較好用的功能:授權登入、推送、實時資料庫、CDN儲存、崩潰報告、事件統計、帶回源的動態邀請、廣告、推廣等。

所以如果你需要開發一款在海外使用的 App 的話,Firebase 是一個不錯的選擇,Firebase 採用的是模組化整合,使用到什麼功能,就整合什麼功能即可。

有關 Firebase 詳細的內容,可以參見官方文件:

firebase.google.com/docs/

只要需要用到 Firebase 的功能,前提就是必須將 Firebase 的基礎服務整合到專案中。

Firebase 的整合非常的簡單,只需要註冊一個 Google 帳號,然後在其中新建一個 App ,配置好對應的配置,將 App 的 google-service.json 這個配置檔案下載下來,放在專案的對應位置即可。

沒什麼好細說的,直接看官方文件,一步一步走就可以了。

firebase.google.com/docs/androi…

最終生成的 App 大概是這樣的:

/fcm-app.png
/fcm-app.png

在設定裡就可以下載 google-services.json 檔案。

/fcm-googlejson.png
/fcm-googlejson.png

三、使用 FCM

到這裡,基本上就認為你已經成功整合 Firebase 到你的專案內了,接下來就開始整合 FCM 的模組了。

3.1 設定 Firebase 和 FCM SDK

在 build.gradle 檔案,新增 FCM 的依賴。

/fcm-gradle.png
/fcm-gradle.png

官方的例子中使用的是 10.2.6,但是實際上推薦使用新版 11.0.4 。

3.2修改 AndroidManifest.xml

FCM 主要的兩個 Service ,都需要在 Manifest 中進行配置。

1、繼承自 FirebaseMessagingService 的服務。

它主要用於處理接收 App 正在執行的時候,接收到的推送,一般而言我們也不會只是想要接收 App 不在執行時候的推送,所以通常都需要整合它。

/fcm-messageservice.png
/fcm-messageservice.png

2、繼承 FirebaseInstanceIdService 的服務。

它主要用於管理 FCM 的註冊令牌(下文簡稱 FCM_TOKEN ),以及更改等。它可以獲取到使用者裝置唯一的一個 FCM_TOKEN ,向單個使用者推送訊息的時候使用。

/fcm-idservice.png
/fcm-idservice.png

3.3 FCM 中兩個關鍵服務

1、MyFirebaseMessagingService

先來看看它的結構。

/fcm-msgservice.png
/fcm-msgservice.png

這裡,我們真正需要關心的只有 onMessageReceived() 方法,它會在接收到推送的時候被回撥。注意這裡的方法都是在 WorkerThread 執行緒中完成的,所以要額外注意操作 UI 的情況。

onMessageReceived() 方法的回撥中,會傳遞一個 RemoteMessage 的物件,它包含了接收到的推送的所有內容。我們需要根據這個推送傳遞過來的資訊,進行額外的操作。例如:彈窗提醒、建立一個 Notification 等等。

2、MyFirebaseInstanceIDService

繼續看看它的結構。

/fcm-ids.png
/fcm-ids.png

其實內部有一些被混淆了的方法,但是我們真正關心的只有 onTokenRefresh() 這一個方法,它會在 FCM_TOKEN(文件裡叫令牌) 被重新整理的時候回撥。

正常來說,App 啟動的時候,會被分配一個 FCM_TOKEN ,它可以通過 FirebaseInstanceId.getInstance().getToken() 這個 Api 獲取到,但是它並非一成不變的,當它變動的時候,就會回撥 onTokenRefresh() 方法。所以如果有對單個使用者推送的業務邏輯的話,這裡就需要上報給你的服務端,當前使用者的 FCM_TOKEN 了。

到這裡,基本上就算是完成了 FCM 的整合,具體細節,建議檢視官方文件。

firebase.google.com/docs/cloud-…

3.4 開始嘗試推送

當你一切都配置完成之後,你就可以在 Firebase 的後臺,Notifications 的模組,進行訊息的推送。(也可能是由服務端來實現推送功能)

首先你需要配置一個內容,就是 Message text

/fcm-messagetext.png
/fcm-messagetext.png

當然,FCM 和眾多推送一樣,同時支援推送所有使用者、Topic 分組、單個裝置,這裡只推送我指定的裝置。

/fcm-target.png
/fcm-target.png

還可以為 FCM 推送訊息配置一個 Title ,並且它是支援最新 Android O 中支援的 Notification Channel 的配置。如果有需要,可以再配置傳遞的引數。

/fcm-params.png
/fcm-params.png

點選 SEND MESSAGE 按鈕,你就可以在裝置上收到你的推送訊息。

/fcm-noti1.png
/fcm-noti1.png

展開後的效果:

/fcm-noti5.png
/fcm-noti5.png

到這裡,基本上算是完成的 FCM 的整合與使用。

四、FCM 使用的坑

前面的內容,基本上都是你在官方文件上能查閱到的,接下來講的,就是乾貨中乾貨。說是幹活,就是使用過程中遇到的一些坑。

4.1 App 是否執行,決定了推送走的兩條線路

App 在執行的時候,推送如果有 Notification ,一般也是我們自己去控制的,所以最終它點選後的效果,我們是可以通過 PendingIntent 做部分定製的。

但是如果是在 App 沒有執行的情況下,就完全歸 FCM 服務幫你完成這一系列的操作,它點選後的效果,只能將你的 App 調起,並且把你需要的引數傳遞到你的 SplashActivity(Action 為 android.intent.action.MAIN 的 Activity) 上。

所以我們就需要考慮兩種情況下,資料的傳遞已經響應,這個是需要根據業務來討論的,空聊是沒有意義的。

4.2 推送服務的 icon 和 字型顏色

前面看到,使用 FCM 如果在 App 沒有執行的情況下,是完全不受控的。但是 FCM 依然為我們提供了配置 icon 的地方,如果你不配置,你將會受到一個白色的小方塊圖示的推送。

/fcm-noti3.png
/fcm-noti3.png

FCM 的推送通知,可以配置 icon 以及 App 名稱的顏色,像前面 Demo 的例子中,就是直接使用 Firebase 的 Github 上的 Demo 的圖片。

對 icon 和 字型顏色的配置,需要在 AndroidManifest.xml 中進行。

/fcm-icon.png
/fcm-icon.png

還有一點需要注意,通常我們 App 的 Icon 都做的非常的精美,但是這種 Icon 是無法直接使用在 FCM 的推送上的。需要額外的定製,以及對應的尺寸。

FCM Icon 的標準:背景透明,以白色圖案填充。(實際上,展開後的效果會將icon 進行著色,所以任何顏色最終都會被著色成我們配置的顏色,不配置預設是個淺灰色)。

/fcm-icondemo.png
/fcm-icondemo.png

而它的尺寸,如下表所示:

當然,它和圖示的適配一樣,不一定需要全套,只需要配置我們需要的尺寸即可。

如果配置好這些,依然得到的是一個白色的小塊,可以嘗試升級一下 FCM 的版本,低版本好像是有這個 Bug ,在新版已經解決了。

五、結語

到這裡基本上 FCM 的一些使用細節都講解清楚了。如果還有問題,推薦查閱官方文件或者直接看 Github 上的 Demo 。

github.com/firebase/qu…

其實整體來看 Firebase 提供的服務,使用起來都非常的方便。如果一直收不到推送,檢查你的上網方式,畢竟是給海外 App 使用的。再有問題,可以文末留言。等你問我的時候我還記得的話,我肯定會回覆你的。

公眾號二維碼.jpg
公眾號二維碼.jpg

點贊或者分享吧~

相關文章