再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"
}
}
優點
- 你不需要解析
- 你不需要去處理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自己需要怎麼程度的顯示。