アプリがFirebaseでバックグラウンドにあるときに通知を処理する方法


429

これが私のマニフェストです

    <service android:name=".fcm.PshycoFirebaseMessagingServices">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <service android:name=".fcm.PshycoFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

アプリがバックグラウンドで通知が届くと、デフォルトの通知が来て私ののコードを実行しませんonMessageReceived

これが私のonMessageReceivedコードです。アプリがバックグラウンドで実行されているときではなく、フォアグラウンドで実行されている場合に呼び出されます。アプリがバックグラウンドでもこのコードを実行する方法は?

// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // If the application is in the foreground handle both data and notification messages here.
    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
    data = remoteMessage.getData();
    String title = remoteMessage.getNotification().getTitle();
    String message = remoteMessage.getNotification().getBody();
    String imageUrl = (String) data.get("image");
    String action = (String) data.get("action");
    Log.i(TAG, "onMessageReceived: title : "+title);
    Log.i(TAG, "onMessageReceived: message : "+message);
    Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
    Log.i(TAG, "onMessageReceived: action : "+action);

    if (imageUrl == null) {
        sendNotification(title,message,action);
    } else {
        new BigPictureNotification(this,title,message,imageUrl,action);
    }
}
// [END receive_message]

1
これはonMessageReceived()のオーバーライドサンプルに記述されており、2番目のコメント行にはと記載されていますNot getting messages here? See why this may be: goo.gl/39bRNJ 。以下の回答のような解決策は、通知とデータペイロードの両方を含むメッセージ
fllo

簡単に言うと、強制終了したアプリを再開するには、常にデータオブジェクトを含む通知を送信して、アプリケーションで通知サービスクラスハンドラーFirebaseMessagingService.onMessageReceived()を呼び出す必要があります。また、Firebaseコンソールからではなく、他の場所から送信してみてください(オンラインテストの投稿サービスなど)。
Zon

1
このソリューションは、私のために働いstackoverflow.com/a/44150822/6632278希望が役立ちます。幸運
トニーバラハス

「.fcm」とは PshycoFirebaseMessagingServicesはマニフェストにありますか?クラスが見つからないというエラーが発生します。パラメータの最初の部分がどこにあるのかが見つかりませんでした。
エダーロシャBezerra

回答:


661

1.なぜこれが起こっているのですか?

FCM(Firebase Cloud Messaging)には2種類のメッセージがあります。

  1. メッセージの表示:これらのメッセージonMessageReceived()は、アプリがフォアグラウンドにある場合にのみコールバックをトリガーします
  2. データメッセージ:これらのメッセージは、アプリがフォアグラウンド/バックグラウンド/ killedの場合でもonMessageReceived()コールバックをトリガーします

注: Firebaseチームはdata-messagesまだデバイスに送信するためのUIを開発していません。このタイプを送信するにはサーバーを使用する必要があります!



2.方法は?

これを実現するPOSTには、次のURLへのリクエストを実行する必要があります。

POST https://fcm.googleapis.com/fcm/send

ヘッダー

  • キー: Content-Type値: application/json
  • キー: Authorization値: key=<your-server-key>

トピックを使用した本文

{
    "to": "/topics/my_topic",
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     }
}

または、特定のデバイスに送信する場合

{
    "data": {
        "my_custom_key": "my_custom_value",
        "my_custom_key2": true
     },
    "registration_ids": ["{device-token}","{device2-token}","{device3-token}"]
}


注: JSONキーを追加していないことを確認してくださいnotification
注:サーバーキーを取得するには、Firebaseコンソールで確認できます。Your project -> settings -> Project settings -> Cloud messaging -> Server Key

3.プッシュ通知メッセージをどのように処理しますか?

これは、受信したメッセージの処理方法です。

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String myCustomKey = data.get("my_custom_key");

     // Manage data
}

4
あなたは、以下の手順に従って、同じ通知に「データ」と「通知」のキーを送信することができますstackoverflow.com/a/42279260/2734021 :)
ダニエルS.

15
Firebase team have not developed a UI to send data-messages to your devices, yet.過去1年間でこれは変化しましたか?
Hankrecords、

2
@Antonio oreoでアプリが強制終了されたときに、onMessageReceivedが呼び出されません。データのみのペイロードがあります。何かアップデートはありますか?
Samir Mangroliya、2018

63
アプリがバックグラウンドにあるときonMessageReceivedに呼び出されず、FCMで深刻な問題です!!! また、回答を更新してください。
Muhammad Babar

2
まあ、私にとっては、これは特定のAndroidデバイスで発生するようです。それが実際の問題であると考えて過ごしたが、その後何もないことが判明した。したがって、私のアドバイスは、さまざまなデバイスでテストすることです。私はそれをVMでテストし、アプリが強制終了されたときでも通知を受け取りました。私は誰かの時間を節約するためにこれを言っているだけです。
Tarek-Dev 2018

158

以下の場合にFirebaseライブラリでonMessageReceived()を呼び出すようにするには

  1. フォアグラウンドのアプリ
  2. バックグラウンドのアプリ
  3. アプリが強制終了されました

JSONキー「通知」をFirebase APIへのリクエストに含めないでください。代わりに「データ」を使用してください。以下を参照してください。

次のメッセージは、アプリがバックグラウンドにあるか強制終了されている場合はonMessageReceived()を呼び出さず、通知をカスタマイズすることはできません。

{
   "to": "/topics/journal",
   "notification": {
   "title" : "title",
   "text": "data!",
   "icon": "ic_notification"
    }
}

代わりにこれを使用するとうまくいきます

{
  "to": "/topics/dev_journal",
   "data": {
       "text":"text",
       "title":"",
       "line1":"Journal",
       "line2":"刊物"
   }
} 

基本的に、メッセージはデータオブジェクトと共に引数RemoteMessageでMapとして送信され、ここでスニペットのようにonMessageReceivedで通知を管理できます。

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();

     //you can get your text message here.
     String text= data.get("text");


     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
        // optional, this is to make beautiful icon
             .setLargeIcon(BitmapFactory.decodeResource(
                                    getResources(), R.mipmap.ic_launcher))  
        .setSmallIcon(smallIcon)  //mandatory
      .......
    /*You can read more on notification here:
    https://developer.android.com/training/notify-user/build-notification.html
    https://www.youtube.com/watch?v=-iog_fmm6mE
    */
}

1
Firebaseコンソールからこれを達成することは可能ですか?
koder

@koder、残念ながらFirebaseコンソールはこれをサポートしていません。curlやpostman(chrome plugin)などのメッセージをFirebaseに送信するためのツールを使用する必要があります。firebaseメッセージングAPIは、こちらのドキュメントを参照してください-firebase.google.com/docs / cloud-messaging / http-server-ref
Teerakiat Chitawattanarat

1
これは私が1日以上探していたものです。そして、uMessageReceived()でデータ内のキーの値のペアを処理して、これらの値でアクティビティを開始する方法を説明したほうがよいでしょう。
Boopathi T 2016

25
アプリがバックグラウンドにある場合、メソッドは正常に機能しますが、アプリが
強制終了

8
サンザールの同じ問題。アプリが強制終了された場合、メッセージは表示されません。
Giacomo M

104

すべての応答が不完全であるように感じますが、すべての応答には、アプリがバックグラウンドにあるときにデータを含む通知を処理する必要があるものがあります。

次の手順を実行すると、アプリがバックグラウンドにあるときに通知を処理できるようになります。

1.次のようなインテントフィルターを追加します。

<activity android:name=".MainActivity">
      <intent-filter>
           <action android:name=".MainActivity" />
           <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
</activity>

通知データを処理するアクティビティに。

  1. 次の形式で通知を送信します。

    { 
     "notification" : {
            "click_action" : ".MainActivity", 
            "body" : "new Symulti update !", 
            "title" : "new Symulti update !", 
            "icon" : "ic_notif_symulti" }, 
     "data": { ... },
     "to" : "c9Vaa3ReGdk:APA91bH-AuXgg3lDN2WMcBrNhJZoFtYF9" }

ここでの鍵は追加です

"click_action" : ".MainActivity"

ここで、.MainActivityは、手順1で追加したインテントフィルターを使用したアクティビティです。

  1. 「.MainActivity」のonCreateの通知から「データ」情報を取得します。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //get notification data info
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
           //bundle must contain all info sent in "data" field of the notification
        }
    }

そして、それで十分です。これが誰かに役立つことを願っています:)


5
これが正解です。どのトレイも通知がトレイに表示されるためにclick_actionとインテントフィルターを要求することについて何も述べていません。どちらも必要です。
airowe 2017

@airowe通知の表示に必須ではありません
AlwaysConfused

データブロックと通知ブロックの両方がありますが、アクティビティでデータを受信できませんか?
アシュワニ2017

3
これが受け入れられない答えである方法を私は理解していません。click_actionがなければ、機能しません。私の日を救った
アルンシャンカール

4
@ArunShankarのサポートに感謝します。受け入れられた回答は私の7か月前に返答され、その良い回答です。なぜclick_actionについて誰も話さないのが理解できないので、私は私の答えを追加しました。それが多くの人々にとって非常に有用であり、それが一日の終わりに重要なことであると私はとても嬉しく思います:)
ダニエルS.

42

firebase を使用した送信ダウンストリームの firebaseドキュメントによると、2種類のペイロードがあります。

  1. データ

    このパラメーターは、メッセージのペイロードのカスタムキーと値のペアを指定します。クライアントアプリは、データメッセージの処理を担当します。データメッセージには、カスタムのKey-Valueペアのみがあります。

  2. 通知

    このパラメーターは、通知ペイロードの事前定義された、ユーザーに表示されるキーと値のペアを指定します。FCMは、クライアントアプリに代わってエンドユーザーのデバイスにメッセージを自動的に表示します。通知メッセージには、ユーザーに表示される事前定義されたキーのセットがあります。

フォアグラウンドにいるときは、onMessageReceived()を使用してFCM内のデータを取得できます。データペイロードからデータを取得できます。

data = remoteMessage.getData();
String customData = (String) data.get("customData");

バックグラウンドの場合、FCMは通知ペイロードからの情報に基づいてシステムトレイに通知を表示します。システムトレイの通知に使用されるタイトル、メッセージ、およびアイコンは、通知ペイロードから取得されます。

{
  "notification": {
        "title" : "title",
        "body"  : "body text",
        "icon"  : "ic_notification",
        "click_action" : "OPEN_ACTIVITY_1"
       }
}

この通知ペイロードは、アプリがバックグラウンドにあるときにシステムトレイに自動的に通知を表示する場合に使用されます。アプリがバックグラウンドで動作しているときに通知データを取得するには、通知ペイロード内にclick_actionを追加する必要があります。

アプリを開いて特定のアクションを[バックグラウンドで]実行する場合は、通知ペイロードにclick_actionを設定し、起動するアクティビティのインテントフィルターにマッピングします。たとえば、click_actionをOPEN_ACTIVITY_1に設定して、次のようなインテントフィルターをトリガーします。

<intent-filter>
  <action android:name="OPEN_ACTIVITY_1" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

そのインテントフィルターを、アクティビティタグの1つの内部のマニフェストに配置します。通知をクリックすると、アプリが開き、click_actionで定義したアクティビティ(この場合は「OPEN_ACTIVTY_1」)に直接移動します。そしてその活動の中であなたは次の方法でデータを得ることができます:

Bundle b = getIntent().getExtras();
String someData = b.getString("someData");

AndroidアプリにFCMを使用しており、両方のペイロードを使用しています。これが私が使用しているJSONの例です:

{
  "to": "FCM registration ID",
  "notification": {
    "title" : "title",
    "body"  : "body text",
    "icon"  : "ic_notification",
    "click_action" : "OPEN_ACTIVITY_1"
   },
   "data": {
     "someData"  : "This is some data",
     "someData2" : "etc"
   }
}

「そのインテントフィルターをアプリケーションタグ内のマニフェストに配置します。」アプリケーションタグ内にインテントフィルターを配置することはできません。
Kyrylo Zapylaiev 2017

あなたのJSONはclick_actionキーがどこに行くのかを示しません。
Josh、

これは正しい答えではありませんか?クリックアクションnとは何ですか?一部の人は反対票を投じるか、これを整理する必要があります
ラナ

1
@KyryloZapylaiev答えを修正して更新します:「アクティビティタグの1つの内部にあるマニフェストにそのインテントフィルターを配置します」。
ディカ

1
@Joshが更新およびフォーマットされました。もう一度確認できます
Dika

32

ドキュメントによると

バックグラウンドアプリでメッセージを処理する

アプリがバックグラウンドにある場合、Androidは通知メッセージをシステムトレイに送信します。ユーザーが通知をタップすると、デフォルトでアプリランチャーが開きます。

これには、通知とデータペイロードの両方を含むメッセージが含まれます。これらの場合、通知はデバイスのシステムトレイに配信され、データペイロードはランチャーアクティビティのインテントのエクストラで配信されます。

アプリを開いて特定のアクションを実行する場合は、通知ペイロードでclick_actionを設定し、起動するアクティビティのインテントフィルターにマッピングします。たとえば、click_actionをOPEN_ACTIVITY_1に設定して、次のようなインテントフィルターをトリガーします。

 <intent-filter>   <action android:name="OPEN_ACTIVITY_1" />  
 <category android:name="android.intent.category.DEFAULT" />
 </intent-filter>

編集:

このスレッドに基づいて:

Firebaseコンソールを使用してclick_actionペイロードを設定することはできません。あなたはcurlコマンドまたはカスタムhttpサーバーでテストを試すことができます

curl --header "Authorization: key=<YOUR_KEY_GOES_HERE>" 
     --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send  
     -d "{\"to\":\"/topics/news\",\"notification\": 
         {\"title\": \"Click Action Message\",\"text\": \"Sample message\",
            \"click_action\":\"OPEN_ACTIVITY_1\"}}"

1
あなたが正しいです。私はドキュメントを読みました。しかし、これを私のマニフェストのどこに置くのか混乱していますか?そのjavaファイルのonMessageReceivedでコードを実行する必要があるので、何をする必要がありますか?
Parth Patel

アプリがバックグラウンドにあるときに、onMessageReveicedを自動的に呼び出すことはできません。代わりに、受け取ったインテントを処理し、ハンドラーにそれを呼び出させる必要があります。または、おそらくonMessageReveicedとインテント処理の両方によって呼び出される個別のクラス/メソッドを実装するのが最善です。メインアクティビティのonNewIntentにハンドラーを追加しましたが、それは私にとってはうまくいきます。
diidu 2016年

遅すぎる@Parathパテルの質問に応答するが、おそらく、この意志は同じ問題を抱える他の誰かを助け、ここに私の答えを見てみましょうstackoverflow.com/a/42279260/2734021を
ダニエルS.

このアクションをどこに配置する必要がありましたか?私の活動またはFirebasemessageサービスのために?
Mahdi

**複数の通知のリダイレクトが機能していませんか?例:「click_action」を使用してバックグラウンドでfcmから3つの通知があり、最初の通知が正常にリダイレクトされ、次に2つの通知をクリックすると、アクティビティのリダイレクトが機能しません
prasanthMurugan

24

2019年7月現在

Android compileSdkVersion 28、buildToolsVersion 28.0.3、firebase-messaging:19.0.1

他のすべてのStackOverflowの質問と回答を調査し、数え切れないほどの古いソリューションを試した後、このソリューションは次の3つのシナリオで通知を表示することができました。

-アプリがフォアグラウンドにある:
MyFirebaseMessagingServiceクラスのonMessageReceivedメソッドによって通知が受信されます

-アプリが強制終了されました(バックグラウンドで実行されていません): FCMによって通知トレイに通知が自動的に送信されます。ユーザーが通知に触れると、マニフェストにandroid.intent.category.LAUNCHERがあるアクティビティを呼び出してアプリが起動します。onCreate()メソッドでgetIntent()。getExtras()を使用して、通知のデータ部分を取得できます。

-アプリはバックグラウンドです: 。通知はFCMによって通知トレイに自動的に送信されます。ユーザーが通知に触れると、マニフェストにandroid.intent.category.LAUNCHERがあるアクティビティを起動することにより、アプリが前面に表示されます。私のアプリはそのアクティビティにlaunchMode = "singleTop"があるため、同じクラスの1つのアクティビティがすでに作成されているため、onCreate()メソッドは呼び出されません。代わりに、そのクラスのonNewIntent()メソッドが呼び出され、 intent.getExtras()を使用して、そこに通知します。

手順:1-アプリのメインアクティビティを次のように定義した場合:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:screenOrientation="portrait"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name=".MainActivity" />
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

2- MainActivity.classのonCreate()メソッドにこれらの行を追加します

Intent i = getIntent();
Bundle extras = i.getExtras();
if (extras != null) {
    for (String key : extras.keySet()) {
        Object value = extras.get(key);
        Log.d(Application.APPTAG, "Extras received at onCreate:  Key: " + key + " Value: " + value);
    }
    String title = extras.getString("title");
    String message = extras.getString("body");
    if (message!=null && message.length()>0) {
        getIntent().removeExtra("body");
        showNotificationInADialog(title, message);
    }
}

これらのメソッドを同じMainActivity.classに追加します。

@Override
public void onNewIntent(Intent intent){
    //called when a new intent for this class is created.
    // The main case is when the app was in background, a notification arrives to the tray, and the user touches the notification

    super.onNewIntent(intent);

    Log.d(Application.APPTAG, "onNewIntent - starting");
    Bundle extras = intent.getExtras();
    if (extras != null) {
        for (String key : extras.keySet()) {
            Object value = extras.get(key);
            Log.d(Application.APPTAG, "Extras received at onNewIntent:  Key: " + key + " Value: " + value);
        }
        String title = extras.getString("title");
        String message = extras.getString("body");
        if (message!=null && message.length()>0) {
            getIntent().removeExtra("body");
            showNotificationInADialog(title, message);
        }
    }
}


private void showNotificationInADialog(String title, String message) {

    // show a dialog with the provided title and message
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.cancel();
        }
    });
    AlertDialog alert = builder.create();
    alert.show();
}

3-次のようにMyFirebaseクラスを作成します。

package com.yourcompany.app;

import android.content.Intent;
import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MyFirebaseMessagingService extends FirebaseMessagingService {


    public MyFirebaseMessagingService() {
        super();
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        Log.d(Application.APPTAG, "myFirebaseMessagingService - onMessageReceived - message: " + remoteMessage);

        Intent dialogIntent = new Intent(this, NotificationActivity.class);
        dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        dialogIntent.putExtra("msg", remoteMessage);
        startActivity(dialogIntent);

    }

}

4-次のような新しいクラスNotificationActivity.classを作成します。

package com.yourcompany.app;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ContextThemeWrapper;

import com.google.firebase.messaging.RemoteMessage;

public class NotificationActivity extends AppCompatActivity {

private Activity context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context = this;
    Bundle extras = getIntent().getExtras();

    Log.d(Application.APPTAG, "NotificationActivity - onCreate - extras: " + extras);

    if (extras == null) {
        context.finish();
        return;
    }

    RemoteMessage msg = (RemoteMessage) extras.get("msg");

    if (msg == null) {
        context.finish();
        return;
    }

    RemoteMessage.Notification notification = msg.getNotification();

    if (notification == null) {
        context.finish();
        return;
    }

    String dialogMessage;
    try {
        dialogMessage = notification.getBody();
    } catch (Exception e){
        context.finish();
        return;
    }
    String dialogTitle = notification.getTitle();
    if (dialogTitle == null || dialogTitle.length() == 0) {
        dialogTitle = "";
    }

    AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.myDialog));
    builder.setTitle(dialogTitle);
    builder.setMessage(dialogMessage);
    builder.setPositiveButton(getResources().getString(R.string.accept), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.cancel();
        }
    });
    AlertDialog alert = builder.create();
    alert.show();

}

}

5-これらの行をタグ内のアプリマニフェストに追加します

    <service
        android:name=".MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id"/>

    <activity android:name=".NotificationActivity"
        android:theme="@style/myDialog"> </activity>

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/notification_icon"/>

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/color_accent" />

6- Application.java onCreate()メソッドまたはMainActivity.class onCreate()メソッドに次の行を追加します。

      // notifications channel creation
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      // Create channel to show notifications.
      String channelId = getResources().getString("default_channel_id");
      String channelName = getResources().getString("General announcements");
      NotificationManager notificationManager = getSystemService(NotificationManager.class);
      notificationManager.createNotificationChannel(new NotificationChannel(channelId,
              channelName, NotificationManager.IMPORTANCE_LOW));
  }

できました。

これが上記の3つのシナリオで適切に機能するためには、Firebaseウェブコンソールから次の方法で通知を送信する必要があります。

通知セクション:通知タイトル=通知ダイアログに表示するタイトル(オプション)通知テキスト=ユーザーに表示するメッセージ(必須)次に、ターゲットセクション:App = Androidアプリおよび追加オプションセクション:Android通知チャネル= default_channel_idカスタムデータキー:タイトル値:(ここに、通知セクションの[タイトル]フィールドと同じテキスト)キー:本文値:(ここに、通知セクションの[メッセージ]フィールドと同じテキスト)key:click_action値:.MainActivity Sound =無効
期限= 4週間

Google PlayのAPI 28を使用してエミュレータでデバッグできます。

幸せなコーディング!


2
この素晴らしい答えをありがとう。
Alex Chengalan

@alvaro、通知を受け取ったときにURLを開きたい場合の対処方法
engmms

アプリが閉じているか強制終了された場合、in vivo oppフォンが機能しない
Android Developer

私はVivoの電話で試したことはありませんが、現在他の多くのAndroidの電話で機能しています。すべての手順をゆっくり読んで、すべての詳細を確認してから、ここで説明した各メソッドの最初の行でデバッグブレークポイントをオンにして、実際の電話をケーブルで開発用コンピューターに接続し、送信中にアプリをデバッグしてくださいFCMからのメッセージ。私が述べたすべてのパラメーターと形式でFCMメッセージを送信していることを確認してください。幸運を!
アルバロ

2
これは、Firebaseのドキュメントに記載されている最新の回答です。アプリがバックグラウンドで実行されている場合、Androidは通知メッセージをシステムトレイに送信します。ユーザーが通知をタップすると、デフォルトでアプリランチャーが開きます。これには、通知とデータペイロードの両方を含むメッセージが含まれます。これらの場合、通知はデバイスのシステムトレイに配信され、データペイロードはランチャーアクティビティのインテントのエクストラで配信されます。(firebase.google.com/docs/cloud-messaging/android/…)非常に多くの古い回答が古くなっています
Riot Goes Woof

20

以来display-messages、あなたのアプリがフォアグラウンドである場合にのみ動作しFirebase通知UIから送信されます。の場合data-messagesFCMへのPOST呼び出しを行う必要があります

手順

  1. Advanced Rest Client Google Chrome拡張機能をインストールする ここに画像の説明を入力してください

  2. 次のヘッダーを追加

    キー:Content-Type、:application / json

    キー:承認、:key = "your server key" ここに画像の説明を入力してください

  3. ボディを追加

    • トピックを使用する場合:

      {
          "to" : "/topics/topic_name",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
          }
      }
    • 登録IDを使用している場合:

      {
          "registration_ids" : "[{"id"},{id1}]",
          "data": {
          "key1" : "value1",
          "key2" : "value2",
           }
      }

それでおしまい!。onMessageReceived通常どおりコールバックをリッスンします。

@Override
public void onMessageReceived(RemoteMessage remoteMessage) { 
     Map<String, String> data = remoteMessage.getData();
     String value1 = data.get("key1");
     String value2 = data.get("key2");
}

20

バックグラウンドでメッセージをキャプチャするには、 BroadcastReceiver

import android.content.Context
import android.content.Intent
import android.util.Log
import androidx.legacy.content.WakefulBroadcastReceiver
import com.google.firebase.messaging.RemoteMessage

class FirebaseBroadcastReceiver : WakefulBroadcastReceiver() {

    val TAG: String = FirebaseBroadcastReceiver::class.java.simpleName

    override fun onReceive(context: Context, intent: Intent) {

        val dataBundle = intent.extras
        if (dataBundle != null)
            for (key in dataBundle.keySet()) {
                Log.d(TAG, "dataBundle: " + key + " : " + dataBundle.get(key))
            }
        val remoteMessage = RemoteMessage(dataBundle)
        }
    }

これをマニフェストに追加します。

<receiver
      android:name="MY_PACKAGE_NAME.FirebaseBroadcastReceiver"
      android:exported="true"
      android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
</receiver>

7
これは、アプリがバックグラウンドにあるときに、本当に通知メッセージを受け取ります。ただし、デフォルトのFirebaseレシーバーによる処理が停止されることはないため、メッセージは引き続き通知アラートとして表示されます。
Galya、2016年

現時点では機能しないため、このソリューションを提案しています。Googleバグベースに報告されているバグがあります。あなたはそれをチェックしたいかもしれません。
Romulano 2016年

バグへのリンクをここに投稿してください
Galya

通知からデータを取得する方法?
Ravi Vaghela、2016年

アプリが強制終了された場合、これは明らかに機能しません。私は何時間もこの解決策を試しました。なんらかの理由で、アプリがバックグラウンドにある間はレシーバーが機能し、アプリが
強制終了

16
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

}

アプリがフォアグラウンドにあるときにのみ呼び出されるたびに呼び出されるわけではありません

どのメソッドがフォアグラウンドまたはバックグラウンドにあるか強制終了されているかに関係なく、このメソッドが毎回呼び出されるオーバーライドメソッドが1つありますが、このメソッドはこのFirebase APIバージョンで使用できます

これは、gradleからインポートする必要があるバージョンです

compile 'com.google.firebase:firebase-messaging:10.2.1'

これが方法です

@Override
public void handleIntent(Intent intent) {
    super.handleIntent(intent);

    // you can get ur data here 
    //intent.getExtras().get("your_data_key") 


}

以前のfirebase apiでは、このメソッドはありませんでした。その場合、アプリがバックグラウンドにあるときにfire baseハンドル自体が...。 ...

以前のバージョンを使用している場合、デフォルトのアクティビティが開始されます。その場合、同じ方法でデータを取得できます。

if(getIntent().getExtras() != null && getIntent().getExtras().get("your_data_key") != null) {
String strNotificaiton = getIntent().getExtras().get("your_data_key").toString();

//やりたいことをする....}

通常、これは通知で取得するサーバーからの構造です

{
    "notification": {
        "body": "Cool offers. Get them before expiring!",
        "title": "Flat 80% discount",
        "icon": "appicon",
        "click_action": "activity name" //optional if required.....
    },
    "data": {
        "product_id": 11,
        "product_details": "details.....",
        "other_info": "......."
    }
}

uは、データキーをどのように与えたいか、またはuが通知を与えたいかどうかはuにかかっています。 。

通知をクリックしてその場合にクリックアクションを送信しない場合、デフォルトのアクティビティが開きます。毎回呼ばれる


firebase-messagingを10.2.1に更新し、通知メッセージにデータを追加しました。前景、背景、および殺害。ありがとう
Firas Shrourou 2017年

Kotlinでは、次のエラーが発生します:(44、5)「FirebaseMessagingService」の「handleIntent」は最終的なものであり、オーバーライドできません
ugali soft


14

ドキュメントによると:2017年5月17日

アプリがバックグラウンドにある場合、Androidは通知メッセージをシステムトレイに送信します。ユーザーが通知をタップすると、デフォルトでアプリランチャーが開きます

これには、通知とデータペイロードの両方を含むメッセージ(および通知コンソールから送信されるすべてのメッセージ)が含まれます。これらの場合、通知はデバイスのシステムトレイに配信され、データペイロードはランチャーアクティビティのインテントのエクストラで配信されます。

したがって、ペイロード通知とデータの両方を使用する必要があります。

{
  "to": "FCM registration ID",
  "notification": {
    "title" : "title",
    "body"  : "body text",
    "icon"  : "ic_notification"
   },
   "data": {
     "someData"  : "This is some data",
     "someData2" : "etc"
   }
}

click_actionを使用する必要はありません。LAUNCHER アクティビティの目的からexrasを取得する必要があります

<activity android:name=".MainActivity">
        <intent-filter>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>

JavaコードはMainActivityのonCreateメソッドにある必要があります。

Intent intent = getIntent();
if (intent != null && intent.getExtras() != null) {
    Bundle extras = intent.getExtras();
    String someData= extras.getString("someData");
    String someData2 = extras.getString("someData2");
}

ペイロード通知とデータの両方をFirebase Notifications Consoleからテストできます。[詳細オプション]セクションのカスタムデータフィールドに入力することを忘れないでください


13

次に、firebaseメッセージに関するより明確な概念を示します。彼らのサポートチームから見つけました。

Firebaseには3つのメッセージタイプがあります

通知メッセージ:通知メッセージは、バックグラウンドまたはフォアグラウンドで機能します。アプリがバックグラウンドにある場合、通知メッセージはシステムトレイに配信されます。アプリがフォアグラウンドにある場合、メッセージはonMessageReceived()またはdidReceiveRemoteNotificationコールバックによって処理されます。これらは基本的に、ディスプレイメッセージと呼ばれるものです。

データメッセージ:Androidプラットフォームでは、データメッセージはバックグラウンドとフォアグラウンドで機能します。データメッセージは、onMessageReceived()によって処理されます。ここでのプラットフォーム固有の注意事項は次のとおりです。Androidでは、アクティビティの起動に使用されるインテントでデータペイロードを取得できます。詳しく説明すると、があれば"click_action":"launch_Activity_1"getIntent()からのみこのインテントを取得できますActivity_1

通知ペイロードとデータペイロードの両方を含むメッセージ:バックグラウンドでは、アプリは通知トレイで通知ペイロードを受信し、ユーザーが通知をタップしたときにのみデータペイロードを処理します。フォアグラウンドでは、アプリは両方のペイロードが利用可能なメッセージオブジェクトを受け取ります。第二に、click_actionパラメーターは通知ペイロードでよく使用され、データペイロードでは使用されません。データペイロード内で使用する場合、このパラメーターはカスタムのキーと値のペアとして扱われるため、意図したとおりに機能させるにはカスタムロジックを実装する必要があります。

また、onMessageReceivedメソッド(データメッセージを参照)を使用してデータバンドルを抽出することをお勧めします。あなたのロジックから、私はバンドルオブジェクトをチェックしましたが、予期されたデータコンテンツが見つかりませんでした。これは、より明確にするために、類似のケースへの参照です。

詳細については、私のこのスレッドにアクセスしてください



8

このような簡単な要約

  • アプリが実行中の場合。

    onMessageReceived()

トリガーです。

  • アプリが実行されていない場合(スワイプで強制終了);

    onMessageReceived()

direcltyによってトリガーおよび配信されません。特別なキーと値のペアがある場合。onMessageReceived()が機能しないため、機能しません。

私はこの方法を見つけました。

ランチャーアクティビティにこのロジックを入れます。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState, R.layout.activity_splash);

    if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("PACKAGE_NAME")) {

        // do what you want

        // and this for killing app if we dont want to start
        android.os.Process.killProcess(android.os.Process.myPid());

    } else {

        //continue to app
    }
}

このifブロックで、firebase UIに従ってキーを検索します。

この例では、上記のような私のキーと値です。(申し訳ありません=)) ここに画像の説明を入力してください

コードが機能すると、「com.rda.note」が表示されます。

android.os.Process.killProcess(android.os.Process.myPid());

このコード行で、アプリケーションを閉じてGoogle Playマーケットを開きました

幸せなコーディング=)


6

私はシナリオを理解しました、

アプリがフォアグラウンドにある場合、 onMessageReceived()メソッドがFirebaseServiceから呼び出されます。したがって、pendingIntentと呼ばれるサービスクラスに定義されています。

そして、アプリがバックグラウンドにあるとき、最初のアクティビティが呼び出されます。

あなたが使用している場合さて、スプラッシュ活動をし、しなければならない心に留めておくsplashactivity何splashActivityが存在しない場合、その後、最初の活動が何であれ、呼び出されます。他に、呼び出されます

次に、firstActivityのgetIntent()をチェックして、バンドルがあるかどうかを確認する必要があります。すべてが正常であれば、バンドルに値が入力されていることがわかります。サーバーから送信されたデータタグの値が次のようになっている場合、

"data": {
    "user_name": "arefin sajib",
    "value": "user name notification"
  }

次に、最初のアクティビティで、有効なインテント(getIntent()はnullではない)、有効なバンドルおよび内部バンドルがあり、データ としてキーとして上記のJSON全体が表示されます

このシナリオでは、値を抽出するためのコードは次のようになります。

    if(getIntent()!=null){
            Bundle bundle = getIntent().getExtras();
            if (bundle != null) {
                try {
                   JSONObject object = new JSONObject(bundle.getStringExtra("data"));
String user_name = object.optString("user_name");

                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }
        }

3

回答ありがとうございます。しかし、私はNotificationを送信する代わりにデータメッセージを送信することでこれを解決しました。サーバーコード

<?php
$url = "https://fcm.googleapis.com/fcm/send";
$token = "C-l6T_a7HouUK****";
$serverKey = "AAAAaOcKS00:********";
define( 'API_ACCESS_KEY', $serverKey );
$registrationIds = array($token);
// prep the bundle

$msg = array

(
 'message'  => 'here is a message. message',
 'title'        => 'This is a title. title',
 'subtitle' => 'This is a subtitle. subtitle',
 'tickerText'   => 'Ticker text here...Ticker text here...Ticker text 
 here',
 'vibrate'  => 1,
 'sound'        => 1,
 'largeIcon'    => 'large_icon',
 'smallIcon'    => 'small_icon'

);

$fields = array

(
  'registration_ids'    => $registrationIds,
  'data'            => $msg

);
$headers = array

(
  'Authorization: key=' . API_ACCESS_KEY,
 'Content-Type: application/json'

);


$ch = curl_init();

curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' 
);

curl_setopt( $ch,CURLOPT_POST, true );

curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );

curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );

curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );

curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );

$result = curl_exec($ch );

curl_close( $ch );

echo $result;

?>

そして、onMessageReceivedでデータをキャッチしました

public class MyFirebaseMessagingService extends FirebaseMessagingService     {

  private static final String TAG = "MyFirebaseMsgService";

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

      sendNotification(remoteMessage.getData().get("message"));
     }
   // Check if message contains a notification payload.
    else if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    sendNotification(remoteMessage.getNotification().getBody());
    }


}
   private void sendNotification(String messageBody) {
    Intent intent = new Intent(this, Notify.class).putExtra("msg",messageBody);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = "idddd";
    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(MyFirebaseMessagingService.this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("FCM Message")
                    .setContentText(messageBody)
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}

1
背景でも機能していますか?
Tabish khan

@Tabishkhanはい、問題があれば問題なく動作します。ありがとう
ござい

1
こんにちは@AndroidSanaullah、サーバーコードの最初の部分を説明できますか?実際にどこに配置しますか?私は同じ問題に直面していますが、サーバーの部分がよくわかりません、郵便配達員を使用していますか?
SHID

curlがリクエストに使用され、すべてのパラメーターがリクエストに渡されます。@
Shid

2

サーバー要求から通知ペイロードを完全に削除します。送信データのみをして、それを扱うonMessageReceived()あなたのそれ以外の場合は、onMessageReceivedアプリがバックグラウンドで動作しているか、殺されたとき、意志がトリガされません。

これは私がサーバーから送信しているものです:

{
  "data":{
    "id": 1,
    "missedRequests": 5
    "addAnyDataHere": 123
  },
  "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......"
}

したがって、次のonMessageReceived(RemoteMessage message)ようにデータを受信できます:(IDを取得する必要があるとしましょう)

Object obj = message.getData().get("id");
        if (obj != null) {
            int id = Integer.valueOf(obj.toString());
        }

同様に、サーバーから送信したデータを内で取得できますonMessageReceived()


2

アプリが次のようにバックグラウンドとフォアグラウンドにある場合でもメッセージを送信する簡単な方法:-APIを使用してメッセージを送信するには、Chrome拡張機能であるAdvancedRESTクライアントと呼ばれるツールを使用して、次のパラメーターでメッセージを送信できます。

クライアントツールの残りのリンク:https : //chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo

次のURLを使用して ください :-https://fcm.googleapis.com/fcm/send Content-Type:application / json Authorization:key = Your Server key FromまたはAuthoization key(下の参照を参照)

{ "data": {
    "image": "https://static.pexels.com/photos/4825/red-love-romantic-flowers.jpg",
    "message": "Firebase Push Message Using API"
    "AnotherActivity": "True"
     },
  "to" : "device id Or Device token"
}

認証キーは、Google開発者コンソールにアクセスし、プロジェクトの左側のメニューにある[認証情報]ボタンをクリックして取得できます。リストされているAPIキーの中で、サーバーキーが認証キーになります。

また、APIを使用して送信されるPOSTリクエストの「to」セクションにレシーバーのtokenIDを配置する必要があります。


2

onMessageReceived(RemoteMessage remoteMessage)をバックグラウンドで処理したい場合は、データ部分の通知部分のみを送信します。

"data":    "image": "",    "message": "Firebase Push Message Using API", 

"AnotherActivity": "True"、 "to": "device id Or Device token"

これにより、onMessageReciviedはコールバックグラウンドおよびフォアグラウンドであり、ランチャーアクティビティの通知トレイを使用して通知を処理する必要がありません。これを使用してデータペイロードを処理します。

  public void onMessageReceived(RemoteMessage remoteMessage)
    if (remoteMessage.getData().size() > 0) 
    Log.d(TAG, "Message data payload: " + remoteMessage.getData());      

1

2018年6月の回答-

メッセージのどこにも「通知」キーワードがないことを確認する必要があります。「データ」のみを含めると、アプリはバックグラウンドで実行されているか強制終了されている場合でも、onMessageReceivedでメッセージを処理できます。

Cloud Functionsの使用:

const message = {
    token: token_id,   // obtain device token id by querying data in firebase
    data: {
       title: "my_custom_title",
       body:  "my_custom_body_message"
       }
    }


return admin.messaging().send(message).then(response => {
    // handle response
});

次に、onMessageReceived()のクラスの拡張com.google.firebase.messaging.FirebaseMessagingServiceで:

if (data != null) {
  Log.d(TAG, "data title is: " + data.get("title");
  Log.d(TAG, "data body is: " + data.get("body");
}

// build notification using the body, title, and whatever else you want.

情報源はありますか?安全ですか?
Yogesh Rathi

安全です。アプリで使用します。しかし、投稿してから6か月が経過したため、ソースを思い出せません。これは、Firebaseのドキュメントだと思います。
ジェフパジェット

1

OAUTH 2.0によると:

FAUTHがOAUTH 2を使用しているため、この場合は認証の問題が発生します

だから私はfirebaseのドキュメントを読み、ドキュメントによると、データメッセージを投稿する新しい方法は次のとおりです。

POST: https://fcm.googleapis.com/v1/projects/YOUR_FIREBASEDB_ID/messages:send

ヘッダー

Key: Content-Type, Value: application/json

Auth

Bearer YOUR_TOKEN 

ボディの例

{
   "message":{
    "topic" : "xxx",
    "data" : {
         "body" : "This is a Firebase Cloud Messaging Topic Message!",
         "title" : "FCM Message"
          }
      }
 }

URLには、Firebaseコンソールで見つけることができるデータベースIDがあります。(プロジェクト設定に移動)

そして今、私たちのトークンを取ることができます(1時間だけ有効になります):

最初にFirebaseコンソールで、[設定]> [サービスアカウント]を開きます。[ 新しい秘密鍵の生成]をクリックし、鍵を含むJSONファイルを安全に保存します。サーバーリクエストを手動で承認するには、このJSONファイルが必要でした。ダウンロードしました。

次に、node.jsプロジェクトを作成し、この関数を使用してトークンを取得します。

var PROJECT_ID = 'YOUR_PROJECT_ID';
var HOST = 'fcm.googleapis.com';
var PATH = '/v1/projects/' + PROJECT_ID + '/messages:send';
var MESSAGING_SCOPE = 'https://www.googleapis.com/auth/firebase.messaging';
var SCOPES = [MESSAGING_SCOPE];

  router.get('/', function(req, res, next) {
      res.render('index', { title: 'Express' });
      getAccessToken().then(function(accessToken) {
        console.log("TOKEN: "+accessToken)
      })

    });

function getAccessToken() {
return new Promise(function(resolve, reject) {
    var key = require('./YOUR_DOWNLOADED_JSON_FILE.json');
    var jwtClient = new google.auth.JWT(
        key.client_email,
        null,
        key.private_key,
        SCOPES,
        null
    );
    jwtClient.authorize(function(err, tokens) {
        if (err) {
            reject(err);
            return;
        }
        resolve(tokens.access_token);
    });
});
}

これで、このトークンを投稿リクエストで使用できます。次に、データメッセージを投稿すると、アプリのonMessageReceived関数によって処理されます。


受け入れ答えが働いている、トークン認証をbarer方法ではありません、あなたはポストマンでそれを試すために、これを読んでする必要が:stackoverflow.com/questions/45309674/...
カルロスイエスArancibia Taborga

1

2019年以降、Google FirebaseのAPIは大きく変更されています。 'com.google.firebase:firebase-messaging:18.0.0'

18.0.0ではそれらは削除されMyFirebaseInstanceIDService、トークンを取得する必要があるため、次のMyFirebaseMessagingServiceように記述するだけです。

@Override
public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: " + token);

}

また、AndroidManifest.xmlで、以下を削除する必要があります。

<service android:name=".service.MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

また、通知の外観をカスタマイズするためにデフォルト値を設定することをお勧めします。通知ペイロードに同等の値が設定されていない場合に適用されるカスタムのデフォルトアイコンとカスタムのデフォルト色を指定できます。

アプリケーションタグ内に次の行を追加して、カスタムのデフォルトアイコンとカスタムの色を設定します。

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_notification" />

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/push_channel" />

バックグラウンドアプリで通知メッセージを処理するには、SplashScreenであっても、最初のアクティビティでインテントを定義する必要があります。アプリがバックグラウンドにある場合、Androidは通知メッセージをシステムトレイに送信します。ユーザーが通知をタップすると、デフォルトでアプリランチャーが開きます。

たとえば、Jsonが次のような場合:

 "data": {
"message": "2",
"title": "1",
"pushType" : "banner",
"bannerLink": "http://www.google.com",
"image" : "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"}

これらの値を取得するには、単純なインテントを記述するだけです。

        Bundle extras = intent.getExtras();
        String bannerLink = extras.getString("bannerLink");
        ...
        String channelId = extras.getString("channelId");

0

上記の回答に加えて、FCMコンソールを使用してプッシュ通知をテストしている場合、「データ」キーとオブジェクトはプッシュ通知バンドルに追加されません。そのため、アプリがバックグラウンドまたは強制終了されている場合、詳細なプッシュ通知を受信しません。

この場合、アプリのバックグラウンドシナリオをテストするには、バックエンド管理コンソールを選択する必要があります。

ここでは、プッシュバンドルに「データ」キーを追加しました。そのため、詳細なプッシュは期待どおりに表示されます。これがほとんど役に立たないことを願っています。


0

このコードを使用して、バックグラウンド/フォアグラウンドで通知を取得し、アクションを実行することもできます。

//Data should come in this format from the notification
{
  "to": "/xyz/Notifications",
  "data": {
      "key1": "title notification",
      "key2": "description notification"
  }
}

アプリ内でこのコードを使用します:

  @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
      String key1Data = remoteMessage.getData().get("key1");
      // use key1Data to according to your need
    }

//データはこの形式で通知から来る必要があります{"to": "/ xyz / Notifications"、 "data":{"key1": "title notification"、 "key2": "description notification"}}書き込み方法PHPサービスのこのコード?
Tabish khan

-3

通知には2つのタイプがあります

  1. 通知の表示-通知のみを表示し、アプリが開いておらず、アプリスタックにある場合のみ表示されます。
  2. データ通知-コールバックは、firebasemessagingserviceのonMessageReceivedメソッドに入り、アプリがバックグラウンド、フォアグラウンド、または強制終了状態のときに機能します。

アプリがバックグラウンドにあるときに通知を処理するには、データ通知を使用する必要があります。


-5

同じ問題が発生し、Firebaseライブラリを再コンパイルして、アプリケーションがバックグラウンドにあるときに通知が送信されないようにしました

*ライブラリ https://github.com/erdalceylan/com-google-firebase-messaging

 dependencies {
        compile 'com.google.firebase:firebase-core:11.2.0'
        compile 'com.github.erdalceylan:com-google-firebase-messaging:v1-11.2.0'
    }

*

@WorkerThread
public void onMessageReceived(RemoteMessage var1) {
  //your app is in background or foreground all time calling
}

願っています。幸運を



2
これは恐ろしい提案です。
vsecades
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.