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
Вот некоторые ссылки по теме:
- https://github.com/firebase/quickstart-android/issues/4
- https://github.com/firebase/quickstart-android/issues/47
- Как обрабатывать уведомления, когда приложение в фоновом режиме в Firebase
- Firebase onMessageReceived не вызывается, когда приложение в фоновом режиме
- Как обрабатывать уведомления, когда приложение в фоновом режиме в Firebase
Заранее спасибо. Извините за плохой английский.
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
метод (см. Сообщение данных) для извлечения пакета данных. По вашей логике я проверил объект пакета и не нашел ожидаемого содержимого данных. Вот ссылка на похожий случай, который может дать больше ясности.