web-dev-qa-db-ja.com

Firebase通知でアプリを開く(FCM)

通知が受信されたときにアプリケーションを自動的に開きたいのですが、Firebaseと新しいFCM通知でこれは可能ですか?

Click_actionを設定できることは知っていますが、それは通知クリックで開始するアクティビティをカスタマイズするためだけのものであり、通知を受信したときに自動的に開始するものが必要です。

Firebaseサンプルのクイックスタートメッセージングを試してみましたが、onMessageReceived()メソッドがありますが、アプリがフォアグラウンドにある場合にのみ機能します。アプリがバックグラウンドにあるときに実行されるものはありますか? GCMは、通知を受信したときに呼び出されるブロードキャストレシーバーからアクティビティインテントを直接開始することにより、ここで望むようなことを行うことができます。

30
stevyhacker

素早い回答:

FCMを介してアプリケーションを自動的に開くには、data-messageを使用する必要があります。これにより、常にFirebaseMessagingService.onMessageReceived()メソッドが呼び出されることが保証されます。

次に、.onMessageReceived()メソッドにロジックを追加して、優先アクティビティを開始できます。

警告:ユーザーの操作なしでUIを起動することは、ほとんどのアプリケーションにとって非常に悪い習慣です。ここでMarkGの答えを読んでください: サービスからアクティビティを開始する方法?

[...]ユーザーが現在行っていることを中断することは、特にバックグラウンドで動作しているはずの何かから、悪いデザイン形式と見なされます。
したがって、ユーザーが調査する時間を決定したときに、通知[...]を使用して目的のアクティビティを起動することを検討する必要があります。 [...]

完全な説明:

FCMはGCMと同様に機能し、2種類のメッセージを受信できます。

  1. 表示メッセージ:
    ペイロード{"notification" : { "body" : "hello world"}}
    これらのメッセージはアプリがバックグラウンドにあるときに自動的に表示されるであり、アプリが既にフォアグラウンドにある場合はFirebaseMessagingService.onMessageReceived()を呼び出します。

  2. データメッセージ:
    ペイロード{"data" : { "key1" : "value1"}}
    これらのメッセージ常に呼び出すFirebaseMessagingService.onMessageReceived()
    アプリが閉じている場合やバックグラウンドであっても。

click_actionは通知ペイロードのパラメーターであるため、表示メッセージに適用されます。

ユーザーが通知をクリックしたことに関連付けられているアクションを示します。
これが設定されている場合、一致するインテントフィルターを持つアクティビティが起動されますユーザーが通知をクリックしたとき

https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

53
Diego Giorgini

ガイドのこのセクション は、バックグラウンドアプリのパズルの鍵です:

メッセージを受信するには
FirebaseMessagingService を拡張するserviceを使用します。サービスは、ほとんどのメッセージタイプに提供されるonMessageReceivedコールバックをオーバーライドする必要がありますが、次の例外があります。

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

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

基本的に、アプリがバックグラウンドになっている場合、この時点で本当に応答したり実行されたりすることはありません。その代わり、メッセージはシステムトレイに配信されます。ただし、すぐ下で解決策を説明します。

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

<intent-filter>
  <action Android:name="OPEN_ACTIVITY_1" />
  <category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
16
Kato

ここで手順を要約します。

ステップ1

FCMユーザーガイド に従います。 Firebase console からメッセージをプッシュして、すべてが正常に機能することを確認します。

ステップ2

カスタムFirebaseMessagingServiceクラスを次のように変更します。

public class MyFirebaseMessagingService extends FirebaseMessagingService {

private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "From: " + remoteMessage.getFrom());
    startActivity(new Intent(this, SplashActivity.class));
}
}

Firebaseコンソールのプッシュメッセージを再度使用すると、onMessageReceivedはアプリがフォアグラウンドにあるときにのみ起動することがわかります。 FirebaseコンソールはNotification messageのみを送信できるためです。 Data messageを送信するには、ステップ3が必要です。

ステップ3

インストール Google Advanced REST client

以下のパラメーターを入力します。

url: https://fcm.googleapis.com/fcm/send
method: POST 
Raw header: 
Content-Type: application/json
Authorization:key=YOUR_SERVER_KEY
Raw payload:
{
   "to" : "YOUR_DEVICE_FCM_TOKEN",
   "data" : {
     "Nick" : "Mario",
     "body" : "great match!",
     "Room" : "PortugalVSDenmark"
   },
 } 

YOUR_SERVER_KEYは、Firebaseコンソール> [設定]ペイン> [クラウドメッセージング]タブで利用できます

YOUR_DEVICE_FCM_TOKENはFirebaseInstanceId.getInstance().getToken()上のonTokenRefresh()です

NOTE

ユーザーの操作なしでUIを起動するのは悪いUXです。開始アクティビティを開始サービスまたはバックグラウンドの何かに置き換える必要があるかもしれません。私はテスト目的でアクティビティを使用するだけなので、サービスよりも視覚的になります。 @ 2ndgab Google Advanced RESTクライアントツールをご紹介いただきありがとうございます。

8
thanhbinh84

[Android] Firebase通知(Firebaseクラウドメッセージングではない)を使用している場合、build.gradleにFirebaseメッセージングを含め、Firebase Consoleのプロジェクトにアプリをリンクするだけです。

アプリがバックグラウンドにある場合、コンソールから送信されたメッセージはシステム通知を提供し、タッチするとアプリがアクティブになります。

こちらをご覧ください: https://youtu.be/KpTSpVh9SfY?t=10m22s

2