Сообщение Firebase с высоким приоритетом, не пробуждающее устройство от Doze android 6+

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

В документах Android говорится, что если вам нужно разбудить устройство для доставки сообщения, используйте FireBase с высоким приоритетом. В нем также говорится, что приложения администратора устройства не подпадают под ограничения Doze, мое приложение является приложением администратора устройства.

Я подумал, что упомяну, что при переносе проекта с GCM на FCM я указал только имя пакета в консоли firebase, а не отпечаток пальца.

Что я пробовал

  1. Установить высокий приоритет

    {
      "time_to_live": 300000,
      "delay_while_idle": false,
      "android": {
        "priority": "high"
      },
      "data": {
        "message": "PING_DEVICE",
        "time": "21/01/2018 16:20:28",
        "pushguid": "10062"
      },
      "registration_ids": [
        "eOMT........"
      ]
    }
    

    Время жить установлено, поэтому сообщение в конце концов дойдет до вас. delay_ while_idle установлен в false, это игнорируется FCM после сентября 2016 года.

  2. Приложения для администрирования устройства не подпадают под действие Doze, мое - это приложение для администрирования устройства, но я также явно добавил приложение в белый список Doze, который можно найти в разделе «Настройки» -> «Батарея» -> «Оптимизация». Это было сделано вручную через приложение настроек, а НЕ программно в коде.

Я оставил свое устройство спать на 3 часа, и ничего не происходит. Я также использовал adb, чтобы перевести устройство в режим Doze. Когда adb переводит устройство в режим Doze, толчок не принимается, когда adb выводит устройство из режима Doze, толчок проходит.

другие мысли, которые я не пробовал.

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

onMessageReceived(RemoteMessage remoteMessage)

Я считаю, что сообщения с уведомлениями вызывают пробуждение устройства, что мне и нужно, но я хочу, чтобы приложение обрабатывало push, а не пользователь. Могу ли я иметь сообщения, которые являются одновременно уведомлением и данными, но с функцией onMessageRecievied для обработки этих функций?

Кто-нибудь испытывал что-либо подобное или есть какие-либо решения для этого?

[EDIT1] Я нашел следующую ссылку ниже, в которой говорится, что вы можете отправить сообщение, которое является одновременно уведомлением и данными, но если приложение находится в фоновом режиме, уведомление отображается, но данные выполняются только тогда, когда пользователь щелкает уведомление. Это не то, что я хочу, так как я хотел бы, чтобы данные сразу выполнялись в onMessageRecived.

уведомление с данными

[EDIT2] Я добавил в приложение следующий код и разрешение. Теперь приложение просит пользователя внести приложение в белый список для Doze, поэтому я нажал кнопку «Да». Затем я через adb поместил устройство в режим Doze и отправил push. Ничего не происходило, пока я не вывел устройство из спящего режима. Так что, к сожалению, это не работает.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Intent intent = new Intent();
            String packageName = getPackageName();
            PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
            if (!pm.isIgnoringBatteryOptimizations(packageName)) {
                intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setData(Uri.parse("package:" + packageName));
                startActivity(intent);
            }
        }

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

[РЕДАКТИРОВАТЬ3]

Я провел дополнительное тестирование, чтобы попытаться изолировать проблему и исключить код моего веб-приложения из уравнения. Я поместил устройство в Doze через adb и используемую консоль FireBase, чтобы вместо этого отправить push. Отправка прошла правильно. Это говорит мне о проблеме с кодом моего веб-приложения, который отправляет всю информацию push на конечную точку fcm. Я получу код сегодня вечером и отправлю его позже.

[EDIT4] Я только что провел еще несколько тестов. Я поместил устройство в дремоту, а затем использовал консоль FireBase для отправки сообщения с данными с двумя парами ключ-значение. Когда устройство находится в дремоте, а приложение находится на переднем плане (на экране), проталкивание проходит и выполняется onMessageReceived. Отлично. Однако, если приложение находится в BG, отображается только уведомление. Я понимаю, что из документации сообщения данных отправляются в действие средства запуска через намерение, но мое приложение запуска не обрабатывает нажатия. Класс, который обрабатывает нажатия, называется MyAndroidFirebaseMsgService и расширяет FirebaseMessagingService.

Должен ли я направлять намерение в этот класс, если приложение находится в BG? Кажется, это немного страдает. В GCM этого никогда не было.

Кроме того, я не хочу, чтобы приложение запускалось из push-уведомлений, поскольку это очень агрессивно, поскольку пользователь устройства может использовать другое приложение. Мое приложение также является приложением для администрирования устройства, поэтому в 99% случаев взаимодействие с пользователем отсутствует, это просто клиент, который выполняет политики на устройстве.

[edit5]

internal static void SendNotification (  Dictionary<string, string> nameValues ,  List<string> theregIDs , string sPushName)
         {     
            string stringregIds =  string.Join("\",\"", theregIDs) ;

             JavaScriptSerializer js = new JavaScriptSerializer();
            string keyValueJson = js.Serialize(nameValues);

            string TIME_TO_LIVE = "604800";

            string DELAY_WHILE_IDLE = "false";

            string ENDPOINTADDRESS = @"https://fcm.googleapis.com/fcm/send";


            postData = String.Concat("{\"time_to_live\":", TIME_TO_LIVE,  ",\"delay_while_idle\": ", DELAY_WHILE_IDLE,  ",  \"android\":{\"priority\":\"high\" } ,\"data\": { \"message\" : " + "\"" + sPushName + "\",\"time\": " + "\"" + System.DateTime.Now.ToString() + "\""
                , keyValueJson
               , "},\"registration_ids\":[\"" + stringregIds + "\"]}");


            WebRequest myWebRequest = null;
            WebResponse myWebResponse = null;
            try
            {
                myWebRequest = WebRequest.Create(ENDPOINTADDRESS);                         
                myWebRequest.Method = "post";
                myWebRequest.ContentType = "application/json";
                //  myWebRequest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
                myWebRequest.Headers.Add("Authorization: key=" + Our_Api_Key);
                myWebRequest.Headers.Add("Sender:id=" + Our_Sender_Id);

                Byte[] BA = Encoding.UTF8.GetBytes(postData);
                myWebRequest.ContentLength = BA.Length;

                using (Stream dataStreamOut = myWebRequest.GetRequestStream())
                {
                    dataStreamOut.Write(BA, 0, BA.Length);

                }

                using (myWebResponse = myWebRequest.GetResponse())
                {
                    using (Stream dataStream = myWebResponse.GetResponseStream())
                    {
                        using (StreamReader tReader = new StreamReader(dataStream))
                        {
                            strServerResponse = tReader.ReadToEnd(); 
                        }

                    }
                }


            }
            catch (WebException ex)
            {



            }

         }//

Благодарность


person turtleboy    schedule 25.01.2018    source источник
comment
работает ли он в более низких версиях Android, а также где вы добавляете приоритет и данные?   -  person Peter Haddad    schedule 30.01.2018
comment
@PeterHaddad Привет, я не тестировал его на более ранних версиях Android. Все телефоны, которые я буду покупать, будут на базе Android 6+. Я попрошу своего делового партнера предоставить мне фрагмент кода, показывающий, как он отправляет данные в конечную точку FCM. Есть ли особое место или порядок, где я должен установить приоритет и данные?   -  person turtleboy    schedule 30.01.2018
comment
Что касается вашего EDIT3, то консоль Firebase позволяет отправлять только push уведомления (насколько я помню). Они обрабатываются службами Google Play , если ваше приложение не запущено, которые отправляют уведомление от вашего имени. Это не запускает ваше приложение, и вы не получаете обратного вызова onMessageReceived. Вы получили этот обратный звонок?   -  person Eugen Pechanec    schedule 30.01.2018
comment
@EugenPechanec а, вы правы, это было просто уведомление, обратного вызова не было. Есть ли у вас какие-либо дополнительные мысли о том, в чем может быть проблема?   -  person turtleboy    schedule 30.01.2018
comment
Понятия не имею, в чем проблема, но у меня есть несколько идей по отладке. На каком устройстве это происходит? Вы пробовали другие устройства или эмуляторы? (Вы должны, для сравнения.) Вы пытались отправить data FCM (который всегда должен запускать обратный вызов) через FCM HTTP API? (Не принимая во внимание логику сервера, как вы предложили.)   -  person Eugen Pechanec    schedule 30.01.2018
comment
@EugenPechanec У меня такие же результаты на S6, S7 и Xcover3. Все Android6 +. Сообщения, которые я пытаюсь отправить, всегда были сообщениями с данными. В исходном посте я привел фрагмент того, что веб-приложение отправляет в конечную точку FCM. Я считаю, что использует FCM http api. Как я могу проверить, что вы предлагаете? Может ли консоль firebase отправлять сообщения исключительно с данными?   -  person turtleboy    schedule 30.01.2018
comment
@turtleboy Если вы отправляете уведомление с одного телефона на другой, это: stackoverflow.com/questions/47505629/ работал у меня, где, даже если телефон спит, он получил уведомление. Что касается консоли, я думаю, вы правы там свое сообщение .. не думаю, что оно проходит через сервер, но проходит через FCM   -  person Peter Haddad    schedule 30.01.2018
comment
@PeterHaddad Привет, я только что провел еще несколько тестов. Я поместил устройство в дремоту, а затем использовал консоль FireBase для отправки сообщения с данными с двумя парами ключ-значение. Когда устройство находится в состоянии дремоты и на переднем плане (на экране), push проходит и выполняется onMessageReceived. Отлично. Однако, если приложение находится в BG, отображается только уведомление. Я понимаю, что из документации сообщения с данными отправляются в действие средства запуска через намерение, но мое приложение запуска не обрабатывает нажатия.   -  person turtleboy    schedule 30.01.2018
comment
Я опубликовал РЕДАКТИРОВАТЬ 4   -  person turtleboy    schedule 30.01.2018
comment
что должно содержаться в уведомлении? Под этим я подразумеваю, что должны иметь заголовок и тело уведомления, поскольку они должны быть указаны в полезной нагрузке данных как ссылка выше в моем комментарии.   -  person Peter Haddad    schedule 31.01.2018
comment
@PeterHaddad Вы имеете в виду, когда я отправляю уведомление из своего веб-приложения или через консоль firebase? Если вы имеете в виду через мое веб-приложение, то эти сообщения представляют собой сообщения с чистыми данными, у которых есть ключ сообщения, который может быть PING_DEVICE, и другой ключ, называемый pushguid, для которого установлено значение 123. Я не устанавливаю заголовок или тело, поскольку это сообщение с данными. Я отправлю код сервера, который отправляет push, в EDIT5. извините, если я не понял, что вы имели в виду.   -  person turtleboy    schedule 31.01.2018
comment
Исходя из того, что я понял о проблеме, и на основе ваших выводов EDIT3, я попытаюсь получить http-сообщение, отправленное с консоли Firabase Push. (Попробуйте проверить трафик, если можете) и посмотрите, не отправляют ли они какие-то конкретные параметры, которые пробуждают ваше устройство. Обнаружено, что вы должны имитировать поведение в своем веб-приложении.   -  person MatPag    schedule 03.02.2018
comment
@turtleboy, это все еще проблема или вы нашли решение? Это может быть связано с конкретным устройством. На наших в основном обычных устройствах AOSP 6.0.1 мы используем Pushy с постоянным подключением. Наше хост-приложение внесено в белый список, и мы не обнаружили никаких проблем с выходом из спящего режима. Я подозреваю, что проблемы, связанные с OEM, как упоминали другие комментаторы.   -  person scorpiodawg    schedule 14.02.2018
comment
попробуйте запустить фоновую службу и получать уведомления с помощью JobIntentService. Служба намерений только задания работает с oreo medium.com/til-kotlin/   -  person msmukesh4    schedule 03.05.2018
comment
Вы нашли решение этого?   -  person sebasira    schedule 10.09.2018
comment
Что-нибудь новенькое по этой проблеме ??   -  person Dominik K    schedule 20.10.2018
comment
@DominikK Нет, дружище, мне пришлось выпустить программное обеспечение как есть. Таким образом, мои запросы поступают только в том случае, если устройство не спит или просыпается пользователем.   -  person turtleboy    schedule 24.10.2018
comment
@turtleboy Я решил эту проблему. Не очень хорошее решение, но если вы держите службу переднего плана, работающую все время в фоновом режиме, независимо от того, как долго устройство находится в режиме дремоты, сообщения Pushy и Firebase всегда приходят. Единственным недостатком является немного больший расход заряда батареи (в приемлемой области) и постоянное уведомление, всегда показываемое, когда приложение ожидает сообщения. Это зависит от типа вашего приложения, приемлемы ли для вас эти недостатки.   -  person Dominik K    schedule 15.12.2018
comment
@turtleboy - Видели ли вы какие-либо ограничения, поскольку вы устанавливаете такой же высокий приоритет для каждого другого сообщения. Разве здесь не будут применяться ограничения резервного сегмента приложения?   -  person Tulika    schedule 20.12.2019


Ответы (8)


После борьбы с аналогичной проблемой мне удалось заставить ее работать.

Я отправляю следующие данные json через почтальона:

{
  "data": {
    "body": "Test body from curl"
  },
  "registration_ids": ["Token"],
  "webpush": {
    "headers": {
      "Urgency": "high"
    }
  },
  "android": {
    "priority": "high"
  },
  "priority": 10
}

Похоже, последнее "priority":10 - это то, что исправляет для меня.

Я не смог найти упоминания об этом в документации Firebase, но в устаревшей документации GCM он использовался. https://developers.google.com/cloud-messaging/concept-options

person Patric Eriksson    schedule 09.01.2019
comment
Я добавил webpush, android и priority, теперь он работает у меня на устройствах samsung, motorola и huawei с android 8, когда устройство перешло в спящий режим и не подключено к зарядному устройству ... Thnx, чтобы поделиться этой конфигурацией !! (Я использовал более старую php-зависимость, sly / notification-pusher, которая использовала класс zendframework github.com/zendframework/ZendService_Google_Gcm/blob/master/src/, для которого в моей версии еще не было задано поле приоритета) - person WiRa; 15.01.2019
comment
Я получаю следующую ошибку: Неизвестный приоритет имени в «сообщении»: не удается найти поле. - person Arjun; 18.05.2021

Вы ничего не можете сделать.

Это известная проблема, вызванная оптимизацией батареи, реализованной некоторыми OEM-производителями (например, Meizu или Asus). Когда приложение удаляется в переключателе приложений, оно обрабатывается так, как если бы оно было принудительно остановлено, что не является поведением Android по умолчанию. К сожалению, это может привести к прекращению работы службы FCM для вашего приложения. Аналогичный эффект может быть вызван сообщениями с высоким приоритетом в спящем режиме.

Команда Firebase работает над улучшением этого поведения со своей стороны, но фактическое исправление должно исходить от OEM.

Один из способов проверить, не влияет ли на ваше приложение какая-либо OEM-функция управления батареями, является следующий:

1) Прикрепляем OEM устройство к adb

2) Запустите приложение на устройстве.

3) Проведите пальцем по приложению от недавнего экрана на устройстве.

4) Выполните команду: adb shell dumpsys package MY-PACKAGE | grep остановлен

Если он показывает Stop = true, можно с уверенностью предположить, что у OEM-производителя есть такой механизм, и что ваше приложение затронуто им.

person Kuva    schedule 02.02.2018
comment
Привет, нет, это не остановило. hero2lte: / $ dumpsys пакет devreach.co.uk.devreach | grep остановлен Пользователь 0: ceDataInode = 397339 установлен = true скрыто = false приостановлено = false остановлено = false notLaunched = false включено = 0 - person turtleboy; 03.02.2018
comment
также у меня есть другое приложение, созданное на другом компьютере, которое работает на том же устройстве. Это отдельная система, которая по-прежнему использует GCM для доставки push-уведомлений. если я положу устройство в режим Doze, толчок пройдет нормально. Я читал в других сообщениях, что некоторые люди обновили свою студию Android и сборку gradle, и это остановило толчки, поступающие на устройство в режиме Doze. раньше они были в порядке. так что я не уверен, в чем проблема все еще - person turtleboy; 03.02.2018

TL; DR - не забудьте правильно установить приоритет уведомления на основе структуры полезной нагрузки JSON для устаревшего протокола HTTP FCM по сравнению с протоколом HTTP v1.

Возможно, уже есть достаточные ответы из сообщений выше, в зависимости от ваших обстоятельств или реализации, но я хотел дать ответ с большим контекстом, основанный на различии между устаревшими протоколами HTTP и HTTP v1, которые FCM предоставляет в своей документации, но есть тонкий разница между API двух протоколов при установке приоритета уведомлений.

Наша команда столкнулась с той же проблемой отсутствия push-уведомлений на устройствах Android 6+, на которых включена функция Doze, хотя наш сервер, по-видимому, правильно устанавливал приоритет в полезной нагрузке FCM API, аналогичной полезной нагрузке, указанной в исходном вопросе. Мы полагаемся на Amazon SNS для пересылки полезных данных в FCM, и полезные данные, отправленные с нашего сервера в Amazon SNS, будут устанавливать приоритет на основе AndroidConfig JSON-объект:

{
    "android": {
        "priority": "high"
    }
}

Однако это правильно только в соответствии с протоколом HTTP v1. . Мы не знали, что Amazon SNS, вероятно, все еще использует устаревший протокол HTTP, в котором приоритет должен быть установлен на верхнем уровне полезной нагрузки JSON:

{
    "priority": "high", // legacy HTTP protocol (this can also be set to 10)
    "android": {
        "priority": "high" // HTTP v1 protocol
    }
}

Таким образом, приоритет уведомления вступит в силу и позволит получать push-уведомления только в режиме Doze, когда для устаревшего параметра приоритета HTTP установлено значение «высокий» или 10.

Для контекста это конечные точки API для каждого протокола при отправке сообщений в FCM:

person Alex Bagg    schedule 27.01.2020
comment
Правда, много с этим боролся, также нужно ли включать REQUEST_IGNORE_BATTERY_OPTIMIZATIONS в манифесте Android? - person Pulkit; 26.02.2020
comment
@Pulkit Мне не нужно было добавлять этот флаг, просто поставьте и legacy, и v1, и установите их на высокий уровень. Затем протестировали с помощью Azure Notifications Hub, и сообщение было получено, когда приложение было закрыто - Pixel 4 использовался для тестирования. - person Philip Patrick; 24.10.2020

Работая над приложением, я тоже застрял на этом этапе. Затем я обнаружил проблему на Github, которая решила мою проблему. То есть,

На устройствах под управлением Android 6.0+ режим Doze завершает все фоновые подключения, когда телефон находится в режиме ожидания и не заряжается, включая фоновое подключение к Pushy.

Как только устройство перемещается или пробуждается пользователем, фоновые соединения восстанавливаются, и любые ожидающие уведомления будут доставлены в течение нескольких секунд, если срок их действия еще не истек.

Чтобы отправлять уведомления на устройства в режиме ожидания, ваше приложение может объявить REQUEST_IGNORE_BATTERY_OPTIMIZATIONS разрешение в своем AndroidManifest.xml и отобразить системное диалоговое окно, предлагающее пользователям внести ваше приложение в белый список для оптимизации заряда батареи, не выходя из приложения.

Это позволит эффективно поддерживать фоновое соединение с Pushy активным, и устройства смогут получать уведомления даже в режиме Doze.

Вы можете проверить эту проблему здесь, https://github.com/ToothlessGear/node-gcm/issues/231

Надеюсь, это вам поможет!

person Aditya    schedule 30.01.2018
comment
Привет, я уже добавил свое приложение в список оптимизации заряда батареи. В вопросе я указал Настройки - ›Батарея -› Оптимизация. Это отличается от того, что вы предлагаете? Также мое приложение является приложением для администрирования устройства, в документации говорится, что эти типы приложений не подпадают под действие Doze. - person turtleboy; 30.01.2018
comment
На каких мобильных устройствах вы это пробуете? - person Aditya; 30.01.2018
comment
И я просто хочу перепроверить, добавили ли вы REQUEST_IGNORE_BATTERY_OPTIMIZATIONS разрешение в свое приложение. - person Aditya; 30.01.2018
comment
Я тестировал его на S6, S7 и Samsung Xcover3. Все под управлением Android 6+ - person turtleboy; 30.01.2018
comment
Нет, я не добавил разрешение в приложение, так как я явно добавил приложение в белый список через пользовательский интерфейс приложения настроек. Я могу добавить его, но это будет позже, когда я вернусь домой. - person turtleboy; 30.01.2018
comment
Я редактировал сообщение с помощью [EDIT2]. Я пробовал то, что вы предлагаете, но он по-прежнему не получает толчков в режиме Doze - person turtleboy; 30.01.2018
comment
Теперь это серьезная проблема. Вы добавили разрешение в AndroidManifest.xml, показали системный диалог для внесения приложения в белый список, не выходя из приложения, но по-прежнему не работающего. Вы пробовали управлять автозапуском? - person Aditya; 30.01.2018
comment
Нет, что такое управление автозапуском и что вы хотите, чтобы я попробовал? - person turtleboy; 30.01.2018
comment
Я только что протестировал на своем телефоне другое приложение, на которое могу отправлять запросы. Я использовал adb, чтобы заставить Doze, и отправил push. Все прошло нормально. Это приложение не является приложением для администрирования устройства и не имеет встроенного SDK Samsung Knox. Думаю, мне, возможно, придется спросить разработчиков Samsung, в чем проблема. Существует API Knox для внесения Doze в белый список, но он только из knox 5.7, а у моих клиентов 5.5. Я попробую управление автозапуском, если вы думаете, это может помочь? - person turtleboy; 30.01.2018
comment
Мне просто нужно знать, что ты хочешь, чтобы я с ней сделал? - person turtleboy; 30.01.2018
comment
Также есть разница между двумя приложениями. Приложение администратора устройства было перенесено с GCM на Firebase, тогда как другое приложение, которое я только что протестировал, по-прежнему использует GCM для доставки push-уведомлений. Так что это может быть проблема, с которой мне может помочь Samsung, или проблема с GCM / FCM. - person turtleboy; 30.01.2018
comment
Я продвинулся немного дальше в [EDIT3]. похоже, это может быть проблема на стороне сервера. Есть ли у вас образец кода, на который я мог бы ссылаться на свой код при отправке push-информации в конечную точку fcm? - person turtleboy; 30.01.2018
comment
[EDIT3] недействителен из-за комментария EugenPechanec выше. - person turtleboy; 30.01.2018
comment
Да, он прав, я мало что знаю о серверной части. - person Aditya; 30.01.2018
comment
Позвольте нам продолжить это обсуждение в чате. - person Aditya; 30.01.2018
comment
Я опубликовал EDIT4 с дальнейшим тестированием - person turtleboy; 30.01.2018
comment
Если вы не хотите открывать приложение при получении push-уведомления. Тогда в чем проблема сейчас? - person Aditya; 31.01.2018
comment
Проблема в том, что когда моя система отправляет толчок во время дремоты, никакого толчка не происходит, пока устройство не выйдет из дремоты. Я не хочу генерации уведомлений, я хочу, чтобы onReceiveMessage обрабатывал данные молча, без вмешательства пользователя. в конце концов, это приложение для администратора устройства. Когда я отправляю push-данные непосредственно с консоли firebase, устройство обрабатывает push-данные в onMessagereceived только тогда, когда приложение находится на переднем плане, а не в BG. Итак, мне нужно знать, почему консоль может связаться с устройством, когда находится в режиме Doze, а моя система не может, и почему ничто не может связаться с ним, когда в BG. - person turtleboy; 31.01.2018
comment
поэтому мне нужен толчок, когда я в Doze, и onMessageReived обрабатывает данные в BG - person turtleboy; 31.01.2018

Похоже, что невозможно сделать высокий приоритет при отправке только поля данных без уведомления. Вот цитата из документации :

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

person Wojtek    schedule 04.09.2018
comment
Можно ли показывать уведомление с высоким приоритетом при получении FCM с высоким приоритетом. - person Prasanna Anbazhagan; 26.10.2018
comment
Как обычно, Google предполагает, что всем нам нужен их вариант использования по умолчанию. Ни у кого не может быть чувствительного к безопасности приложения, в котором уведомление о данных может стереть пользовательские данные ... или спасти жизнь, получив сигнал GPS. -.- - person milosmns; 10.01.2020
comment
привет, дружище, можем ли мы избежать потери приоритетов? - person famfamfam; 10.03.2021

Установка time_to_live на 0 решила проблему для меня.

Я думаю, это потому, что очень маленький time_to_live сообщит FCM, что это сообщение стоит доставить только сейчас. Поэтому, пытаясь доставить его как можно скорее, он проигнорирует оптимизацию батареи, такую ​​как «резервные сегменты приложений» Android P. Однако будьте осторожны, поскольку установка небольшого значения time_to_live в некоторых случаях может означать, что уведомление не доставляется вообще. Я не думаю, что вам следует применять его ко всем видам push-уведомлений.

Дополнительные сведения о time_to_live: https://firebase.google.com/docs/cloud-messaging/concept-options#setting-the-priority-of-a-message

person user11567387    schedule 28.05.2019
comment
это решение для вас, а не для всех, я так думаю, вы тестировали много устройств? - person famfamfam; 09.03.2021

Вместо использования "android": {"priority": "high"} используйте следующее

    {
      "time_to_live": 300000,
      "delay_while_idle": false,
      "data": {
               "message": "PING_DEVICE",
               "time": "21/01/2018 16:20:28",
               "pushguid": "10062"
               },
      "priority": "high"  
}
person imodeGowas    schedule 12.07.2019

Всем спасибо за ответы. мы наконец разобрались.

Мы вошли в консоль firebase и поняли, что из-за возраста кода мы не использовали файл настроек / конфигурации, который создается в консоли. извините, я забыл его название. в этом файле есть настройки и т. д., которые используются при отправке push-уведомлений в Google. как только мы использовали файл в наших запросах, мое приложение может разбудить телефон в дремоте.

Благодарность

person turtleboy    schedule 08.01.2020
comment
привет, я не нашел ничего похожего на то, что ты сказал в консоли fcm, можешь помочь? - person famfamfam; 10.03.2021
comment
google-services.json? - person BabyishTank; 04.06.2021