Google FCM getIntent не возвращает ожидаемые данные, когда приложение находится в фоновом режиме

Я внедряю FCM (Служба сообщений Firebase) в своем приложении. Здесь все выглядит нормально, за исключением случаев, когда приложение находится в фоновом режиме, и я не могу извлечь ожидаемые данные уведомления.

Основано на понятиях: в FCM есть два типа сообщений:

display-messages: эти сообщения работают только тогда, когда ваше приложение находится на переднем плане.

data-messages: эти сообщения работают, даже если ваше приложение находится в фоновом режиме. Когда наше приложение находится в фоновом режиме, Android направляет уведомления в системный трей.

для обработки data-сообщений в вашем уведомлении должно быть поле click_action = "YOUR_ACTION".

Моему сообщению понравится:

{
 "data": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
 "to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}

Activity отобразит сообщение, что файл манифеста будет выглядеть так:

<activity
            android:name=".NotificationActivity"
            android:screenOrientation="portrait"
            android:theme="@style/Theme.AppCompat.Dialog"
            android:windowSoftInputMode="stateHidden" >

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

После нажатия на уведомление он будет перенаправлен на мой NotificationActivity, В моем NotificationActivity в onCreate а также onNewIntent метод я извлекаю сообщение, используя этот способ:

Bundle bundle=getIntent().getExtras();
        if(bundle!=null) {
            for (String key : bundle.keySet()) {
                Object value = bundle.get(key);
                Log.d("DATA_SENT", String.format("%s %s (%s)", key,
                        value.toString(), value.getClass().getName()));
            }
        }

К сожалению по моему NotificationActivity я получаю сообщение ниже:

google.sent_time: 1471631793774

от: 50711789666

google.message_id 0: 1471631793776823% 098e508d098e508d

свернуть_ключ: com.myapp.package_name

Но где мои ожидаемые данные уведомления?

Вот моя конфигурация системы:

Версия Android Studio: 2.1.3

Firebase Версия: com.google.firebase:firebase-auth:9.0.1

Версия сервиса Google Play: com.google.android.gms:play-services:9.2.1

Вот некоторые ссылки по теме:

Заранее спасибо. Извините за плохой английский.

1 ответ

Решение

Верхняя сторона андроид решения верна. На самом деле, уведомление было проблемой. Он посылает мне объект "данные", но не объект "уведомление". Недостатки объекта "уведомление" в моем TargetActivity не получил сообщение с помощью getIntent(), После отправки "уведомления" объект решил мою проблему.

Правильный формат сообщения указан ниже:

{
 "data": {
  "body": "here is body",
  "title": "Title"
 },
"notification": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
 "to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}

Вот более четкие понятия о сообщении Firebase. Я нашел это от их команды поддержки. Firebase имеет три типа сообщений:

Уведомления: Уведомление работает на заднем или переднем плане. Когда приложение находится в фоновом режиме, уведомления уведомлений доставляются в системный трей. Если приложение находится на переднем плане, сообщения обрабатываются обратными вызовами onMessageReceived() или didReceiveRemoteNotification. По сути, это то, что называется отображением сообщений.

Сообщения данных: На платформе Android сообщение данных может работать как на заднем, так и на переднем плане. Сообщение данных будет обработано onMessageReceived(). Примечание для конкретной платформы будет следующим: На Android полезная нагрузка данных может быть получена в Intent, используемом для запуска вашей деятельности. Чтобы уточнить, если у вас есть "click_action":"launch_Activity_1", вы можете получить это намерение через getIntent() только из Activity_1.

Сообщения с полезными нагрузками как для уведомлений, так и для данных. В фоновом режиме приложения получают полезную нагрузку для уведомлений в области уведомлений и обрабатывают полезные данные только тогда, когда пользователь нажимает на уведомление. На переднем плане ваше приложение получает объект сообщения с обоими полезными нагрузками. Во-вторых, параметр click_action часто используется в полезных данных уведомлений, а не в полезных данных. Если этот параметр используется внутри полезных данных, этот параметр будет рассматриваться как настраиваемая пара ключ-значение, и поэтому вам нужно будет реализовать настраиваемую логику, чтобы он работал так, как задумано.

Кроме того, я рекомендую вам использовать onMessageReceived метод (см. Сообщение данных) для извлечения пакета данных. По вашей логике я проверил объект пакета и не нашел ожидаемого содержимого данных. Вот ссылка на похожий случай, который может дать больше ясности.

Другие вопросы по тегам