Открытое приложение по получению уведомления о базе данных (FCM)

Я хочу открывать приложение автоматически при получении уведомления, возможно ли это с помощью Firebase и новых уведомлений FCM?

Я знаю, что могу установить click_action, но это только для настройки того, какое действие будет запускаться при нажатии на уведомление, мне нужно что-то, что будет запускаться автоматически при получении уведомления.

Я попробовал пример Firebase для быстрого начала обмена сообщениями, и есть метод onMessageReceived(), но он работает, только если приложение находится на переднем плане. Есть ли что-то, что будет выполняться, пока приложение находится в фоновом режиме? GCM может сделать что-то вроде того, что я хочу здесь, непосредственно запустив намерение активности от широковещательного приемника, который вызывается при получении уведомления.

4 ответа

Решение

Быстрый ответ:

Для автоматического открытия приложения через FCM необходимо использовать data-message, который гарантирует всегда вызывать FirebaseMessagingService.onMessageReceived() метод.

Затем вы можете добавить свою логику в .onMessageReceived() способ начать предпочтительную деятельность.

ВНИМАНИЕ: запуск интерфейса без какого-либо взаимодействия с пользователем является очень плохой практикой для большинства приложений! Пожалуйста, прочитайте ответ MarkG здесь: Как начать Активность из Сервиса?

[...] Прерывание того, что в данный момент делает пользователь, считается плохой формой проектирования, особенно из-за того, что предполагается работать в фоновом режиме.
Поэтому вам следует рассмотреть возможность использования уведомления [...] для запуска желаемой операции, когда пользователь решает, что пришло время заняться расследованиями. [...]

Полное объяснение:

FCM работает аналогично GCM и может получать сообщения двух типов:

  1. дисплей-сообщения:
    полезная нагрузка {"notification" : { "body" : "hello world"}}
    Эти сообщения автоматически отображаются, когда приложение находится в фоновом режиме, и они вызывают FirebaseMessagingService.onMessageReceived() если приложение уже на переднем плане.

  2. данные-сообщения:
    полезная нагрузка {"data" : { "key1" : "value1"}}
    Эти сообщения всегда вызывают FirebaseMessagingService.onMessageReceived(),
    даже если приложение закрыто или в фоновом режиме.

click_action является параметром полезной нагрузки уведомления, поэтому он применяется к сообщениям дисплея.

Указывает действие, связанное с щелчком пользователя на уведомлении.
Если это установлено, действие с соответствующим фильтром намерений запускается, когда пользователь щелкает уведомление.

https://firebase.google.com/docs/cloud-messaging/http-server-ref

Похоже, что этот раздел руководства является ключом к загадке фоновых приложений:

Получать сообщения
Используйте сервис, который расширяет FirebaseMessagingService. Ваш сервис должен переопределить onMessageReceived обратный вызов, который предоставляется для большинства типов сообщений, со следующими исключениями:

Уведомления доставляются, когда ваше приложение находится в фоновом режиме.
В этом случае уведомление доставляется в системный трей устройства. При нажатии на уведомление пользователя открывается панель запуска приложения по умолчанию.

Сообщения с уведомлением и данными.
В этом случае уведомление доставляется в системный трей устройства, а полезная нагрузка данных доставляется в дополнениях к назначению вашего средства запуска.

По сути, когда приложение работает в фоновом режиме, оно не является действительно отзывчивым или запущенным на данный момент. Таким образом, вместо этого сообщение доставляется в системный трей. Тем не менее, чуть ниже, решение объясняется.

Если вы хотите открыть свое приложение и выполнить определенное действие [в то время как в фоновом режиме], установите click_action в полезной нагрузке уведомления и сопоставьте его с фильтром намерений в Activity, которую вы хотите запустить. Например, установите для click_action значение OPEN_ACTIVITY_1, чтобы активировать фильтр намерений, как показано ниже:

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

Я суммирую шаги здесь, надеюсь, это полезно

ШАГ 1

Следуя инструкции пользователя FCM. Убедитесь, что все работает правильно, отправив сообщение с консоли Firebase.

ШАГ 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));
}
}

Теперь, снова используя push-сообщения консоли Firebase, вы обнаружите, что onMessageReceived срабатывает только тогда, когда ваше приложение находится на переднем плане. Потому что консоль Firebase умеет отправлять Notification message только. Для отправки Data messageнам нужен шаг 3.

ШАГ 3

Установите Google Advanced 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() на onTokenRefresh()

НОТА

Запуск пользовательского интерфейса без взаимодействия с пользователем - это плохой пользовательский интерфейс, вам может потребоваться заменить стартовую активность на запуск службы или что-то в фоновом режиме. Я просто использую активность для целей тестирования, поэтому она будет более наглядной, чем сервисная. Спасибо @2ndgab за знакомство с клиентским инструментом Google Advanced REST.

[Android] Если вы используете уведомления Firebase (не Firebase Cloud Messaging), все, что вам нужно сделать, это включить Firebase Messaging в ваш build.gradle, а затем связать ваше приложение с проектом в Firebase Console.

Если ваше приложение находится в фоновом режиме, любое сообщение, отправленное с консоли, даст вам системное уведомление, которое, если его коснуться, активирует ваше приложение.

Посмотрите здесь: https://youtu.be/KpTSpVh9SfY?t=10m22s

На самом деле решение этой проблемы довольно просто. Нет необходимости в намерении, просто установите @ionic-native/background-mode.

Вот полное объяснение и репозиторий git для решения этой проблемы.

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