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

版權聲明:前端

本帳號發佈文章均來自公衆號,承香墨影(cxmyDev),版權歸承香墨影全部。android

每週會統一更新到這裏,若是喜歡,可關注公衆號獲取最新文章。git

未經容許,不得轉載。github

1、前言

推送服務在國內有不少服務商,可是若是是作海外 App ,推薦仍是使用 Google 本身的推送服務,畢竟海外經常使用的手機型號,都是有 Google 服務在的。數據庫

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

本文就在 Android 下,集成 FCM 的過程,作一個詳盡的講解。後端

2、什麼是 Firebase

Firebase 本來是一家實時後端數據庫的創業公司,主要用於幫開發者快速的寫出 Web 端和移動端的應用,相似於國內 Bmob 這種後端雲服務,讓前端或者客戶端開發者,一行服務端代碼都不用寫,只須要簡單的配置,就能夠快速的開發出一款引用來。app

Bmob 我也只是看了文檔,沒有實際使用過,具體怎麼樣不作評價。模塊化

以後 Firebase 被 Google 收購,開始使用 Google 的雲服務,又增長了一些 Google 自己的服務,更豐富了它的功能。字體

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

基本上你能想到的功能,Firebase 都是支持的,主要我以爲比較好用的功能:受權登陸、推送、實時數據庫、CDN存儲、崩潰報告、事件統計、帶回源的動態邀請、廣告、推廣等。

因此若是你須要開發一款在海外使用的 App 的話,Firebase 是一個不錯的選擇,Firebase 採用的是模塊化集成,使用到什麼功能,就集成什麼功能便可。

有關 Firebase 詳細的內容,能夠參見官方文檔:

https://firebase.google.com/d...

只要須要用到 Firebase 的功能,前提就是必須將 Firebase 的基礎服務集成到項目中。

Firebase 的集成很是的簡單,只須要註冊一個 Google 賬號,而後在其中新建一個 App ,配置好對應的配置,將 App 的 google-service.json 這個配置文件下載下來,放在項目的對應位置便可。

沒什麼好細說的,直接看官方文檔,一步一步走就能夠了。

https://firebase.google.com/d...

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

/fcm-app.png

在設置裏就能夠下載 google-services.json 文件。

/fcm-googlejson.png

3、使用 FCM

到這裏,基本上就認爲你已經成功集成 Firebase 到你的項目內了,接下來就開始集成 FCM 的模塊了。

3.1 設置 Firebase 和 FCM SDK

在 build.gradle 文件,添加 FCM 的依賴。

/fcm-gradle.png

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

3.2修改 AndroidManifest.xml

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

一、繼承自 FirebaseMessagingService 的服務。

它主要用於處理接收 App 正在運行的時候,接收到的推送,通常而言咱們也不會只是想要接收 App 不在運行時候的推送,因此一般都須要集成它。

/fcm-messageservice.png

二、繼承 FirebaseInstanceIdService 的服務。

它主要用於管理 FCM 的註冊令牌(下文簡稱 FCM_TOKEN ),以及更改等。它能夠獲取到用戶設備惟一的一個 FCM_TOKEN ,向單個用戶推送消息的時候使用。

/fcm-idservice.png

3.3 FCM 中兩個關鍵服務

一、MyFirebaseMessagingService

先來看看它的結構。

/fcm-msgservice.png

這裏,咱們真正須要關心的只有 onMessageReceived() 方法,它會在接收到推送的時候被回調。注意這裏的方法都是在 WorkerThread 線程中完成的,因此要額外注意操做 UI 的狀況。

onMessageReceived() 方法的回調中,會傳遞一個 RemoteMessage 的對象,它包含了接收到的推送的全部內容。咱們須要根據這個推送傳遞過來的信息,進行額外的操做。例如:彈窗提醒、建立一個 Notification 等等。

二、MyFirebaseInstanceIDService

繼續看看它的結構。

/fcm-ids.png

其實內部有一些被混淆了的方法,可是咱們真正關心的只有 onTokenRefresh() 這一個方法,它會在 FCM_TOKEN(文檔裏叫令牌) 被刷新的時候回調。

正常來講,App 啓動的時候,會被分配一個 FCM_TOKEN ,它能夠經過 FirebaseInstanceId.getInstance().getToken() 這個 Api 獲取到,可是它並不是一成不變的,當它變更的時候,就會回調 onTokenRefresh() 方法。因此若是有對單個用戶推送的業務邏輯的話,這裏就須要上報給你的服務端,當前用戶的 FCM_TOKEN 了。

到這裏,基本上就算是完成了 FCM 的集成,具體細節,建議查看官方文檔。

https://firebase.google.com/d...

3.4 開始嘗試推送

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

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

/fcm-messagetext.png

固然,FCM 和衆多推送同樣,同時支持推送全部用戶、Topic 分組、單個設備,這裏只推送我指定的設備。

/fcm-target.png

還能夠爲 FCM 推送消息配置一個 Title ,而且它是支持最新 Android O 中支持的 Notification Channel 的配置。若是有須要,能夠再配置傳遞的參數。

/fcm-params.png

點擊 SEND MESSAGE 按鈕,你就能夠在設備上收到你的推送消息。

/fcm-noti1.png

展開後的效果:

/fcm-noti5.png

到這裏,基本上算是完成的 FCM 的集成與使用。

4、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 的推送通知,能夠配置 icon 以及 App 名稱的顏色,像前面 Demo 的例子中,就是直接使用 Firebase 的 Github 上的 Demo 的圖片。

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

/fcm-icon.png

還有一點須要注意,一般咱們 App 的 Icon 都作的很是的精美,可是這種 Icon 是沒法直接使用在 FCM 的推送上的。須要額外的定製,以及對應的尺寸。

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

/fcm-icondemo.png

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

固然,它和圖標的適配同樣,不必定須要全套,只須要配置咱們須要的尺寸便可。

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

5、結語

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

https://github.com/firebase/q...

其實總體來看 Firebase 提供的服務,使用起來都很是的方便。若是一直收不到推送,檢查你的上網方式,畢竟是給海外 App 使用的。再有問題,能夠文末留言。等你問個人時候我還記得的話,我確定會回覆你的。

公衆號二維碼.jpg

點贊或者分享吧~

相關文章
相關標籤/搜索