web-dev-qa-db-ja.com

FirebaseMessaging-アプリがバックグラウンドにあるときにヘッドアップディスプレイを作成する

FCMを使用すると、アプリがバックグラウンドにあるとき、または実行されていないときに、システムトレイにプッシュ通知を受け取ります。アプリがフォアグラウンドにある場合、onMessageReceivedをオーバーライドし、NotificationCompatを使用して独自のヘッズアップ通知を作成できます。

アプリがバックグラウンドにあるとき、または実行されていないときに、ヘッドアップ通知を作成する方法はありますか?

ありがとう

EDIT:参考までに、curlを介してhttps://fcm.googleapis.com/fcm/sendに使用しているメッセージペイロードを示します。

{
  "to":"Push-token",
    "content_available": true,
    "priority": "high",
    "notification": {
      "title": "Test",
      "body": "Mary sent you a message!",
      "sound": "default"
    },
    "data": {
      "message": "Mary sent you a Message!",
      "notificationKey":"userID/notification_type",
      "priority": "high",
      "sound": "default"
    }
}
9
Brien Crean

アプリがバックグラウンドで実行されているか実行されていないときに他のアプリを使用している場合にのみ、ヘッドアップ通知が表示されます。お使いの携帯電話が使用されていない場合は、システムトレイ通知またはロック画面通知を受け取ります。

アプリサーバーを使用してhttpプロトコル経由でプッシュ通知を送信している場合は、fcmエンドポイントに送信されるjsonデータの優先度を高く設定することもできます。

Firebaseコンソールを使用している場合は、詳細通知セクションの設定で優先度が高いことを確認してください。

優先度が高いと、ほとんどの場合、ヘッドアップ通知を確実に受信できます。

[〜#〜] edit [〜#〜]:これは、テストを成功させるために編集したjsonがどのように表示されるかを示しています-

{
  "to":"Push-token",
    "priority": "high",
    "notification": {
      "title": "Test",
      "body": "Mary sent you a message!",
      "sound": "default",
      "icon": "youriconname"
    }
}

youriconnameは、通知アイコンとして設定する描画可能なリソースの名前です。

テストのためにデータを省略しました。これだけで、ヘッドアップ通知が表示されます。

2
Nishant Dubey

私は解決策を見つけました:ローカルサーバーからfirebaseサーバーに送信されたjsonから通知タグを削除し、MyFirebaseMessagingService:onMessageReceived()メソッドでコールバックを生成しています。このメソッドでは、NotificationCompat.Builderクラスを使用してローカル通知を生成しています。 Androidのコードは次のとおりです。

private void sendNotification(RemoteMessage remoteMessage) {
        Intent intent = new Intent(this, SplashActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra(AppConstant.Push_CATEGORY, remoteMessage.getData().get("category"));
        intent.putExtra(AppConstant.Push_METADATA, remoteMessage.getData().get("metaData"));
        intent.putExtra(AppConstant.Push_ACTIVITY, remoteMessage.getData().get("activity"));
        intent.putExtra(AppConstant.Push_ID_KEY, remoteMessage.getData().get("_id"));

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(remoteMessage.getData().get("title"))
                .setContentText(remoteMessage.getData().get("body"))
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setContentIntent(pendingIntent);

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

        notificationManager.notify(0, notificationBuilder.build());
    }
6
Shivang