Kivy Android push-уведомления

Обновлено: 14.08.2022

Когда люди слышат о Kivy как о способе создания приложений для Android на Python, возникает естественный вопрос: что с ним можно сделать? Достаточно ли он производительен для игр, можете ли вы вызвать Android API, все ли приложения выглядят одинаково? Одним из лучших ресурсов для таких вопросов являются существующие приложения, и в этом посте я кратко расскажу о трех моих любимых. Это, очевидно, очень субъективно, но я сосредоточусь, в частности, на функциях, представляющих интерес с технической точки зрения, приложениях, которые выдвигают Kivy за пределы обычного, чтобы показать, на что он способен.

Если вас интересуют другие примеры, на вики Kivy есть довольно обширный (но далеко не исчерпывающий) список, включая победителей наших конкурсов по программированию и множество вкладов пользователей. Если вы хотите создавать свои собственные приложения на Python, попробуйте Kivy (который также работает в Windows, Linux, OS X и iOS) и python-for-android (который также может упаковывать приложения, отличные от Kivy Python).

Доска

Вы можете скачать Boardz здесь.

Я поставил Boardz на первое место, потому что это мое самое любимое приложение Kivy. На самом деле над ней еще ведутся работы (и на самом деле она давно не обновлялась), но уже сейчас это интересная игра, демонстрирующая впечатляющий потенциал производительности Kivy.

Домашний экран и игровой процесс Boardz

Главный экран Boardz (слева) и игровой процесс (справа). Черное кольцо справа — это круг ввода, управляющий позой всадника.

Boardz — это физическая игра о сноуборде. вы управляете своим сноубордистом, касаясь экрана, а затем перемещая палец относительно его исходного положения, чтобы контролировать свою осанку; быстрые движения перебрасывают ваш вес и могут заставить вас прыгать, вращаться или падать, в то время как простое изменение положения всадника помогает вам набирать скорость или преодолевать препятствия. Цель игры состоит в том, чтобы добраться до конца каждого этапа с различными препятствиями, включая склоны и прыжки, разрушающиеся конструкции, падающие камни или даже разнонаправленную гравитацию и ракетные ускорители. Вы можете потерпеть неудачу, если ваша голова столкнется с другим объектом со слишком большой силой или если вы просто застрянете и больше не сможете добраться до финиша.

Что сразу впечатляет, так это то, что все это работает так же хорошо, как игра на основе Python, работающая на смартфоне. Это достигается за счет использования игрового движка KivEnt, разработанного Джейкобом Ковачем, одним из основных разработчиков Kivy. Эта система на основе сущностей позволяет писать игровой код на Python, но внутренне оптимизирована для Cython, чрезвычайно эффективно использует OpenGL API Kivy, а также взаимодействует с популярным движком Chipmunk Physics.

Ошибка очистки Boardz и пример рекламы

Ошибка вытеснения Boardz из-за фатального столкновения (слева) и рекламы (справа).

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

Последняя техническая особенность, интересная разработчикам приложений Kivy, заключается в том, что Boardz включает интеграцию с рекламой. Независимо от того, что вы думаете о самих объявлениях, возможность их использования является основным запросом новых пользователей Kivy. Проблема здесь в том, что интеграция с обычным поставщиком рекламы обычно требует добавления Java-компонентов вашего приложения, что может быть не сразу очевидно, как это сделать из Python. На самом деле для этого в настоящее время существует ряд ресурсов, ключевым моментом которых является то, что python-for-android пытается упростить включение дополнительного кода Java, с которым вы можете взаимодействовать из Python с помощью Pyjnius. Реализация KivEnt, изображенная выше, является хорошей демонстрацией.

Когнитиво

Вы можете скачать Kognitivo здесь.

Kognitivo — это, пожалуй, самое совершенное приложение Kivy в магазине Play. Оно относительно сложное, широко настраиваемое и демонстрирует ряд приятных взаимодействий с Android API. Это также (заслуженно) возможно самое популярное приложение Kivy в Google Play.

Введение в Kognitivo и основные экраны

Обучение Kognitivo (слева), инструкции к игре (в центре) и главный экран (справа).

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

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

Игровой процесс Kognitivo, уведомления Android и покупка в приложении

Обучающая игра Kognitivo (слева), уведомление Android (в центре) и опция покупки в приложении (справа).

С технической точки зрения Kognitivo обладает рядом функций, обычно не включаемых в приложения Kivy, но реализуемых посредством взаимодействия с Android API через некоторый код Java и/или вышеупомянутый Pyjnius. К ним относятся уведомления, взаимодействие с календарем и покупки в приложении.

У автора Когнитиво, Сергея Чепарева, есть собственный отчет о разработке Когнитиво в своем блоге, включая обсуждение преимуществ и недостатков разработки Kivy, а также опыт объединения всех этих функций. Это отличный ресурс сам по себе; Я не согласен с некоторыми критическими замечаниями автора, и с тех пор некоторые функции Kivy были улучшены, но это отличный обзор опыта. Более того, он с энтузиазмом описывает некоторые из причин, по которым я считаю Python для Android интересным:

Я думаю, что самое прекрасное в этом — использовать всемогущество фреймворков [Python]. Я использовал sqlalchemy и sqlite в качестве бэкэнда, и это сработало как шарм! Python — самый мощный язык из-за его фреймворков, вы даже можете запустить Django на своем смартфоне! Это потрясающе! Либо подкручен для асинхронной связи с сервером. Или nltk для обработки естественного языка в приложении. Или, может быть, вы хотите создать мобильную программу для решения уравнений с помощью scipy и numpy. Все мечты сбываются.

Барли

Вы можете скачать Barly здесь или посетить его собственный веб-сайт.

Barly — последнее из этих приложений, появившееся в Google Play. Я решил включить его как хороший пример того, как достаточно хорошо реализована его концепция при хорошем использовании Kivy; как и Kognitivo, тематика приложения сильно отличается от тем приложения Kivy по умолчанию (хотя оно и не похоже на обычное приложение для Android) и в целом хорошо скомпоновано.

Начальный экран Barly, варианты вкуса и пример пива

Главный экран Barly (слева), параметры вкуса (в центре) и результаты поиска пива (справа).

Цитируя аннотацию в Google Play, Barly – "ваш личный эксперт по пиву". Он предоставляет удобный интерфейс для просмотра пива с использованием данных со стандартных популярных веб-сайтов и в соответствии с вашим описанием собственного вкуса. Самая интересная функция Barly — это возможность сфотографировать пивное меню и автоматически определить, какие сорта пива указаны в списке, а затем загрузить информацию о них, чтобы помочь вам выбрать. Такой анализ изображений должен быть сложным, но на самом деле он работал неплохо, когда я тестировал его.

Интерфейс этой функции довольно удобен: вы переключаетесь на приложение камеры Android, чтобы получить изображение перед его загрузкой на сервер для обработки (во время которой вы можете указать свои предпочтения). Эта функциональность возможна с Pyjnius, как упоминалось ранее, но на самом деле в данном случае это API, также представленный в чистом Python Plyer (еще один сестринский проект Kivy, объединяющий API-интерфейсы для конкретных платформ во внешнем интерфейсе Python). Не все API-интерфейсы могут быть удобно представлены таким образом, и на самом деле Barly может даже не использовать этот конкретный метод, но это хороший пример функциональности, которую можно реализовать с помощью Kivy особенно кросс-платформенным способом.

Помимо этого, Barly не так широко использует Android API или необычные функции Kivy, но и не пытается это делать; это хороший пример полноценного и автономного приложения Kivy, использующего возможности Python для необычной и интересной цели.

ниавлис

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

реактивный ранец

гитара

niavlys, вы случайно не продвинулись в документировании этого? Я работаю над тем, чтобы push-уведомления работали в моем приложении kivy. На Android я использую plyer, как описано здесь и здесь. Однако iOS оказывается намного сложнее. В настоящее время я пытаюсь использовать PyAPNS для получения уведомлений на iOS, но пока безуспешно. Я также использую Django в качестве серверной части приложения, поэтому пытаюсь выяснить, можно ли использовать уведомления Django для iOS.

Роджер Эренс

Если это так, я думаю, что WAMP (интеграция PUB/SUB и RPC) может быть еще одним способом решить вашу проблему. Я только что опубликовал сообщение, демонстрирующее демонстрационное приложение:

Ракан Алхнеити

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

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

Майкл Хайнс

Итак, я смог это сделать. Это было довольно сложно, но не невозможно. Закончив его, я должен сказать, что НЕ рекомендую делать это через python ----- по большей части это невозможно.

Я сделал это как на Android, так и на iOS, и в любом случае, если вы не пишете Java или не изменяете main.m в Xcode, это не стоит вашего времени.

В общих чертах вам необходимо пройти следующие шаги:

Android:
1. Во-первых, вы должны выполнить ВСЕ обычные шаги, которые должен пройти обычный разработчик, использующий Android Studio. Я могу посоветовать, через какие обручи я прыгал, но это самая сложная часть. Это включает в себя создание проекта API, получение вашего ключа API и номера проекта, а затем копирование классов из этого примера проекта Google в ваш проект python для Android: https://github.com/googlesamples/google-services/tree/ master/android/gcm/app/src/main/java/gcm/play/android/samples/com/gcmquickstart. ПРИМЕЧАНИЕ. Несмотря на то, что Google рекомендует firebase, firebase по-прежнему использует GCM на сервере. Нет абсолютно никакой необходимости (пока) использовать Firebase SDK — вы все равно можете использовать все стандартные примеры и библиотеки GCM.
2. Затем, когда вы действительно готовы скомпилировать свой проект buildozer, вам потребуются файлы Jar, которые предоставляют сервисы Google Play и GCM: вам нужно запустить диспетчер Android SDK (расположенный в ~/.buildozer) и добавить «дополнительно». URL-адрес репозитория в диспетчере SDK, а затем установите SDK сервисов Google Play. (Вы можете погуглить все, что нужно, чтобы узнать, как это сделать).
3. Самое сложное, что мне пришлось выяснить, это то, что после установки SDK сервисов Google Play (версия 9.6.1 на момент написания этой статьи) вы не получаете Jars, вы получаете «aar» --- Что в основном zip-файл внутри zip-файла. Вам понадобятся следующие файлы: a) play-services-gcm.jar b) play-services-iid.jar и c) play-services-basement.jar d) play-services.jar. Эти файлы создаются путем извлечения файла "classes.jar" из архива соответствующего формата "aar", загруженного из SDK.

После того, как у вас есть эти jar-файлы ^^^^ (все 4 из них, не пропускайте ни один), вы можете связать их в своем buildozer.spec и скомпилировать приложение ----- оно работает отлично.

Короткий ответ: да, это можно сделать без Gradle.

iOS: использование самой последней цепочки инструментов kivy-ios позволяет сделать это довольно просто:

<р>1. Выполните все стандартные процедуры по созданию сертификатов и их импорту в Apple Member Center, а также по активации push-уведомлений для вашего приложения. Погуглите все это.
2. После установки сертификатов найдите файл «main.m» в цепочке инструментов kivy-ios. Затем вам нужно будет добавить в этот файл обычные функции, чтобы зарегистрировать ваше приложение в APNS и получить токен.

Действительно, для iOS это так просто. ОБРАБОТКА токена — это упражнение, оставленное читателю — когда вы дойдете до этого момента, я предполагаю, что вы захотите использовать python как в Android, так и в iOS для обработки
отправки токенов в ваше собственное соответствующее push-уведомление. сервер/услуги. Получив токен, вы можете снова переключиться на Python и наслаждаться всеми преимуществами Python, которые предоставили нам превосходные
связки инструментов kivy.

Целевой читатель: пользователи Kivy и Python среднего уровня

После некоторого пребывания на сервере Kivy в разногласиях (я рекомендую всем, кто интересуется Kivy, присоединяться сюда!) я заметил, что несколько раз появлялась отчетливая проблема, у которой не было четкого решения для людей, которые были опыт работы с фреймворком, но не обязательно с внутренней работой операционной системы Android.
В более старых версиях API вам просто нужно было запросить необходимые разрешения заранее в манифесте (или в buildozer.spec в нашем случае). - и этого было бы достаточно. Однако в настоящее время мы должны запрашивать их во время выполнения, и пользователь может активно выбирать по своему усмотрению, одобряют они их или нет. Также дурным тоном является сбой или закрытие нашего приложения, если разрешение не предоставлено, поэтому, как разработчики, мы должны справляться с этим лучше.

Необходимые инструменты для этого могут быть получены с помощью Pyjnius — kivy-инструмента для взаимодействия через JNI, предоставляющего нам доступ ко всему, через что мы обычно имели бы исходный доступ. Pyjnius невероятно мощен, и я вернусь к нему позже, подробно описывая, как использовать его со сторонними библиотеками, но сейчас мы сосредоточимся только на доступе к уже существующим API-интерфейсам Android.

Во-первых, нам нужно объявить разрешения, которые мы хотим использовать в buildozer.spec как обычно — для нашего примера мы будем использовать ACCESS_FINE_LOCATION. Причина этого в том, что Android классифицирует определенные разрешения как Опасные разрешения — и только они должны быть предоставлены пользователем во время выполнения. Другие разрешения, такие как VIBRATE, предоставляются при установке, к чему привыкли многие старые таймеры.

Во-вторых, нам нужно захватить определенную внешнюю библиотеку поддержки, предоставив нам доступ к ContextCompat, которую мы будем использовать для проверки статуса разрешений. Здесь важно получить пакет, соответствующий вашему целевому API — по умолчанию в настоящее время 27. Вы можете получить файл .aar из Maven, своего рода репозиторий для артефактов в мире Java (считайте, что это своего рода pypi) .
Затем мы объявляем файл в нашей buildozer.spec в свойстве android.add_aars.

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

Заполненный фрагмент выглядит следующим образом:

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

Простой порядок здесь будет заключаться в том, чтобы проверить, есть ли у нас разрешение, в данном случае «android.permission.ACCESS_FINE_LOCATION», подтвердить, есть ли оно у нас или нет, если проверка возвращает False — мы запрашиваем его и повторно проверяем, если пользователь предоставил нам необходимое разрешение. Повторяйте по мере необходимости во всем приложении, пока не получите то, что вам нужно.

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

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

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

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

Схема, объясняющая отправку push-уведомлений с вашего сервера на устройство

    для 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 создаст канал на устройстве, если он еще не существует. Однако соблюдайте осторожность, так как канал "По умолчанию" предназначен для пользователей, и вы не сможете полностью удалить его.

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