Открытое приложение для получения уведомлений о пожарной базе (FCM)
Я хочу открыть приложение автоматически при получении уведомления, возможно ли это с помощью Firebase и новых уведомлений FCM?
Я знаю, что могу установить click_action, но только для того, чтобы настроить, какая активность начнется с уведомления, нажмите, мне нужно что-то, что будет запускаться автоматически при получении уведомления.
Я попробовал образец firebase для быстрого обмена сообщениями, и есть метод onMessageReceived(), но он работает только в том случае, если приложение находится на переднем плане. Есть ли что-то, что будет выполняться, когда приложение также находится в фоновом режиме?
GCM мог бы сделать что-то вроде того, что я хочу здесь, непосредственно начиная намерение активности от широковещательного приемника, который вызывается при получении уведомления.
Ответы
Ответ 1
Быстрый ответ:
Чтобы автоматически открыть приложение через FCM, вам нужно использовать data-message
, который гарантирует всегда вызывать метод FirebaseMessagingService.onMessageReceived()
.
Затем вы можете добавить свою логику в метод .onMessageReceived()
, чтобы начать предпочтительную операцию.
ПРЕДУПРЕЖДЕНИЕ: запуск пользовательского интерфейса без какого-либо взаимодействия с пользователем - очень плохая практика для большинства приложений! Пожалуйста, прочитайте ответ MarkG здесь: Как начать работу с помощью службы?
[...] Прерывание того, что делает пользователь в настоящее время, считается плохой формой дизайна, особенно из-за того, что предполагается использовать в фоновом режиме. Поэтому вам следует подумать об использовании Notification [...] для запуска желаемого действия, когда пользователь решит, что пора исследовать. [...]
Полное объяснение:
FCM работает аналогично GCM и может получать два типа сообщений:
- отображаемые сообщения:.
{"notification" : { "body" : "hello world"}}
Эти сообщения автоматически отображаются, когда приложение находится в фоновом режиме, и они вызывают FirebaseMessagingService.onMessageReceived()
, если приложение уже находится на переднем плане.
- данные-сообщения:
Полезная нагрузка {"data" : { "key1" : "value1"}}
Эти сообщения всегда вызывают FirebaseMessagingService.onMessageReceived()
,
даже если приложение закрыто или находится в фоновом режиме.
click_action
является параметром полезной нагрузки уведомления, поэтому он применяется к отображаемым сообщениям.
Указывает действие, связанное с щелчком пользователем уведомления.
Если для этого установлено действие с соответствующим фильтром соответствия запускается , когда пользователь нажимает уведомление.
https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support
Ответ 2
Похоже, этот раздел руководства является ключом к головоломке фоновых приложений:
Получение сообщений
Использование службы, которая расширяет FirebaseMessagingService. Ваше обслуживание должно отменяться обратный вызов onMessageReceived
, который предоставляется для большинства сообщений типов, за следующими исключениями:
Уведомления, когда ваше приложение находится в фоновом режиме.
В этом случае, уведомление доставляется на системный лоток устройств. пользователь по нажатию на уведомление открывает панель запуска приложения по умолчанию.
Сообщения с полезной нагрузкой уведомлений и данных.
В этом случае уведомление доставляется на системный лоток устройств, а данные полезная нагрузка поставляется в дополнение к цели вашей пусковой установки Активность.
По сути, когда приложение задумано, оно не очень отзывчивое или работает на этом этапе. Поэтому вместо этого сообщение доставляется в системный лоток. Однако, чуть ниже, объясняется решение.
Если вы хотите открыть приложение и выполнить определенное действие [в фоновом режиме], установите click_action в полезной нагрузке уведомления и сопоставить его с намерением фильтр в Запуске, который вы хотите запустить. Например, установите click_action до OPEN_ACTIVITY_1, чтобы вызвать фильтр намерений, например, следующее:
<intent-filter>
<action android:name="OPEN_ACTIVITY_1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Ответ 3
Я кратко излагаю шаги здесь, надеюсь, это полезно
ШАГ 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 Расширенный клиент REST
Ввод ниже параметров:
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 > Панель настроек > вкладка Cloud Messaging
YOUR_DEVICE_FCM_TOKEN FirebaseInstanceId.getInstance().getToken()
on onTokenRefresh()
ПРИМЕЧАНИЕ
Запуск пользовательского интерфейса без взаимодействия с пользователем - это плохой UX, вам может потребоваться заменить начальную активность службой запуска или что-то в фоновом режиме. Я просто использую активность для целей тестирования, поэтому она будет более визуальной, чем услуга.
Спасибо @2ndgab за знакомство с клиентом Google Advanced REST.
Ответ 4
[Android]
Если вы используете уведомления Firebase (а не Firebase Cloud Messaging), все, что вам нужно сделать, это включить Firebase Messaging в ваш build.gradle, а затем связать приложение с проектом в Firebase Console.
Если ваше приложение находится в фоновом режиме, любое сообщение, отправленное с консоли, даст вам системное уведомление, которое, если оно будет тронуто, активирует ваше приложение.
Взгляните сюда: https://youtu.be/KpTSpVh9SfY?t=10m22s