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直接回應

15 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 時,價格要怎麼計算呢?

    謝謝老師!

    回覆

發表迴響

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