1. ホーム
  2. android

[解決済み] Firebaseでアプリがバックグラウンドにあるときの通知を処理する方法

2022-03-18 06:50:25

質問

以下は私のマニフェストです。

<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. なぜこのようなことが起こるのでしょうか?

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

  1. メッセージの表示 : これらのメッセージは onMessageReceived() にあるときだけコールバックされます。 フォアグラウンド
  2. データメッセージ : これらのメッセージは onMessageReceived() コールバック にある場合、アプリは フォアグラウンド/バックグランド/キルド

NOTE Firebase チームでは data-messages を は、まだあなたのデバイスの このタイプの送信には、サーバーを使用する必要があります。


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}"]
}


NOTE 必ず を追加しない JSONキー notification
NOTE サーバーキーを取得するには、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
}