AndroidアプリでメッセージングサービスにFirebaseを使用しています。Firebaseをかなり調査し、 アプリがフォアグラウンドで実行されている場合はまたは、onMessageReceivedメソッドで受信したデータのタイプを変更します 。
私が達成しようとしているのは、Remotemessageからの着信データを解析し、カスタムタグに応じて異なる処理を行うことです。 IEで、データマップに「My_Custom_Tag」というフィールドが含まれている場合、ポップアップする標準のファイヤーベースメッセージを完全にオーバーライドし、カスタムメッセージを作成します。
問題は、アプリがバックグラウンドで実行されているときに、onMessageReceivedneverに入力したコードがトリガーされることです。アプリがフォアグラウンドで実行されている場合は正常に動作しますが、アプリがバックグラウンドにある場合は何も検出/受信しません。
以下にいくつかのサンプルコードを示します。
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Map<String, String> aMap = remoteMessage.getData();
//Custom object here for easier parsing
PushNotificationsPojo pojo = this.convertResponseToPojo(aMap);
if(pojo == null){
passToFirebase(remoteMessage);
return;
}
if(pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_CHAT_MESSAGE)) {
createCustomNotification1(pojo);
} else if (pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_SOME_OTHER_MESSAGE)){
createCustomNotification2(pojo);
} else if (pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_STUFF_AND_WHATNOT)) {
createCustomNotification3(pojo);
} else {
passToFirebase(remoteMessage);
}
}
私の質問は、MyFirebaseMessagingServiceを編集して受信データを確認し、タグ情報を決定し、それをfirebaseに渡して標準処理を使用できるようにするか、firebaseに渡さずに書き込みできるようにするかです。アプリがバックグラウンドで実行されている間、カスタム表示通知をすべて所有しますか?
皆さんありがとう!
PS、 Firebase-Dungeon-Master Frank van Puffelen に何か考えがありますか?
OnMessageReceivedメソッドにデータペイロードを配信するには、FCMメッセージから通知ペイロードを削除します。
アプリがバックグラウンドにある場合、通知ペイロードがない場合にのみ、データペイロードがonMessageReceivedメソッドに配信されます。 (単語にマークを付ける)
両方のペイロードが存在する場合、システムは通知部分(システムトレイ)を自動的に処理し、アプリは(ユーザーが通知をタップした後)ランチャーアクティビティのインテントの追加でデータペイロードを取得します。
AndroidとiOSの両方のプラットフォームを正常に提供できるようにするには、クライアントのOSに応じて異なるFCMメッセージを送信する必要があります。
Guyzよく聞いてください。多くのリンクをたどり、最終的に解決策を見つけました。
このペイロードは機能します...
{
"data":{
"title": "hello",
"body": "this is body"
},
"to": "c5iuJ7iDnoc:APA91bG6j2c5tiQ3rVR9tBdrCTfDQYxkPwLuNFWzRuGHrBpWiOajR-DKef9EZEEVKA-kUBfXVcqHT-mClYfad06R_rBjhRZFKVdBL7_joXE5hFEwR45Qk8wgQdia2b-LmjI1IheFGZS8"
}
このペイロードは機能しません...
{
"notification":{
"title": "hello",
"body": "this is body"
},
"to": "c5iuJ7iDnoc:APA91bG6j2c5tiQ3rVR9tBdrCTfDQYxkPwLuNFWzRuGHrBpWiOajR-DKef9EZEEVKA-kUBfXVcqHT-mClYfad06R_rBjhRZFKVdBL7_joXE5hFEwR45Qk8wgQdia2b-LmjI1IheFGZS8"
}
負荷に「通知」が含まれている場合、onMessageReceivedは呼び出されないため
Android=で、notification
とdata
の両方のペイロードを使用する場合、Androidシステムnotification
にあるものをキャッチし、data
ペイロードがタップされたときにインテントに含まれます。
知る限り、これが唯一の方法です(@ArthurThompson here で述べられているとおり)。onMessageReceived()
が常に呼び出されることを本当に確認したい場合は、 data
ペイロードを使用します(@DiegoGiorginiで述べたように here )。
私は自分で試したことはありませんが、 ステータスバーにどの通知があるかを確認する を考えましたか?その後、通知が存在する場合(ただし、実際にアプリの通知であるものを識別します)。通常、onMessageReceived()
内で呼び出すメソッドを呼び出します。
また、メッセージを送信するデバイスがアプリサーバーのAndroidデバイスであるかどうかを検出し、data
ペイロード。