Хобрук: Ваш путь к мастерству в программировании

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

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

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

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

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

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



Ответы:


1

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

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

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

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

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


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

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

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

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

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

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


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

15.09.2016
  • Странно то, что уведомления WhatsApp принимаются мобильным телефоном, даже когда он закрыт смахиванием. 16.09.2016
  • @milanm WhatsApp часто является примером по этой теме. Хотя я не совсем понимаю, как они это делают. Может быть, поможет использование AlarmManager и перезапуск службы? Я видел, как многие люди в сообществе также упоминали об этом. 16.09.2016
  • Когда вы используете удаленные push-уведомления, Android разбудит ваше приложение и отправит вам уведомление с помощью Intent. На большинстве устройств, когда вы проводите пальцем влево по приложению на панели задач, вы фактически убиваете приложение и его службы, но это не мешает приложению получать push-уведомления. 20.09.2016
  • @tomacco Удаление приложения обычно также приводит к остановке всех служб, которые необходимы при получении уведомлений. Это сделано специально, начиная с Android 3.1. 20.09.2016
  • @AL это правда (я не сказал иначе), но это не помешает вам получать push-уведомления. Сервисы Google Play имеют постоянное соединение с GCM / FCM, и как только он получит сообщение, он запустит вашу объявленную службу, чтобы доставить вам сообщение. Поэтому не имеет значения, если ваше приложение полностью мертво, если вы правильно реализовали GCM, вы получите сообщение. 20.09.2016
  • @tomacco Интересно. Так было всегда с Google Play Services и GCM / FCM? Или это было только для последних версий? Таким образом, проблема может быть связана с самими устройствами. Может, что-то в настройках ОС или телефона намеренно блокирует уведомление? 21.09.2016
  • @AL Наверное, это само устройство. Или, возможно, это реализация, я смотрю на свой существующий push-код, чтобы дать точный ответ 21.09.2016
  • @tomacco Я думаю, что это вряд ли будет в реализации. Поскольку это работает, только не для телефонов серии OPPO F1. Кроме того, мне было интересно, можете ли вы указать мне на документацию относительно того, что вы сказали в своем предыдущем комментарии о том, что Сервисы Google Play имеют постоянное соединение с GCM / FCM? :) Я хотел бы проверить это и при необходимости обновить некоторые из моих ответов здесь, в StackOverflow. :) 21.09.2016
  • @AL. Да, конечно, проверьте это: stuff.mit .edu / afs / sipb / project / android / docs / google / gcm / gcm.html Они почти не говорят об этом, но это интересный документ. Также вы можете найти дополнительную информацию в других ответах SO. stackoverflow.com/questions/19111901/ 21.09.2016
  • @milanm многие китайские производители, в том числе OPPO, склонны имитировать iOS. В моей компании мы обнаружили, что многие из них рассматривают закрытие в недавнем экране так же, как принудительное закрытие приложения, и, что более важно, это поведение не применяется единообразно, то есть популярные приложения для обмена мгновенными сообщениями освобождены от этого поведения. Поэтому я предлагаю вам загрузить другие менее популярные приложения и проверить их поведение. 22.09.2016
  • @AL Во время одного из моих тестов я все еще могу получать сообщение (проверено с полезной нагрузкой сообщения только с данными), если я закрываю свое приложение смахиванием. Можете ли вы дать этому пример? 14.06.2017
  • @Bishwash Насколько я помню, я использовал физическое устройство, чтобы проверить это (я думаю, Nexus 6) и отправил запрос через Postman. 14.06.2017
  • @AL. производители устройств внесли в белый список большинство известных приложений означает, что мы не можем ничего сделать для нашего приложения, чтобы получать уведомления, потому что оно не известно до настоящего времени, так что в основном это полностью зависит от производителей 03.08.2017
  • @KapilRajput К сожалению, похоже, что это так. Вы можете попытаться отправить им запрос, но я не знаю, что может произойти дальше. 03.08.2017
  • @KapilRajput у вас есть ссылка в подтверждение вашего утверждения, чтобы я мог показать ее своему боссу? : D 18.08.2017
  • @lelloman Я упомянул Это нигде не задокументировано, потому что (IMO), это тема, которая также зависит от устройства, и FCM не имеет полного контроля над ней. - в настоящее время это все еще кажется кейс. 18.08.2017
  • @AL. извиняюсь, если я немного медленен, но мне все еще нужно понять одну вещь: если мое приложение принудительно закрыто, есть ли шанс, что я могу отправить только push-уведомление и показать его? В документации сказано, что GCM / FCM показывает уведомление от имени приложения. Но я пробовал это, и, похоже, это не работает, если приложение закрыто принудительно. 18.08.2017
  • @lelloman Не беспокойтесь. Вы упомянули поведение GCM / FCM по умолчанию при отправке полезных данных сообщения только для notification, , но только если уведомление * не заблокировано устройством . В вашем случае весьма вероятно, что само устройство блокирует уведомления. 18.08.2017
  • @AL. это эмулятор со стандартным Android 25 с API Google, он работает, когда приложение не закрывается принудительно. У вас есть какие-нибудь советы, как это отладить? то же самое на OnePlus 3T с android 7.1.1 18.08.2017
  • то же самое и с эмулятором с android 4.4 18.08.2017

  • 2

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

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

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

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

    В этом случае вы можете обнаружить событие «смахивания» и реализовать обходной путь.

    23.09.2016
  • это сработало для меня. В com.yourapp.YourPushService вам нужно ввести свой класс, который расширяет FirebaseMessagingService :) 02.03.2017
  • так установите истину или ложь? для предотвращения службы убийства 16.07.2017
  • значение по умолчанию для stopWithTask - false, так в чем смысл? 27.11.2017
  • Согласно вопросу, FirebaseMessagingService всегда работает, даже если приложение закрывается из панели задач. Я согласен с @codepeaker 03.03.2018

  • 3

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

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

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

    Поговорим о WhatsApp сейчас -

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

    22.09.2016
  • Не могли бы вы рассказать, как использовать SyncAdapter для доставки уведомлений? Мы уже используем SyncAdapter для синхронизации наших данных. Как мы можем обрабатывать push-уведомления? 02.11.2016
  • Приведите пример того, как вы используете SyncAdapter в этом случае. 13.10.2020

  • 4

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

    1. Пожалуйста, проверьте, останавливаете ли вы эти службы где-нибудь в приложении.
    2. Убедитесь, что вы используете службу, а не службу намерения.
    3. Прокрутка приложения никогда не остановит сервисы. Поэтому попробуйте отладить приложение по первым двум пунктам.
    22.09.2016

    5

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

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

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

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

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

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

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

    1. Авторизация - key = your_server_key_here
    2. Content-Type - приложение / json

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

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

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

    01.10.2016

    6

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

    24.02.2017
    Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

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


    © 2024 hobruk.ru, Хобрук: Ваш путь к мастерству в программировании