8

AndroidアプリでメッセージングサービスにFirebaseを使用しています。私はFirebaseをかなり研究しており、私はそれがwhether the app if running in the foreground or now will change the type of data received in the onMessageReceived methodであることを理解しています。アプリがバックグラウンドのときにFirebase onMessageReceivedが呼び出されない

私が達成しようとしているのは、Remotemessageからの受信データを解析し、カスタムタグに応じて異なるものを実行することです。 IEのデータマップに「My_Custom_Tag」というフィールドが含まれている場合は、標準のfirebaseメッセージを完全に上書きしてカスタムフィールドをポップアップして書きたいと考えています。

問題は、アプリがバックグラウンドで実行されているときに、私がonMessageReceivedに入れたコードは決してになります。アプリがフォアグラウンドで実行されているときはうまく動作しますが、アプリがバックグラウンドにある場合は何も検出/受信しません。

@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に渡したり、独自のカスタム表示通知を書くことはできません。

ありがとうございます!

PS、万が一Firebase-Dungeon-Master Frank van Puffelenに考えがありますか?

+0

送信するFCMメッセージにはどのようなタイプのペイロードが含まれていますか?通知、データ、またはその両方? – kws

+0

両方とも、ほとんどの場合です。それはクロスプラットフォームなので、IOSは通知オブジェクトを送信する必要がありますが、私たちのデータの大半はDataオブジェクトからのものです。 – Silmarilos

答えて

18

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

thisthisを注意深く読んでください。

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

ペイロードが両方とも存在する場合、システムは通知部分(システムトレイ)を自動的に処理し、アプリケーションはランチャーアクティビティの意図の余分でデータペイロードを取得しますお知らせ)。

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

+1

素晴らしい答え。助けてくれてありがとうございました。 – Silmarilos

+0

ライフセーバー解答!!! –

1

かなり確信して、あなたはすでにAndroidの中に行動を知っているの両方notificationdataペイロードを使用している場合、Androidシステムはnotificationに何キャッチし、それがタップだときdataペイロードは意図に含まれていること。

私の知る限りでは、これは(@ArthurThompson hereで述べた通り)、それが行くとあなたが本当にonMessageReceived()が常に呼び出されたことを確認する場合は、あなたが@DiegoGiorginiで述べたようにのみ(dataペイロードを使用する必要が唯一の方法でありますhere) しかし、私は周りを見回しました。おそらく別の方法があります。

方法お電話、(あなたが実際にしかしアプリの通知である1識別できる場合全くわからない)あなたの通知が存在して、その後あれば、私は自分自身をそれを試していないが、しかし、あなたがchecking which notifications are in the Status Bar考えられています通常はonMessageReceived()に電話してください。

メッセージを送信するデバイスがあなたのアプリケーションサーバーのAndroidデバイスであるかどうかを検出してから、dataペイロードのみを送信するという方法もあります。

2

このpostには、答えが Kootである可能性があります。彼は言った "私は同じ問題がありました。 '通知'の代わりに 'データメッセージ'を使用する方が簡単です。データメッセージは常にクラスonMessageReceivedを読み込みます。

私の解決策は、彼のアドバイスまいらはよく聞き

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

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

あたりのようですが、私は多くのリンクを経て、最終的にここに解決策を見つけました。アプリがある場合は、バックグラウンドonMessageReceived方法は、このペイロード

を呼び出す必要があります

  1. う作品...

    { 
        "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は

+0

コードサンプルは、他の回答が説明しているものを示していますが、他のペイロードは機能しません。Firebaseサービスで処理され、カスタムコードでは処理されません。 – Silmarilos

+0

こんにちは、アプリがバックグラウンドにあるときに私を助けてくれますシステムトレイで処理された2つの通知を受け取りました。どのようにこれを修正できますか? – sssvrock

+0

sssvrockです。これは、通知とデータの両方を含むペイロード(IOS、Androidの両方のIE)を取得したときに発生します。この問題を解決するには、2つのタイプを区別します。詳細は私の質問を参照してください:https://stackoverflow.com/questions/45286202/how-does-one-distinguish-between-android-and-ios-firebase-ids-for-push-notificat – Silmarilos

関連する問題