Firebase雲端訊息-發送測試通知至Android APP中

作者 | 2016-06-26

Firebase Cloud Messaging與GCM最大的進步是主控台網頁,在網頁上即可送出雲端通知或訊息至裝置中,可用在測試或是對所有上線的裝置送出通知或訊息。

上一篇「Firebase雲端訊息-Android專案導入環境建置與Instance ID」中,我們以Instance ID API建立取得了Token符記,代表Android APP已與Google平台取得聯繫。接下來,要建立另一個接收雲端訊息的Service元件,再從Firebase網頁主控台中送出測試訊息至執行中的裝置中。

建立FirebaseMessagingService元件

請在專案中的「app/java/套件名稱/」下新增一個新類別「New/Java Class」,名稱取為「MyFirebaseMessagingService」,再手動加入繼承Firebase雲端訊息所提供的「FirebaseMessagingService」類別,並覆寫方法,以下程式碼需要import語法:

程式碼如下:

上述類別所覆寫的onMessageReceived方法會在收到雲端訊息時自動被執行,使用Log類別印出除錯訊息,為訊息的傳送者編號。

最後,也別忘了在AndroidManifest.xml中加入service元素,如下:

此時,Android APP已能夠在上線後收到雲端訊息,請執行專案,待會就要送雲端訊息至裝置中了。

Firebase網頁主控台

Firebase Cloud Messaging將訊息分為「Notification通知」與「Data資料」兩種,請回到Firebase網頁介面,按下左方「Notifications」通知功能,如下圖:

A8001

再按下右方的「傳送第一則訊息」,如下圖:

A8002

傳送給APP的所有裝置

填入將傳出訊息文字,如下圖的Testing,在下方的應用程式右方選擇Android專案的

A8003

再按下「傳送」,確定送出測試訊息,如下圖:

A8004

送出後,大概1-3秒後,Android的MyFirebaseMessagingService會收到雲端通知,並自動執行onMessageReceived方法,產生Log訊息如下圖:

A8005

以上由Firebase網頁主控台送出的是「通知,Notification」,當Android APP是在裝置的前景,收到通知時會直接在onMessageReceived方法中取得訊息資料。

假設收到雲端通知時APP是在裝置的背景,此時不會在onMessageReceived中收到通知,Android系統會自動將收到的通知顯示在裝置上方,下拉可顯示更多資訊,如下圖:

A8007

若按下上圖的通知,會啟動帶出我們的APP至前景。

帶出通知的資料

請開啟MainActivity,並覆寫onStart方法,設計以下的程式碼:

在上述程式碼第5行,可以鍵值方式從Intent中取得通知中的資料。

自訂通知標題與資料

通知的格式可透過網頁主控台中的選項,點擊下方的「進階選項」展開如下圖的介面:

A8009

上圖的自訂資料中,新增一個鍵值為msg的資料,送出測試通知訊息後,按下裝置中出現的通知,如下圖:

A8011

方框為標題的文字,Testing3則是本通知的訊息文字,在按下本通知後開啟MainActivity時,可由Intent取得資料鍵值msg,除錯訊息如下:

A8012

傳送給特定裝置

若有特定裝置的Token符記,也可在網頁主控台中針對某一裝置傳送通知,如下圖:

A8013

在目標中選擇「單一裝置」,再將裝置LogCat中的Token複製後貼在「FCM註冊憑證」中,按下送出,即可傳送通知至特定裝置中,下圖為裝置收到的通知:

A8014

相關文章:

使用Facebook直接回應

29 thoughts on “Firebase雲端訊息-發送測試通知至Android APP中

  1. Ricky

    請問FCM在app重未啟用,手機開機後從來沒有打開這個App,是否也可以接到Firebase的雲端訊息

    回覆
  2. Jack

    您好
    不好意思想請問一下
    假如我是要做一個app
    要用帳號註冊登入的方式來區別每個使用者
    這樣是不是無法用這種方式個別傳送訊息給特定裝置呢
    因為看了上述教學
    好像要傳給特定裝置要知道對方的FCM
    那假如使用者是未知的情況下(即可能是下載使用這個程式的任何人)
    是不是就無法個別傳訊息給特定裝置了呢

    回覆
    1. Hank Tom 文章作者

      要傳送雲端推播訊息給一個裝置需要Instance ID的Token,請參考文中最後
      http://litotom.com/2016/06/24/android-firebase-cloud-messaging-1/

      在實作時,取得Token後應該將它與使用者帳號傳送給自己的後台Server儲存,才能在未來要傳送時知道對方的Token(用SQL或noSQL查詢得到)。
      單用FCM還是有其限制,使用它能快速開發出APP的一些功能,較複雜的需求,還是需要APP Server的。

      回覆
  3. Casio

    你好
    有個小問題想請問一下
    我實作了您的教學
    但是在發送訊息的時候
    訊息字數如果太多
    手機上的通知欄會無法完全顯示
    通知欄也不能下拉觀看完整訊息
    請問這是手機的問題嗎
    還是本來就只能顯示特定字數了呢?

    回覆
  4. LUN

    您好,就是我在之前7/11號,測試的時候,可以用(Log 出 token)
    但7/29用的時候就會出現com.google.firebase.auth.FirebaseAuth is not linked. Skipping initialization 和 com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization 這兩樣錯誤
    我有照你加註的方式做,也是會出現問題
    請問還有可能是什麼原因
    謝謝您

    回覆
  5. 翁禪慈

    你好:
    目前手機收到推播訊息時,只看到產生音效而已,請問要如何開啟震動的功能呢?
    Thanks

    回覆
    1. Hank Tom 文章作者

      如果使用Firebase主控台發出的Notification無法辦到時,應改用Data Message,再自行實作客製化的Notification。

      回覆
  6. KaiYang

    我想用php去發訊息給Firebase,再傳訊息給client app(該app未開啟或是在background),所以用,data message格式去傳。
    下方的 $msg是我要傳訊息給firebase,但是一直無法傳訊息,想請問是我php哪裡寫錯呢?
    先謝謝老師 :)
    $msg = “hi”;
    $json = ‘{
    “data”:{
    “message”: ‘$msg’
    }
    }’;
    $message = json_decode($json);
    $message_status = send_notification($tokens, $message);

    回覆
  7. Archangelwu

    請問老師,如果要使用 FCM 時,價格要怎麼計算呢?

    謝謝老師!

    回覆
  8. cola

    請問一下 如何用 fcm 的訊息傳送到 chrome
    有點類似 izooto 的功能

    回覆
  9. Tina Hsu

    老師您好~
    請問您知道如何利用MySql 來觸發事件將firebase的資訊推播至client APP嗎?

    回覆
    1. Hank Tom 文章作者

      可以辦到,看MySQL的版本是否支援trigger後執行平台程式,再看用什麼程式語言實作它

      回覆
  10. Song

    您好, 請問如果在待機情況下,如何在推播後顯示在螢幕上,在未打開螢幕前手機自動打開螢幕顯示那則消息,
    請問該如何做或查詢關鍵字呢?

    回覆
    1. Hank Tom 文章作者

      sorry, 我誤解你的問題了,你要的是Lock Screen Message,請參考: WindowManager.addView

      回覆
    2. Song

      感謝您的回覆,
      可能是我說不太清楚吧,

      像是wake-lock,敘述類似
      收到推播後,螢幕會亮幾秒後,會知道有訊息了,然後在關閉螢幕,
      是不是也與PowerManager 有關呢?

      謝謝

      回覆
  11. willy

    老師您好,我想請教一下,當application在背景或關閉時收到推播
    要如何讓icon加上badge?
    在foreground時可以override “onMessageReceived”去實現此功能
    但在background時該怎麼做呢?

    回覆
  12. Tomcat

    HANK 老師您好,
    在下碰到的問題, 有時訊息送出後, 1秒內就能收到, 有時又慢至30秒或幾分鐘.
    是否為 FCM 天生的限制? 或是在付費後能得到較佳的結果?
    還是因為手機程式並未持續與 FIREBASE 連線, 使得 DATA MESSAGE 傳送的DELAY
    無法預知呢?
    先感謝您的回覆.

    回覆
  13. Tomcat

    HANK 老師您好,
    我們在實作data message時, 有時會delay 30秒~1分鐘. 才收到, 不知道問題在那兒.
    有時速度又非常快. 不到1秒就送到了. PRIORITY 已設為 HIGH
    請問您有沒有類似的經驗. 有辦法改善嗎?
    感謝您的回覆

    回覆
  14. Eric

    老師您好 目前按照步驟可以做到 當APP在背景 或者被關閉時 接收到推播可以顯示在上方,當app在前景時上方並不會顯示推播訊息在上方但是查看log是有接收到的,所以我在想,當APP在前景時接收到推播訊息 可以做一個對話框 讓對話框顯示資訊,我應該如何實作呢?

    回覆
    1. Eric

      還有老師我發現 我的onMessageReceived 並沒有被呼叫到 為什麼呢?

      回覆

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *