web-dev-qa-db-ja.com

Firebase onMessageReceivedがアプリがバックグラウンドにあるときに呼び出されない

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 に何か考えがありますか?

9
Silmarilos

OnMessageReceivedメソッドにデータペイロードを配信するには、FCMメッセージから通知ペイロードを削除します。

this および this を注意深く読んでください。

アプリがバックグラウンドにある場合、通知ペイロードがない場合にのみ、データペイロードがonMessageReceivedメソッドに配信されます。 (単語にマークを付ける

両方のペイロードが存在する場合、システムは通知部分(システムトレイ)を自動的に処理し、アプリは(ユーザーが通知をタップした後)ランチャーアクティビティのインテントの追加でデータペイロードを取得します。

AndroidとiOSの両方のプラットフォームを正常に提供できるようにするには、クライアントのOSに応じて異なるFCMメッセージを送信する必要があります。

30
kws

Guyzよく聞いてください。多くのリンクをたどり、最終的に解決策を見つけました。

  1. アプリがバックグラウンドの場合、onMessageReceivedメソッドを呼び出す必要があります

このペイロードは機能します...

{
  "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は呼び出されないため

5
sssvrock

この postKoot の答えがあなたの解決策かもしれません。 「同じ問題が発生しました。「通知」の代わりに「データメッセージ」を使用する方が簡単です。データメッセージは常にクラスonMessageReceivedをロードします。」

私の解決策は彼のアドバイスによる

{
  "condition": "'reader' in topics",

  "data": {
    "title":"Please Check",
    "message": "This is a Firebase Cloud Messaging Topic Message 5!"
   }
}
2
Ko Nyan

Android=で、notificationdataの両方のペイロードを使用する場合、Androidシステムnotificationにあるものをキャッチし、dataペイロードがタップされたときにインテントに含まれます。

知る限り、これが唯一の方法です(@ArthurThompson here で述べられているとおり)。onMessageReceived()が常に呼び出されることを本当に確認したい場合は、 dataペイロードを使用します(@DiegoGiorginiで述べたように here )。

私は自分で試したことはありませんが、 ステータスバーにどの通知があるかを確認する を考えましたか?その後、通知が存在する場合(ただし、実際にアプリの通知であるものを識別します)。通常、onMessageReceived()内で呼び出すメソッドを呼び出します。

また、メッセージを送信するデバイスがアプリサーバーのAndroidデバイスであるかどうかを検出し、dataペイロード。

1
AL.