Android-приложение не получает уведомление Firebase, когда приложение остановлено из лотка с несколькими задачами

Я прочитал аналогичный вопрос на SO, однако я не смог получить от него правильный ответ.

У меня есть система, в которой мы отправляем уведомление примерно на 500 устройств.

К сожалению, многие из этих устройств не получают уведомление. Я обнаружил, что телефоны серии OPPO F1 особенно не получают уведомление.

Я заметил, что это происходит, если приложение остановлено из лотка с несколькими задачами. Как это разрешить?

Обновление: Я заметил, что когда я закрываю приложение из панели задач, мое приложение принудительно останавливается в диспетчере приложений. Когда я закрываю Whatsapp из панели задач, он все равно не принудительно останавливается. Как это обрабатывается Whatsapp?

Ответ 1

Обновление 03/2017 - Включая часть моего ответа здесь.

В связи с тем, что тема касания закрыта/убита/сила остановлена, эта тема обсуждалась довольно долгое время, и, похоже, нет определенного ответа. Во время одного из моих тестов я могу все еще получать сообщение (проверено с помощью полезной нагрузки сообщения data), только если я закрою свое приложение. Но когда я принудительно закрыл его из меню "Настройки", я не смог получить никаких сообщений. Обратите внимание, что это не всегда поведение.

Есть несколько устройств, которые были разработаны, когда вы закрываете приложение, это будет то же самое, что и принудительная остановка (см. мой ответ здесь).

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

Это не документировано нигде, потому что (IMO), это тема, которая также зависит от устройства и что FCM не имеет полного контроля.


Оригинальный ответ:

Поскольку это специфичное устройство (как вы упомянули в своем посте: телефоны серии OPPO F1), вполне возможно, что когда приложение будет остановлено из лотка с несколькими задачами в этом устройстве, это на самом деле kill приложение, в результате чего службы и другие связанные с ним фоновые процессы также будут уничтожены. См. Этот ответ, чтобы немного больше узнать о том, что я пытаюсь сказать.

Если вы ищете по всему сообществу, то здесь обычно предлагается использовать флаг START_STICKY. Тем не менее, я видел, что ранее упоминалось ранее для FirebaseMessagingService (см. Этот пост, комментарий от @ArthurThompson):

Эти службы будут запускаться службами Google Play, которые всегда работают на устройстве. Вам не нужно и не следует начинать/останавливать эти службы самостоятельно.

С учетом сказанного существует также возможность (опять же из комментариев):

На устройстве может быть настройка, которая разрешает/запрещает это.


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

Ответ 2

Вы пытались использовать атрибут stopWithTask в своем классе обслуживания?

<service
    android:name="com.yourapp.YourPushService"
    android:stopWithTask="false" />

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

Если флаг имеет значение false, в вашем классе Service есть обратный вызов onTaskRemoved.

В случае, если вы можете обнаружить событие "swipe", и вы можете реализовать обходной путь.

Ответ 3

Я прошел через то же самое, но в моем случае это были телефоны Xiaomi вместо телефонов Oppo. На самом деле происходит то, что при закрытии приложения из системного трея система полностью уничтожает приложение. Это означает, что ваше приложение не сможет получать уведомления через GCM/FCM. WAKE_LOCK не помогает.

Это НЕ означает, что телефон не получает уведомление. Это. Это просто не позволит приложениям показывать это. Вы можете проверить это, отправив трансляцию из adb и посмотрев на ваш logcat.

Одним из возможных решений этой проблемы является использование SyncAdapter. Хотя это НЕ рекомендуется, я видел, как некоторые приложения используют его. Другие возможные решения - использовать какой-либо фоновый сервис, который всегда работает. Некоторые люди также используют AlarmManager, поскольку его почти никогда не убивают. Моя точка зрения - вы не можете полагаться на GCM/FCM для своих уведомлений.

Теперь поговорим о WhatsApp -

В телефонах Xiaomi они используют белый список или черный список приложений, основанных на определенных критериях. Если вы загружаете приложение, и если оно находится в белом списке, они позволят приложению показывать уведомления. Если нет, вы уже знаете, что происходит. Но хорошо, что вы можете изменить эти настройки. Найдите приложение под названием "Безопасность". Если вы отмените правильные разрешения, даже WhatsApp перестанет показывать уведомления.

Ответ 4

Я также столкнулся с одной и той же проблемой. Но потом я понял, что после много отладки я остановил службы, которые получают уведомления Firebase в методе stop для одного из действий.

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

Ответ 5

Ответ был найден здесь

Нет способа отправить сообщение данных из консоли уведомлений.

Но есть и другой способ отправки уведомлений на устройства, и они будут улавливаться внутри onMessageReceived!

Вам нужно использовать терминал (Mac или Linux) или какую-либо услугу, например Почтальон, для отправки запроса на отправку по этой ссылке: https://fcm.googleapis.com/fcm/send

со следующим телом:

{
    "to": "/topics/your_topic_here",
   "data": {
       "text":"text",
       "text1":"text1",
       ...
   }
}

Также вам нужно добавить 2 заголовка:

  • Авторизация - key = your_server_key_here
  • Content-Type - application/json

Чтобы получить ключ сервера, вы можете найти его в консоли firebase: Ваш проект → настройки → Настройки проекта → Обмен облачными сообщениями → Ключ сервера

введите описание изображения здесь

введите описание изображения здесь

Ответ 6

Когда приложение закрыто, он отключает службу. Необходимо перезапустить службу. См. здесь

Ответ 7

Я попытался переопределить значок уведомления, используя теги метаданных. это сработало для меня.

<meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@mipmap/ic_launcher" />

<meta-data android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorPrimary" />