Android — Firebase Push 有時後不會顯示前後景會遇到的問題

JLin
5 min readMar 18, 2021

--

再Android Firebase的Push會有幾個問題

主要講到PUSH之差異

FCM的推播訊息分成兩種類型
• 顯示訊息: 此種類型只有在APP於前景時會觸發OnMessageReceived()
• 資料訊息: 此種類型在前景/背景/程序由Task移除 時,皆會觸發OnMessageReceived()。

如果你由Firebase網頁介面端發出的訊息都是屬於顯示訊息的類型,若要發送資料類型的推播訊息,則需呼叫FCM的API自行Post資料。

先講結論

A.也就是如果你只希望APP在背景會顯示通知提醒,而不去控制點選動作,或是APP再執行中還需要顯示PUSH,那就很適合直接用訊息類的PUSH類的

B.如果你希望在執行中也跳出PUSH通知,那建議你使用Data類型的PUSH,但你需要統一再OnMessageReceived()接收到資料後統一處理後自己丟出通知的API

C.如果你希望背景時後可以收到通知,然後前景的實後可以收到並且解析裡面的Data進行使用或運用,那你其實可以同時接收訊息與Data的Push來使用.

譬如Push JSON

"to": "{token}",
"notification": {
"title": "This is Title",
"body": "This is Body",
"sound": "Enabled",
"action": "1"
}
}

關於背景

1.Background
純背景時後,只會吃系統的notification json,會直接讓系統抓 notification.title / body進行顯示使用,
即使你有丟了data payload也就不會處理,也不會收到OnMessageReceived()

ex.
正常通知(僅背景會顯示)

"to": "{token}",
"notification": {
"title": "This is Title",
"body": "This is Body",
"sound": "Enabled",
"action": "1"
}
}

優點

  1. 你不需要解析
  2. 你不需要去處理OnMessageReceived()

缺點

1. 再前景時後APP不會有任何反應

訊息+資料PUSH

背景時後,即時多了data格式,系統也會因為再背景並且已經有notification,會被系統先搶走,而不會收到OnMessageReceived(),也就無法處理data格式。

ex.

{
"to": "{token}",
"notification": {
"title": "This is Title",
"body": "This is Body",
"sound": "Enabled",
"action": "1"
},
"data": {
"showType": 1
}
}

Foreground

當APP前景的時候,系統就不會完全不會處理notification的title/body,由app收到onMessageReceived()後進行處理
最後由app自己決定丟到notification的文字與PendingIntent行為

ex.

{
"to": "{token}",
"notification": {
"title": "This is Title",
"body": "This is Body",
"sound": "Enabled",
"action": "1"
},
"data": {
"showType": 1
}
}

這時候系統不會顯示Notification通知只會收到onMessageReceived()
由APP自行去解析remoteMessage.data & remoteMessage.notification 來自行應用。

通知資料就會從這邊抓

remoteMessage.notification?.let{}

因此如果想要不管在前後景都能接收onMessageReceived()並且自行控制

就是只使用remoteMessage.data的方式

這樣不管在前後景, APP都可以收到onMessageReceived() callback

注意:不能帶入”notification”,否則在背景實後就會由系統接收,不會再app中得到onMessageReceived()

ex.

{
"to": "{token}",
"data": {
"title": "This is Title",
"body": "This is Body",
"sound": "Enabled",
"action": "1"
"showType": 1
}
}

像是這樣,就可以讓APP無論在前後景都可以自己控制PUSH的處理跟接收Data資料欄位,自由度比較高,但需要手動去處理解析資料跟丟Local Push,各有優缺點,端看各位的APP自己需要怎麼程度的顯示。

--

--

JLin

台中 / JAVA / Android /Kotlin / Kotlin Native 對於Kotlin衍生的JVM等技術 Compose for web / desktop / Ktor Server,生成式AI (Gemini/OpenAI)各式應用, 都有小興趣