Ajax не удалось зарегистрировать это устройство для получения push-уведомлений huawei

Обновлено: 20.11.2024

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

Реальное поведение

Всякий раз, когда после того, как приложение было закрыто, получено беззвучное push-уведомление, оно принудительно запускается в фоновом режиме, но не выполняет запрос API через Ajax до тех пор, пока приложение не откроется на переднем плане.

Воспроизведение сценария (включая, помимо прочего)

  1. Отправить автоматический push-уведомление с принудительным запуском: "1" и доступным содержимым: "1".
  2. В обратном вызове уведомления попробуйте сделать запрос, который сохраняет что-то в вашей серверной базе данных.
  3. Проверьте, сохраняется ли какое-либо значение во время принудительного запуска приложения в фоновом режиме. (в моем случае это не так)
  4. Проверьте, сохраняется ли какое-либо значение, когда приложение открывается из фона на передний план. (в моем случае это так)

Платформа и версия (например, Android 5.0 или iOS 9.2.1)

Android 7.0 (для Huawei)
Android 6.0.1 (для One Plus Two)

(Android) Поставщик устройства (например, Samsung, HTC, Sony. )

Huawei Ascend P10 (я убедился, что это не "защищенное приложение")
One Plus Two

Версия Cordova CLI и версия платформы Cordova

Версия Cordova: 6.5.0
Версия Cordova для Android: 6.1.2

Версия плагина

Пример полезной нагрузки push-данных

Пример кода, иллюстрирующий проблему

Журналы, снятые при воспроизведении проблемы

Текст был успешно обновлен, но возникли следующие ошибки:

прокомментировал tom-kraak 22 ноября 2017 г.

@macdonst Я только что проверил его с последней версией v1.x (1.10.5), но она дает те же результаты, что и 1.9.0.
Насколько я читал, версии 2.x используют Firebase в качестве службы, которой в настоящее время нет в моей серверной части (я использую GCM).

прокомментировал tom-kraak 27 ноября 2017 г. •

@macdonst Я переключил серверную службу на работу с Firebase и реализовал версию 2.0.0 в приложении с помощью google-services.json. Я только что проверил это, точно такое же поведение все еще происходит. Приложение по-прежнему открывается в фоновом режиме с «черным экраном», как будто веб-просмотр вообще не выполняется.

Я не могу переключиться на более новую версию плагина, потому что сборка Phonegap еще не поддерживает более позднюю версию Cordova.

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

прокомментировал tom-kraak 18 декабря 2017 г.

@macdonst Только что протестировал код на iOS. Очень похожее поведение.

Тихая отправка в iOS работает, когда:

  1. Приложение открыто на переднем плане;
  2. Приложение открыто в фоновом режиме.

Тихая отправка в iOS не работает в следующих случаях:
3. Приложение принудительно закрыто;

Полезная нагрузка для iOS выглядит следующим образом:
< "aps": < "content-available": 1, "additionalData": < "id": 4 >>, "notId": 1513611593 >
У меня такое ощущение, что «обратный вызов готовности устройства» не вызывается и в iOS, если приложение было принудительно закрыто (как и в Android).

Это также очень важная часть приложения, над которым я работаю для клиента, и я хотел бы дать ему оценку. Не могли бы вы дать какие-либо оценки, когда вы планируете повторно протестировать и, возможно, решить проблему?

С нетерпением жду вашего ответа.

ДаДэнни прокомментировал 29 января 2018 г.

@tom-kraak Вам удалось решить эту проблему?

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

Комментарий

устаревшего бота прокомментирован 3 июня 2018 г.

Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время с ней не было никаких действий. Он будет закрыт, если никакой дальнейшей активности не произойдет. Спасибо за ваш вклад.

Файзан Ахмад спрашивает: Не удается получить уведомления на устройствах Huawei с помощью HmsMessageService (набор уведомлений HMS)
Я использую набор уведомлений HMS для получения уведомлений. Уведомления работали нормально около 1 недели назад, но теперь, когда я повторно запускаю этот код, он не работает. Я перекрестно проверил все вещи, но не смог ничего найти. Зависимость, которую я использую:

Я также добавил в свой проект файл agconnect-services.json. Также добавлен идентификатор приложения в манифесте. Ключ SHA-256 тоже подойдет.

Код для получения уведомлений:

Я также добавил тег этой службы в файл манифеста.

Я также пытался использовать инструментарий HMS (помощник по кодированию в Android Studio), отправка уведомлений оттуда прошла успешно, но я не получаю их в приложении.

Сообщения без ответов

[Решено] Создание некластеризованного индекса на сервере sql в большой таблице

  • Нарендра
  • 5 минут назад
  • Ответов: 0

Нарендра спрашивает: Создание некластеризованного индекса на сервере sql в большой таблице
Таблица содержит 180 миллионов записей. Имеет первичный ключ (WExtractGrouping, Id, PEventId, CAId, TEventId, EventDate). Никаких других индексов, кроме кластеризованного индекса на pk.

Запрос выполняется уже 7 часов. При запуске exec sp_who2 отображается статус RUNNABLE CPUTime — 210641 DiskIO — 21840949 Command — CREATE INDEX.

При другом запуске отображается статус SUSPENDED CPUTime - 210641 DiskIO - 21840949 Command - CREATE INDEX

Я вижу, что diskIO и CPU со временем увеличиваются. Есть ли какие-либо проблемы, или они ожидаются. Почему это будет приостановлено? Сколько времени это занимает. Как лучше всего создать этот индекс?

[Решено] Не удается установить tensorflow-macos из conda miniforge?

  • Идет дождь
  • 14 минут назад
  • Ответов: 0

Rainning спрашивает: Не удается установить tensorflow-macos из conda miniforge?
В качестве заголовка я использую pyenv для установки miniforge3 и пытаюсь использовать его для создания виртуальной среды с tensorflow-macos. package, который можно найти на сайте pypi. Я пробовал три разные версии Python 3.8.12, 3.9.10, 3.10.2 и получил .condarc следующим образом:

ошибка все та же:

Кто-нибудь может объяснить, почему пакет tensorflow-macos можно найти на pypi, но я все еще не могу установить его с помощью conda с добавленным каналом pypi?

[Решено] Как я могу получить доступ к аргументам с другой страницы во Flutter — Getx

  • регенин
  • 14 минут назад
  • Ответов: 0

regenin спрашивает: Как я могу получить доступ к аргументам с другой страницы во Flutter — Getx
Я пытаюсь написать код для межстраничного объявления, моя цель — перейти к выбранному страницу, когда объявление закрыто.

Но для метода "onAdDismissedFullScreenContent" мне нужно получить значение "int index", созданное в построителе.

Вкратце, мне нужно получить этот индекс конструктора для использования в контроллере рекламы: var freeGames = freeGameTypeController.freeGames[index];

Контроллер рекламы

Страница конструктора

[Решено] Как разделить строку и превратить ее в переменную

  • Гигабайт
  • 14 минут назад
  • Ответов: 0

Gigabyte спрашивает: Как я могу разделить строку и превратить ее в переменную
По сути, я хочу разделить строку, а затем превратить каждую отдельную строку в переменную.

Например: если у меня есть строка x = "2 4 6 8", как я могу преобразовать ее в это: a = 2 b = 4 c = 6 d = 8

[Решено] Как перенаправить запрос на другой оставшийся контроллер с помощью Spring Reactive и WebFlux

  • дасколаги
  • 14 минут назад
  • Ответов: 0

dascolagi спрашивает: Как перенаправить запрос на другой контроллер Rest с помощью Spring Reactive и WebFlux
Я пытаюсь перенаправить запрос на другую внутреннюю конечную точку из WebFlux RestContoller.

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

С Spring Servlet я бы сделал что-то вроде:

[Решено] XBRL: как вы объединяете строки из разных документов?

  • ДебД
  • 14 минут назад
  • Ответов: 0

DebD спрашивает: XBRL: как вы объединяете строки из разных документов?
Мы используем процессор XBRL для получения файлов из SEC. Часто компания объявляет метрику в разных документах с разными концепциями — с точно совпадающими значениями или без них — но при этом они должны рассматриваться как одна и та же финансовая метрика. По сути, когда вы хотите создать объединенное представление всех документов, эти числа должны отображаться в одной строке. Я бы привел пример, чтобы было понятно:

В отчете ASGN 10-K за 2020 г. для отчета EBT используется метод us-gaap:IncomeLossFromContinuingOperationsBeforeIncomeTaxesMinorityInterestAndIncomeLossFromEquityMethodInvestments.

В отчете ASGN 10-K за 2021 г. для отчета EBT используется метод us-gaap:IncomeLossFromContinuingOperationsBeforeIncomeTaxesExtraordinaryItemsNoncontrollingInterest.

Если вы заметили, даже данные за 2020 и 2019 годы не совпадают между двумя заявками.Мой вопрос: как вы согласовываете эти случаи в коде, чтобы создать сшитое/непрерывное представление? Это решенная проблема или это скорее процесс, в котором вам нужно вмешиваться вручную? Существуют ли библиотеки, которые помогают в этом? Есть ли картографическая информация, доступная в SEC, которую можно использовать, даже если данные не согласуются? Было бы здорово, если бы кто-нибудь мог помочь с этим. Спасибо.

[Решено] изменить файл json с динамическим параметром

  • савсан намаз
  • 14 минут назад
  • Ответов: 0

sawsan salah Спрашивает: редактировать json-файл с динамическим параметром
Здравствуйте, я новичок в Jenkins. У меня конвейер CI во время сборки разных этапов prod, dev, stage json файл нужно изменить с помощью URL, мне нужно сделать его динамическим, что означает, что мне нужно передать среду в файл file.json, чтобы он зафиксировал его и построил

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

[Решено] Powershell Если пароль неверный, повторите запрос пароля

  • G.Baysec
  • 14 минут назад
  • Ответов: 0

G.Baysec спрашивает: Powershell Если пароль неверен, повторите запрос пароля
У меня есть сценарий, который изменит все пароли локальных администраторов с помощью приведенного ниже сценария. Скрипт запросит пароль для каждого сервера. (у всех серверов разные пароли) Я хочу повторно запрашивать экран учетных данных, если пользователь вводит неправильный пароль, но я не могу с этим справиться.

Я получил эту ошибку при запуске скрипта:

Если я использую правильный пароль, скрипт работает нормально.

[Решено] Как создать поиск пути для 3D-игры с простыми типами данных

  • FRNathan13
  • 14 минут назад
  • Ответов: 0

FRNathan13 спрашивает: Как создать поиск пути для 3D-игры с простыми типами данных
Я работаю над сценариями семинара (система псевдомоддинга на стороне сервера) для Overwatch, но, к сожалению, blizzad функции поиска пути не были представлены в мастерской.

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

Мастерская Overwatch поддерживает только:

  • Число
  • логическое значение
  • Строки/локализованные строки
  • Одномерный (плоский) массив.

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

Также я попробовал применить A*, Dijkstra (один из самых медленных), основанный на графике и соединении.

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

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

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

Еще одна функция – рейкаст (попадание в положение и переход в нормальное состояние), но то же условие, что и выше, зацикливание каждого тика сервера (60 Гц) приведет к быстрому сбою сервера (особенно, когда несколько функций вызывают этот рейкаст).

Я действительно не знаю, что еще можно реализовать, я попробовал все, что знал.

Вот несколько примеров:

Ответ

Ответ

Ответ

Ответ

Ответ

Ответ

Ответ

Ответ

Ответ

Ответ

Ответ

Ответ

Ответ

Ответ

В настройках профиля вы можете указать URL-адрес обратного вызова..
Для положительных действий, таких как отправка push-уведомлений или регистрация новых устройств, код ответа JSON отправляется на этот URL-адрес через POST с параметром json . С помощью этой функции у вас есть возможность создавать автоматы в вашей собственной системе или сопоставлять зарегистрированное устройство с учетной записью.

Код ответа для отправки push-уведомлений

Код ответа для регистрации нового устройства

Код ответа для удаления устройства

Код ответа для отправки ответов

(БЕТА) Благодаря отслеживанию местоположения (Android, iOS и Windows 10 с версией Cient-APP >=2.3.1) у вас есть возможность отслеживать местоположение устройства с каждым отправленным push-уведомлением. Для этого должны быть приняты необходимые разрешения. Если местоположение было отправлено правильно и не старше 24 часов, оно будет отображаться в виде нового значка в клиентском приложении и может быть прочитано в ответе Read API!

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

Разрешения iOS

  • Расположение = всегда
  • Движение и фитнес. Используется для определения того, движется ли устройство. Только когда устройство движется - местоположения передаются (защита батареи)
  • Фоновое обновление приложения и мобильные данные. Если эта функция активирована, данные о местоположении могут передаваться, когда приложение находится в фоновом режиме.

Разрешения Android

Отдельное разрешение для Android >=8

С введением категорий уведомлений (каналов) в Android 8 необходимо активировать канал службы синхронизации. Это необходимо, чтобы приложение оставалось открытым в фоновом режиме, только так можно отслеживать и передавать местоположение.

Разрешения Windows 10
Отслеживание местоположения в Windows 10 требует следующих разрешений: Местоположение и фоновые приложения

Если брандмауэр запретил доступ, разрешите этот IP-адрес!

Используйте параметры для настройки вашего push-уведомления, нажмите на оранжевый параметр, чтобы получить более подробное описание:

k = закрытый ключ или псевдоним *

Идентификатор одного устройства или идентификатор группы устройств или все устройства

d=a = все устройства
d=gs23 = группа устройств
d=52 = одно устройство

s = звук пустой = устройство по умолчанию или число от 0 до 62

v = вибрация пуста = устройство по умолчанию или число от 1 до 3

(только iOS и Android)

i = Icon Standard = 1 или число от 1 до 181

c = Стандартный цвет значка = Пусто

(только Android > 5.0, Windows 10 и клиентское приложение)

Цвет светодиодного уведомления
(только для Android, для устройства требуется светодиод RGB)

ut = Название URL ut="Открыть ссылку"

Открывать другие приложения с помощью push-уведомлений, используя
схемы URL-адресов

p = URL-адрес данных изображения со строкой в ​​кодировке Base64
p2 = URL-адрес данных изображения 2 со строкой в ​​кодировке Base64
p3 = URL-адрес данных изображения 3 со строкой в ​​кодировке Base64

данные:изображение/gif;base64,R0l. BOw==
данные:изображение/jpeg;base64,C4s. Cc1==
data:image/png;base64,G0G. h5r==

is = Размер изображения меньшее изображение = более быстрое время загрузки

0 = 1024 пикс.
1 = 768 пикс.
2 = 512 пикс.
3 = 256 пикс.

l = время жизни Целое число 0-43200: время в минутах,

после автоматического удаления сообщения.

-2 = самый низкий приоритет

-1 = более низкий приоритет

0 = обычный приоритет

1 = высокий приоритет

Целое число 60–10800 (с шагом 60 с): время в секундах, после которого сообщение должно быть отправлено повторно.

Целое число 60–10800: время в секундах, после которого повторная попытка/повторная отправка должны прекратиться.

1 = Ответ возможен
0 = Ответ невозможен.

предопределенные варианты ответов, разделенные вертикальной чертой, например. Да|Нет|Возможно

Целое число 10–10800 (с шагом 10 с) Время в секундах, по истечении которого сообщение должно быть отправлено снова, прежде чем оно будет подтверждено.

g = GIPHY Код GIF, т.е. 8dMU9pN4pGwEfVpdY4

макс. размер всех параметров POST = 8192 КБ

Сообщение можно отформатировать с помощью BBCode . Форматирование может отображаться только в клиентских приложениях, но не в самих Push-уведомлениях. Принимаются следующие коды BBCode:

Значения в скобках относятся к Windows 10 (UWP)

пусто = Устройство по умолчанию
0 = Без звука
1 = Кхм (мгновенное сообщение)
2 = Аплодисменты (почта)
3 = Стрелка (напоминание)
4 = Ребенок (SMS)
5 = Звонок (Будильник)
6 = Велосипед (Будильник2)
7 = Боинг (Будильник3)
8 = Зуммер (Будильник4)
9 = Камера (Тревога5)
10 = Звуковой сигнал автомобиля (Тревога6)
11 = Кассовый аппарат (Тревога7)
12 = Звонок (Тревога8)
13 = Скрип двери (Тревога9)
14 = Часы с кукушкой (Будильник10)
15 = Отключить (Вызов)
16 = Собака (Вызов2)
17 = Дверной звонок (Вызов3)
18 = Фанфары (Вызов4)
19 = Выстрел из пистолета (Вызов5)
20 = Гудок (Вызов6)
21 = Челюстная арфа (Вызов7)
22 = Морзе (Вызов8)
23 = Электричество (Вызов9)
24 = Радиотюнер (Call10)
25 = Сирены
26 = Военные трубы
27 = НЛО
28 = Whah Whah Whah
29 = Мужчина говорит До свидания
30 = Мужчина говорит "Привет"
31 = Мужчина говорит "Нет"
32 = Мужчина говорит "Хорошо"
33 = Мужчина говорит "У-у-у"
34 = Мужчина говорит "Предупреждение"
35 = Мужчина приветствует
36 = ​​Мужчина Са Инь Да
37 = Мужчина говорит «да»
38 = Короткий звуковой сигнал
39 = Короткий «уииии»
40 = Короткий всплеск
41 = Короткий щелчок пальцем по стеклу
/>42 = Wa Wa Waaaa короткая
43 = Laser короткая
44 = Wind Chime короткая
45 = Echo короткая
46 = Zipper короткая
47 = HiHat короткая < br />48 = Сигнал 2 короткий
49 = Звук 3 короткий
50 = Звук 4 короткий
51 = Сигнализация поставлена ​​на охрану
52 = Сигнализация снята с охраны
53 = Резервное копирование готово
54 = Дверь закрыта
55 = Дверь открыта
56 = Окно закрыто
57 = Окно открыто
58 = Свет выключен
59 = Свет включен
60 = Звонок в дверь
61 = Пейджер короткий
62 = Пейджер длинный

Предназначен только для использования вместе с Pushsafer, вы можете скачать все звуки здесь!

= 1 = 2 = 3 = 4 = 5 = 6 = 7 = 8 = 9 = 10 = 11 = 12 = 13 = 14 = 15 = 16 = 17 = 18 = 19 = 20 = 21 = 22 = 23 = 24 = 25 = 26 = 27 = 28 = 29 = 30 = 31 = 32 = 33 = 34 = 35 = 36 = 37 = 38 = 39 = 40 = 41 = 42 = 43 = 44 = 45 = 46 = 47 = 48 = 49 = 50 = 51 = 52 = 53 = 54 = 55 = 56 = 57 = 58 = 59 = 60 = 61 = 62 = 63 = 64 = 65 = 66 = 67 = 68 = 69 = 70 = 71 = 72 = 73 = 74 = 75 = 76 = 77 = 78 = 79 = 80 = 81 = 82 = 83 = 84 = 85 = 86 = 87 = 88 = 89 = 90 = 91 = 92 = 93 = 94 = 95 = 96 = 97 = 98 = 99 = 100 = 101 = 102 = 103 = 104 = 105 = 106 = 107 = 108 = 109 = 110 = 111 = 112 = 113 = 114 = 115 = 116 = 117 = 118 = 119 = 120 = 121 = 122 = 123 = 124 = 125 = 126 = 127 = 128 = 129 = 130 = 131 = 132 = 133 = 134 = 135 = 136 = 137 = 138 = 139 = 140 = 141 = 142 = 143 = 144 = 145 = 146 = 147 = 148 = 149 = 150 = 151 = 152 = 153 = 154 = 155 = 156 = 157 = 158 = 159 = 160 = 161 = 162 = 163 = 164 = 165 = 166 = 167 = 168 = 169 = 170 = 171 = 172 = 173 = 174 = 175 = 176 = 177 = 178 = 179 = 180 = 181

Предназначен только для использования вместе с Pushsafer, все значки можно скачать здесь!

Если вы только начинаете и хотите пока сосредоточиться на внешнем интерфейсе, вы можете пропустить этот шаг и просто использовать инструмент push-уведомлений Expo для отправки уведомлений одним нажатием кнопки.

Наряду с модулем expo-notifications, который предоставляет все функции на стороне клиента для push-уведомлений, Expo также может обрабатывать отправку этих уведомлений в APN и FCM для вас! Все, что вам нужно сделать, это отправить запрос на наши серверы с ExpoPushToken, который вы получили на последнем шаге.

Если вы предпочитаете создавать сервер, напрямую взаимодействующий с APN и FCM, ознакомьтесь с этим руководством (это сложнее, чем использование службы push-уведомлений Expo).

    для Node.js. Поддерживается командой Экспо. для Питона. Поддерживается разработчиками сообщества. для Руби. Поддерживается разработчиками сообщества. для ржавчины. Поддерживается разработчиками сообщества. для Симфони. Поддерживается SolveCrew. или expo-server-sdk-php для PHP. Поддерживается разработчиками сообщества. для Голанга. Поддерживается разработчиками сообщества. для Эликсира. Поддерживается разработчиками сообщества. для дотнета. Поддерживается разработчиками сообщества. для Явы. Поддерживается разработчиками сообщества.

Если вы не проводите тестирование в приложении Expo Go, убедитесь, что вы создали правильные учетные данные для push-уведомлений, прежде чем продолжить! В противном случае push-уведомления работать не будут.

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

При одновременной отправке большого количества push-уведомлений ограничьте количество одновременных подключений. Node SDK реализует это за вас и открывает максимум шесть одновременных подключений. Это сглаживает пиковую нагрузку и помогает службе push-уведомлений Expo успешно получать ваши push-уведомления.

Первым этапом отправки push-уведомлений является их доставка в службу push-уведомлений Expo, которая внутренне добавляет их в очередь для доставки в Apple (APN), Google (FCM) или других поставщиков push-уведомлений. Этот первый шаг может завершиться ошибкой по нескольким причинам: сетевые проблемы между вашим сервером и службой push-уведомлений Expo, сбой или снижение доступности службы уведомлений Expo, неправильная настройка учетных данных push-уведомлений или недопустимая полезная нагрузка уведомлений.

Служба push-уведомлений Expo отвечает push-тикетами после успешного получения уведомлений. Пуш-тикет указывает, что Expo получила полезную нагрузку уведомления, но, возможно, еще не отправила ее. Каждый push-тикет содержит идентификатор билета, который вы позже используете для поиска push-квитанции. Пуш-уведомление доступно после того, как Expo попытается доставить уведомление в APN, FCM и т. д., и сообщит вам об успешной доставке поставщику push-уведомлений.

Вы должны проверить свои push-уведомления. Если есть проблема с доставкой push-уведомлений, push-уведомления — лучший способ получить информацию об основной причине. Квитанции могут указывать на проблему с APN или FCM, службой push-уведомлений Expo или полезной нагрузкой уведомлений.

Уведомления о push-уведомлениях также могут сообщить вам, отписалось ли устройство-получатель от уведомлений (например, отозвав разрешения на уведомления или удалив ваше приложение), если поставщик push-уведомлений, такой как APNs или FCM, отвечает с этой информацией. Пуш-уведомление будет содержать поле Details → error, для которого установлено значение DeviceNotRegistered . В этом случае прекратите отправку уведомлений на push-токен этого устройства, пока он не перерегистрируется на вашем сервере, чтобы ваше приложение оставалось добросовестным гражданином. Ошибка DeviceNotRegistered появляется в push-уведомлениях только тогда, когда Apple, Google или другой поставщик push-уведомлений считает, что устройство не зарегистрировано; это занимает неопределенное количество времени и часто невозможно проверить, удалив приложение и отправив push-уведомление вскоре после этого.

Мы рекомендуем проверять push-уведомления через 15 минут после отправки push-уведомлений. В то время как push-уведомления часто доступны гораздо раньше, 15-минутное окно дает службе push-уведомлений Expo достаточно времени, чтобы сделать квитанции доступными для вас. Если через 15 минут push-уведомление не приходит, это, вероятно, указывает на ошибку службы push-уведомлений Expo. Наконец, push-уведомления удаляются через 24 часа.

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

Это push-уведомление "hello world" с использованием cURL, которое вы можете отправить с помощью интерфейса командной строки (замените push-токен-заполнитель своим собственным):

Тело запроса должно быть в формате JSON. Это может быть либо один объект сообщения (пример выше), либо массив из 100 объектов сообщений, если все они относятся к одному и тому же проекту (см. ниже). Мы рекомендуем использовать массив, если вы хотите отправить несколько сообщений, чтобы эффективно свести к минимуму количество запросов, которые вам нужно сделать на серверах Expo. Вот пример тела запроса, который отправляет четыре сообщения:

Сервер Expo также может принимать тела запросов, сжатые с помощью gzip. Это может значительно уменьшить пропускную способность загрузки, необходимую для отправки большого количества уведомлений. Node Expo Server SDK автоматически сжимает запросы для вас и автоматически регулирует ваши запросы, чтобы сгладить нагрузку, поэтому мы настоятельно рекомендуем его!

Вышеупомянутые запросы будут отвечать объектом JSON с двумя необязательными полями, данными и ошибками . data будет содержать массив push-тикетов в том же порядке, в котором были отправлены сообщения (или один объект push-тикета, если вы отправляете одно сообщение одному получателю). Каждый тикет включает поле статуса, которое указывает, успешно ли Expo получило уведомление, и, в случае успеха, поле идентификатора, которое можно использовать для последующего получения push-уведомления.

Примечание: статус ok вместе с идентификатором квитанции означает, что сообщение было получено серверами Expo, а не пользователем (для этого вам нужно будет проверить push-квитанцию).

Если были ошибки с отдельными сообщениями, а не со всем запросом, соответствующие push-заявки неверных сообщений будут иметь статус ошибки и поля, описывающие ошибку, например:

После получения пакета уведомлений Expo ставит каждое уведомление в очередь для доставки в службы push-уведомлений iOS и Android (APN и FCM соответственно). Большинство уведомлений обычно доставляются в течение нескольких секунд. Иногда доставка уведомлений может занять больше времени, особенно если службам push-уведомлений iOS или Android требуется больше времени, чем обычно, для получения и доставки уведомлений или если облачная инфраструктура Expo находится под высокой нагрузкой.

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

Тело ответа для push-уведомлений очень похоже на push-тикеты; это объект JSON с двумя необязательными полями, данными и ошибками. data содержит сопоставление идентификаторов квитанций с квитанциями. Квитанции включают поле состояния и два необязательных поля сообщения и сведений (в случае, когда «статус»: «ошибка» ). Если для запрошенного идентификатора квитанции нет push-уведомления, сопоставление не будет содержать этот идентификатор. Вот как выглядит успешный ответ на указанный выше запрос:

Вы должны проверять каждую push-уведомление, так как они могут содержать информацию об ошибках, которые необходимо устранить. Например, если устройство больше не имеет права на получение уведомлений, документация Apple просит вас прекратить отправку уведомлений на это устройство. Уведомления об этих ошибках будут содержать информацию об этих ошибках.

Примечание. Даже если в статусе квитанции указано "ОК", это не гарантирует, что устройство получило сообщение. «ОК» в push-уведомлении означает, что служба push-уведомлений Android или iOS успешно получила уведомление. Например, если устройство-получатель выключено, служба push-уведомлений iOS или Android попытается доставить сообщение, но устройство не обязательно его получит.

Expo предоставляет подробную информацию обо всех ошибках, возникающих в течение всего этого процесса. Ниже мы рассмотрим некоторые из наиболее распространенных ошибок, чтобы вы могли реализовать логику для их автоматической обработки на своем сервере. Если по какой-либо причине Expo не может доставить сообщение в службу push-уведомлений Android или iOS, детали push-уведомления могут также включать информацию, относящуюся к конкретной службе. Это полезно в основном для отладки и сообщения о возможных ошибках в Expo.

В push-тикетах и ​​push-уведомлениях найдите объект сведений с полем ошибки. Если он присутствует, это может быть одно из следующих значений, и вы должны обрабатывать эти ошибки следующим образом:

  • DeviceNotRegistered: устройство больше не может получать push-уведомления, и вам следует прекратить отправку сообщений на соответствующий push-токен Expo.

DeviceNotRegistered: устройство больше не может получать push-уведомления, и вам следует прекратить отправку сообщений на соответствующий push-токен Expo.

MessageTooBig : общая полезная нагрузка уведомления была слишком большой. На Android и iOS общая полезная нагрузка не должна превышать 4096 байт.

MessageRateExceeded: вы слишком часто отправляете сообщения на данное устройство. Внедрите экспоненциальную отсрочку и медленно повторяйте отправку сообщений.

MismatchSenderId: возникла проблема с вашими учетными данными для отправки FCM. Учетные данные FCM push состоят из двух частей: вашего ключа сервера FCM и файла google-services.json. Оба должны быть связаны с одним и тем же идентификатором отправителя. Вы можете найти свой идентификатор отправителя там же, где и ключ сервера. Убедитесь, что ключ сервера совпадает с ключом, полученным при запуске expo push:android:show , и что идентификатор отправителя совпадает с идентификатором в файле google-services.json вашего проекта (в project_number ).

InvalidCredentials : ваши учетные данные для push-уведомлений для вашего автономного приложения недействительны (например, вы могли их отозвать). Запустите expo build:ios -c, чтобы повторно сгенерировать новые учетные данные push-уведомлений для iOS. Если вы отзовете ключ APN, все приложения, использующие этот ключ, больше не смогут отправлять или получать push-уведомления, пока вы не загрузите новый ключ для его замены. Загрузка нового ключа APN не изменит токенов Expo Push ваших пользователей.

  • Иногда эти ошибки будут содержать дополнительную информацию об ошибке InvalidProviderToken. На самом деле это связано как с вашим ключом APN, так и с вашим профилем обеспечения. Чтобы устранить эту ошибку, вам следует перестроить приложение и повторно создать новый ключ push-уведомлений и профиль подготовки.

Примечание. Чтобы лучше понять учетные данные iOS, в том числе учетные данные для push-уведомлений, прочитайте нашу документацию по подписыванию приложений

Если возникла ошибка со всем запросом push-тикетов или push-уведомлений, объект ошибок может иметь одно из следующих значений, и вы должны обрабатывать эти ошибки следующим образом:

PUSH_TOO_MANY_EXPERIENCE_IDS : вы пытаетесь отправить push-уведомления в различные интерфейсы Expo, например @username/projectAAA и @username/projectBBB . Проверьте поле сведений, чтобы найти сопоставление имен опыта с соответствующими им push-токенами из запроса и удалить все из другого опыта.

PUSH_TOO_MANY_NOTIFICATIONS: вы пытаетесь отправить более 100 push-уведомлений в одном запросе. Убедитесь, что вы отправляете только 100 (или меньше) уведомлений в каждом запросе.

PUSH_TOO_MANY_RECEIPTS: вы пытаетесь получить более 1000 push-уведомлений за один запрос. Убедитесь, что вы отправляете только массив из 1000 (или менее) строк идентификаторов билетов, чтобы получить push-уведомления.

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

По умолчанию вы можете отправить уведомление своим пользователям, отправив их токен Expo Push Token и любой текст или дополнительные данные, необходимые для сообщения. Это легко настроить, но в случае утечки токенов злоумышленник сможет выдать себя за ваше приложение и отправить собственное сообщение вашим пользователям. У нас никогда не было сообщений об этом; однако, следуя передовым методам обеспечения безопасности, мы предлагаем использовать токен доступа вместе с токеном push в качестве дополнительного уровня безопасности.

Если вы используете expo-server-sdk-node, выполните обновление как минимум до версии 3.6.0 и передайте свой accessToken как параметр в конструкторе. В противном случае передайте заголовок «Авторизация»: «Bearer $» с любыми запросами к нашему push-API.

Любые запросы, отправленные без действительного токена доступа, после включения принудительной защиты, приведут к ошибке с кодом: UNAUTHORIZED .

< td>Только для iOS < td>Только для iOS
ПолеПлатформа?ТипОписание
в iOS и Android string | string[] Push-токен Expo или массив push-токенов Expo, указывающий получателей этого сообщения.
data iOS и Android Object Объект JSON, доставленный в ваше приложение. Это может быть до 4 КБ; общая полезная нагрузка уведомления, отправляемая в Apple и Google, должна быть не более 4 КБ, иначе вы получите сообщение об ошибке «Слишком большое сообщение».
title iOS & Android string Заголовок для отображения в уведомлении. Часто отображается над телом уведомления
body iOS и Android string Отображаемое сообщение в уведомлении.
ttl iOS и Android число Время жизни: число секунд, в течение которых сообщение может храниться для повторной доставки, если оно еще не было доставлено. По умолчанию используется значение undefined, чтобы использовать соответствующие значения по умолчанию для каждого поставщика (0 для iOS/APN и 2419200 (4 недели) для Android/FCM).
expiration iOS и Android число Временная метка с эпохи UNIX, указывающая, когда истекает срок действия сообщения. Тот же эффект, что и у ttl ( ttl имеет приоритет над истечением срока действия ).
priority iOS и Android 'default' | 'нормальный' | 'высокий' Приоритет доставки сообщения. Укажите «по умолчанию» или опустите это поле, чтобы использовать приоритет по умолчанию на каждой платформе («обычный» на Android и «высокий» на iOS).
subtitle string Подзаголовок для отображения в уведомлении под заголовком.
звук 'по умолчанию' | null Воспроизвести звук, когда получатель получит это уведомление. Укажите «по умолчанию», чтобы воспроизвести звук уведомления устройства по умолчанию, или опустите это поле, чтобы звук не воспроизводился. Пользовательские звуки не поддерживаются.
Значок Только для iOS номер Число для отображения в значок на значке приложения. Укажите ноль, чтобы очистить значок.
channelId Только для Android string ID уведомления Канал для отображения этого уведомления. Если идентификатор указан, но соответствующий канал не существует на устройстве (т. е. еще не создан вашим приложением), уведомление не будет отображаться для пользователя.
categoryId iOS & Android string ID категории уведомления, с которой связано это уведомление. Узнайте больше о категориях уведомлений здесь. Должен быть как минимум SDK 41 или чистый рабочий процесс.
mutableContent Только для iOS boolean Указывает, может ли это уведомление быть перехвачено клиентским приложением. В Expo Go по умолчанию установлено значение true , и если вы измените его на false, у вас могут возникнуть проблемы. В автономных и пустых приложениях по умолчанию используется значение false .

Примечание о сроке жизни . В Android мы делаем все возможное, чтобы сообщения с нулевым временем жизни доставлялись немедленно и не блокировались. Однако установка низкого значения TTL (например,ноль) может предотвратить попадание уведомлений с обычным приоритетом на устройства Android, находящиеся в спящем режиме. Чтобы гарантировать доставку уведомления, значение TTL должно быть достаточно большим, чтобы устройство могло выйти из спящего режима. Это поле имеет приоритет над сроком действия, если указаны оба.

Примечание о приоритете. В Android сообщения с обычным приоритетом не будут открывать сетевые подключения на спящих устройствах, и их доставка может быть отложена для экономии заряда батареи. Сообщения с высоким приоритетом доставляются немедленно, если это возможно, и могут разбудить спящие устройства для открытия сетевых подключений, потребляя энергию. В iOS сообщения с обычным приоритетом отправляются во время, учитывающее требования к питанию устройства, и могут группироваться и доставляться пакетами. Они ограничены и не могут быть доставлены Apple. Сообщения с высоким приоритетом отправляются немедленно. Обычный приоритет соответствует уровню приоритета APN 5, а высокий приоритет — 10.

Примечание относительно идентификатора канала: если оставить пустым, будет использоваться канал «по умолчанию», и Expo создаст канал на устройстве, если он еще не существует. Однако соблюдайте осторожность, так как канал "По умолчанию" предназначен для пользователей, и вы не сможете полностью удалить его.

Читайте также: