Push уведомление android ios

Основы успешной реализации push-уведомлений для мобильных приложений

Наши разработчики в Techmas часто сталкиваются с задачами создания уведомлений (push notifications). Несмотря на простоту и популярность технологии, в её реализации есть ряд особенностей, о которых и пойдёт речь в этой статье.

Push-сообщения могут стать великолепным маркетинговым инструментом, если они грамотно реализованы. Любое мобильное приложение или игра должны выполнять не только свои прямые функции, но и (даже в большей степени) так взаимодействовать с пользователями, чтобы последние с удовольствием возвращались в приложение и покупали дополнения к нему. К слову, по статистике сервиса Kahuna хорошо разработанные push-уведомления увеличили показатель возвратов пользователей в приложения более чем в 2 раза. Анализируемые периоды: 30, 60, 90 дней. Но прежде, чем говорить о грамотной реализации, посмотрим, как работают push-уведомления.

Общие сведения о технологии Push Notification

Push-уведомления – это такой способ распространения контента (системных сообщений), когда уведомления отправляются от сервера клиенту по инициативе сервера на основе определённых параметров. В отличие от обратной схемы «клиент-сервер» (Pull), push-технология выгодна тем, что даёт пользователю таргетированную информацию, которая может быть ему полезна, но об этой пользе он может пока не знать.
Изначально технология Push Notification имела отношение не к мобильным приложениям, а к сети PointCast, занимавшейся рассылкой новостей фондового рынка. Эту же систему давно используют суды США для рассылки подписчикам данных о процессах. Позже Microsoft и Netscape включили технологию в свои браузеры, но из-за низкой скорости подключения пользователей в то время она была вытеснена pull-технологией RSS. И лишь потом термин получил широкую известность после внедрения технологии компанией Google в ОС Android (Google Cloud Messaging, GCM) и компанией Apple в iOS 3 (Apple Push Notification Service, APNS). На примере последнего рассмотрим элементарную схему работы Push-уведомлений.

Схема работы Push Notification на примере сервиса APNS


Важно знать! Для того, чтобы уведомление отобразилось на экране устройства, само приложение не обязательно должно быть запущено – именно для реализации этого преимущества посредником здесь выступает OS. Кстати, такой подход позволяет экономить и заряд батареи смартфона (телефона), и трафик.

  • Для получения Push-сообщений OS должна зарегистрировать мобильное приложение;
  • OS запрашивает у APNS идентификатор устройства (токен);
  • Приложение получает токен от сервера APNS;
  • Приложение отправляет токен обратно на сервер, чтобы далее сервер пользовался им для отправки Push-уведомлений;
  • При наступлении события, определённого разработчиком, сервер, используя токены, отправляет Push-сообщения через APNS;
  • APNS делает рассылку уведомлений в приложение.

Зачем нужны промежуточные сервисы

Существуют нюансы в рассылках push-уведомлений для разных мобильных платформ (Android, iOS, Windows Phone). Допустим, если приложение было удалено пользователем, то все сервисы сообщают о том, на какие устройства не следует больше отсылать уведомления. Осуществляется данный процесс посредством сообщения серверу токенов этих устройств. Однако если у GCM отсылка идентификаторов происходит сразу, то у APNS имеется специальный feedback server (сервер обратной связи), с которого список таких токенов забирается раз в сутки. Для рутинной работы с этими различиями и нужны промежуточные сервисы.

В случае разработки мобильного приложения с помощью какого-либо кроссплатформенного решения (к примеру, Appcelerator) такой промежуточный сервис, как правило, интегрирован в него. Допустим, в том же Appcelerator это Appcelerator Cloud Services (ACS), представляющий собой дополнительный сервис каналов уведомлений. Такой канал (channel) объединяет несколько устройств, являясь своеобразным идентификатором, состоящим из цифр и букв. ACS даёт возможность отправлять пуши и по токену устройств. Итак, данный промежуточный сервис берёт на себя функцию обновления информации об устройствах и взаимодействует с APNS и GCM.

Схема такого взаимодействия выглядит так:

  • При разработке мобильного приложения в него внедряется ключ, который выдаёт ACS;
  • Любое уведомление является словарём формата JSON, состоящим из токена девайса, некоторой служебной информации и полезной нагрузки. Полезная нагрузка (payload) – это сами данные, которые отправляются на телефон.
  • Сервер, пользуясь ключом:
    • получает список каналов и устройств, подписанных на каналы;
    • подписывает (и отписывает) устройства на определённые канал;
    • отправляет push-уведомления на все устройства или только по определённым токенам или каналам устройств.

  • Устройства, в зависимости от их операционной системы, получают push-сообщения от GCM или APNS.

Форма подписки. Современный пользователь не любит навязчивости. По этой причине лучше не показывать диалоговое окно подписки на уведомления во время старта приложения, потому что пользователь ещё не знает, будут ли ему интересны ваши рассылки. Хорошо, если форма подписки на пуш о, например, новых ценах на товары появляется лишь тогда, когда пользователь активирует подписку на интересные ему лоты или направления. Либо выражает согласие на получение пуш-уведомлений в настройках приложения.

Форма уведомления. Сразу выдавайте интересную информацию, лучше в заголовке. Одинаковые пуши вида «Новые распродажи в нашем магазине» не работают: дайте конкретику. Неплохо также использовать Deep Linking (указывать в сообщение внешние ссылки на конкретную страницу сайта).

Гибкая настройка. Чем более детальна настройка того, о чём именно в рамках вашего продукта хочет получать сообщение пользователь, тем лучшее. Персонализированные рассылки всегда имеют больший отклик. Позвольте пользователю настроить уведомления так, как ему интересно и удобно, с максимумом подробностей.

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

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

Тестирование. Используйте разные формы подписки, тексты уведомлений, время рассылки и общую push-стратегию. Следите за отзывами в сети – это даст вам богатую информацию о том, как улучшить рассылку.

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

Сервисы автоматизации Push-рассылки

Push Woosh. Выдаёт удобные и понятные отчёты, совместим со многими платформами, отлично сегментирует аудиторию по разным группам признаков.

Urban Airship. Осуществляет таргетинг и анализ аудитории, позволяет выбирать различные стратегии удержания пользователя и создавать уведомления расширенного формата.

Appsfire`s Appbooster. Бесплатный сервис со стандартным набором функций.

Parse Push. Позволяет собирать уникальные данные для аналитики, с лёгкостью интегрируется в любое приложение.

В заключение отметим, что push-уведомления, конечно, являют собой простой и эффективный способ возврата и удержания пользователя в частности и мощный маркетинговый инструмент в целом. Но это с точки зрения пользователя. Со стороны разработчика же существуют некоторые сложности. Реализация уведомлений сильно зависит от внешних вводных: изменения в OS или в промежуточном софте приводит к необходимости доработки приложения. Так, в Appcelerator появился новый инструмент Arrow Push, который пришел на смену ACS – и это лишь один из примеров. Более того, доставка пуша не гарантирована в принципе, а это поднимает вопрос о надёжности технологии Push Notification. Однако любая технология имеет свои плюсы и минусы, и что перевешивает в данном случае – вопрос открытый.

Источник

IT Keys

Согласно энциклопедиям, Push — это технология распространения информации от сервера клиенту. Однако, в последнее время это слово чаще всего употребляется в отношении уведомлений на мобильных устройствах. Именно о Push уведомлениях мы и поговорим в данной статье.

Под мобильными push-уведомлениями чаще всего понимают небольшие плашки с сообщениями, которые появляются в верхней части экрана, в т.н. «шторке», на экране блокировки.

Такое понятие, как push-notifications, стало популярным после внедрения яблочной компанией сервиса Apple Push Notification Service (APNS) для передачи уведомлений на устройства под iOS 3. Стоит упомянуть, что эту революционную инновацию Apple внедрили в iOS почти на год позже, чем Google в ОС Android.

Как бы то ни было, на почве push уведомлений для мобильных выросло целые семейство сервисов и инструментов от разных компаний:
Apple после добавления системы пушей (APNS) для айфонов реализовали их и для OS X и, совсем недавно, для Safari.
Google создали Android Cloud to Device Messaging (C2DM) в далеком 2008 году, заменив его на Google Cloud Messaging (GCM) в 2012 году. Естественно, при помощи данного сервиса пушить можно также и в Chrome приложения.
В Microsoft, как обычно, решили не отставать и создали MPNS (попробуйте сами угадать значение этой аббревиатуры). Таким образом, push-уведомления доступны на Windows Phone начиная с седьмой ее версии.

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

Здесь следует обозначить разницу между такими вещами, как push, push-уведомления и уведомления, генерируемые локальными приложениями в системе. Push — это технология, которая используется для доставки информации. Уведомления же генерируются внутри системы и выглядят они в разных ОС по-разному.

Типы уведомлений в мобильных ОС

В iOS есть три типа push-уведомлений:
Audio — об уведомлении пользователю сообщается путем проигрывания звукового уведомления
Audio/Banners — проигрывается звуковое сообщение и т.н. “баннер” появляется на экране. Информацию, передающеюся с первым и вторым типами сообщений вы можете увидеть в Notification Center — внутри т.н. “шторки”.
Badges (рус. значок, символ) — рядом с иконкой приложения появляется цифра или специальное изображение.

В Windows Phone 8 также есть три варианта push-уведомлений:
Toast (рус. тост) — сообщение показывается в верхней части экрана на протяжении 10 секунд. Естественно, это сообщение кликабельно.
Tile (рус. плитка) — отображаются в виде чисел, выводимых поверх значка приложения на плитке (Live Tile).
Raw (рус. грубый) — для передачи произвольной информации внутрь приложения. Предполагается, что такой тип пушей используется для игровых приложений.

С Android все немного интереснее. В официальном мануале для разработчиков написано:

It does not provide any built-in user interface or other handling for message data. GCM simply passes raw message data received straight to the Android application, which has full control of how to handle it. For example, the application might post a notification, display a custom user interface, or silently sync data.

По-русски: в ОС Android нет никакой встроенной системы для прямого отображения пользователю push-уведомлений. Все данные «пушатся» исключительно в приложение, и передаются в совершенно произвольной форме, как и raw-уведомления в WP8. Приложение же, после получения информации, может, например, выдать стандартное для андроид-систем уведомление, которое отобразится в верхней части экрана и в “шторке”. Или же может появится баннер, подобный таковым в iOS.
Однако, учитывая открытость Андроида и исключительную гибкость этой системы, уведомления после получения push могут выводиться, в принципе, в любой форме. Например, одним из самых самых невинных способов взаимодействия с пользователем может быть немедленное открытие окна приложения со всей необходимой промо-информацией.

Браузерные push уведомления

С некоторого времени у разработчиков появилась возможность рассылать push-уведомления через браузеры на стационарные компьютеры пользователей: в Google Chrome и Apple Safari. Для отправки данного типа пушей также используются службы GCM и APNs. С технической точки зрения, браузерные push-уведомления отличаются от мобильных только тем, что в Chrome и Safari отправителем уведомления является сайт. Пользователи получают push-уведомления в виде небольших сообщений, которые появляются поверх всех окон в углу экрана сразу по получении.

Для вашего приложения или сайта

У каждого из разработчиков мобильных ОС есть свой собственный подход к технической реализации отправки push уведомлений на устройства. Сервисы, которые обеспечивают возможности push-нотификаций, были перечислены в начале статьи: GCM, APNS и MPNS.
Однако очевидно, что для работы с ними нужно также использовать еще и внешний сервер — для отправки на эти сервисы удаленных запросов. Учитывая то, что обеспечение легкой жизни разработчиков не является приоритетной задачей ни для одной из компаний-авторов ОС, каждый из вышеперечисленных сервисов функционирует очень по-своему. Для отправки уведомлений на разные платформы нужно соблюсти немало всяческих требований, и для каждой платформы — своих.
Именно поэтому в сети существует много сервисов, предоставляющих удобный интерфейс для реализации push-уведомлений в приложения и на сайтах своих клиентов.

Источник

Внедряем кросс-платформенные пуш-уведомления: начало

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

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

Начнем с веб-пушей. Для их получения браузер подключается к своему пуш-серверу, идентифицируется и принимает уведомления в сервис-воркер (в нем срабатывает событие push ). Нюанс тут в том, что у каждого браузера пуш-сервис свой:

  • У Firefox он называется Mozilla Push Service. Его исходный код и спецификация протокола открыты, чем мы позже воспользовались.
  • У Chrome это Google Cloud Messaging (не Firebase Cloud Messaging, что можно увидеть по именам доменов в исходном коде), и так далее.

Хорошая новость для нас в том, что веб-пуши стандартизированы IETF (https://datatracker.ietf.org/wg/webpush/documents/), и поддерживать разные форматы API для каждого браузера как на клиенте, так и на сервере нам не придется.

Теперь рассмотрим устройства на базе Android. Здесь есть несколько вариантов:

  • Если в системе установлены Google Apps, то можно воспользоваться Firebase Cloud Messaging.
  • Если у вас устройство от Huawei без Google Apps, то можно использовать Huawei Push Kit.
  • Можно написать собственный пуш-сервер или воспользоваться готовыми проектами, например, https://bubu1.eu/openpush/, благо открытость платформы позволяет.

Далее идет iOS. В отличие от Android, способ отправить уведомления на устройства Apple всего один — использовать Apple Push Notification service (APNs).

Может возникнуть логичный вопрос: неужели придется поддерживать всё это многообразие стандартов, API и прочего на серверной стороне? На самом деле, всё не так уж и плохо, так как Firebase Cloud Messaging, помимо отправки на Android, покрывает еще и веб-пуши и работает с APNs. Так мы пришли к следующей схеме: на устройства Huawei без Google Apps отправляем через Huawei Push Kit, в остальных случаях пользуемся Firebase Cloud Messaging.

Несмотря на многообразие стандартов и сервисов, схема работы будет примерно одинаковой:

  1. Клиент подключается к пуш-серверу и получает уникальный идентификатор — токен.
  2. Клиент отправляет токен серверу конкретного приложения, чтобы стать связаным с учетной записью пользователя.
  3. Сервер приложений начинает по полученному токену отправлять пуши для конкретного пользователя.

Попробуем написать тестовое приложение

Для начала просто получим пуш-токен от Firebase и попробуем отправить пуш. Нужно зарегистрировать проект в консоли Firebase и получить конфигурацию для веб-приложения. Для корректного функционирования будет нужен локальный HTTP-сервер с передачей статики.

Сделаем страницу с одной кнопкой и необходимыми скриптами:

Также потребуется скрипт сервис-воркера. По умолчанию он подгружается автоматически по пути /firebase-messaging-sw.js . Для начала будем использовать готовый скрипт отсюда.

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

Тут есть важный момент, о котором можно забыть: пуш-токен никак не связан с пользователем приложения, он связан с конкретным получателем (т.е. с клиентской конфигурацией). На мобильных устройствах он связан с конкретной инсталляцией приложения.

Посмотрим, что нам приходит в браузер. В документации описан колбэк setBackgroundMessageHandler . Модифицируем сервис-воркер, добавив в конец файла код:

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

Note: If you set notification fields in your message payload, your setBackgroundMessageHandler callback is not called, and instead the SDK displays a notification based on your payload.

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

Тем не менее, можно это обойти, обрабатывая входящие пуши вручную. Поменяем содержимое firebase-messaging-sw.js :

Здесь мы считываем полезную нагрузку в json и парсим ее в js-объект, который будет выведен в консоль, заодно показывая уведомление. Обратите внимание на waitUntil внутри обработчика: он нужен для того, чтобы сервис-воркер не завершил работу до окончания асинхронного вызова onPush .

Теперь добавим пользователей в наше приложение

Для удобства заведем новую страницу:

Нам понадобится простенький бэкенд, писать будем на Go. Тут приведу только пример кода, отвечающего за хранилище токенов:

В бэкенд также добавлен код отправки пушей конкретному пользователю.

Базово мы обеспечиваем следующую функциональность:

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

Опишу несколько важных моментов, на которые мы наткнулись уже на практике (они отражены в примере):

  • Пуш-токены имеют ограниченный срок жизни, однако узнать его из самого токена, на первый взгляд, невозможно. Судя по коду firebase-js-sdk, этот срок чуть больше недели, так как колбэк на обновление токена onTokenRefresh вызывается раз в неделю.
  • Разные пользователи могут прислать одинаковые пуш-токены. Такое возможно в случае, если запрос на инвалидацию в Firebase не прошел успешно. Для решения этой проблемы мы в данном случае меняем владельца токена.
  • У пользователя может завершиться сессия без явного логаута. Т.е. пользователь больше не авторизован, однако уведомления продолжают поступать. Способ решения этой проблемы зависит от архитектуры приложения. Мы при отправке пуш-токена на сервер сохраняем идентификатор пользователя еще и локально, при каждой загрузке страницы сверяя его с ответом на запрос о текущем пользователе. Если значения различаются или пользователь не авторизован, то пуш-токен инвалидируется. Однако у такого подхода всё же есть один недостаток: инвалидация происходит только в случае загрузки страницы сайта.
  • Сохраняйте платформу, с которой получен токен. Это поможет при дальнейшей кастомизации: например, добавить возможность ответа в чат прямо из пуша (в Android/iOS можно, в браузере — нет), кнопки и прочее.

И вот, грабли собраны, доработки выложены в прод. Пуши ходят… или не ходят? Самое время поговорить про

Надежность

Никаких методов подтверждения доставки от клиента серверу приложений изначально не предусмотрено, хотя в Huawei над этим задумались и сделали. Поэтому нам придется реализовывать эту функциональность самим. Первое, что приходит в голову — отправлять на сервер HTTP-запрос при получении пуша. Для этого нам потребуется идентифицировать каждый пуш, благо и Firebase, и Huawei это позволяют: можно пробросить произвольные данные при отправке уведомления.

Идея следующая: мы генерируем одноразовый токен подтверждения (в нашем случае это просто UUID) и отправляем его в пуше. Клиент при получении и показе пуша делает HTTP-запрос, в который включается присланный токен подтверждения. Немного дорабатываем бекенд и firebase-messaging-sw.js :

И если с вебом нам хватило такой простой доработки, то с мобильными устройствами всё несколько сложнее. Помните про замечание в документации о setBackgroundMessageHandler ? Так вот, дело в том, что в Firebase (да и в Huawei) есть не совсем очевидное (по API) разделение на, условно, информационные пуши (если есть поле notification ) и data-пуши. По задумке, информационные пуши никак не обрабатываются приложением и на их основе сразу формируется уведомление, а data-пуши попадают в специальный обработчик и дальше приложение решает, что делать.

Если при получении веб-пушей с ними можно работать до показа, отказавшись от firebase-js-sdk в сервис-воркере, то в Android так не получится. Поэтому для Android мы перенесли всю нужную информацию исключительно в data и перестали отправлять notification , что позволило нам реализовать подтверждение доставки.

Для APNs же достаточно просто выставить mutable-content в 1, и тогда при обработке пуша можно будет выполнять некоторый код, но с довольно серьезными ограничениями, хотя этого вполне достаточно для простого HTTP-запроса. Собственно, именно из-за ограничений iOS при подтверждении пуша не задействуется пользовательская сессия, а используются одноразовые токены.

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

Мы же используем механизм подтверждения следующим образом: для некоторых типов уведомлений, если не дождались подтверждения через, скажем, 15 минут после отправки, отправляется смс. А чтобы исключить случай, когда после смс приходит пуш, можно выставить TTL при его отправке.

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

  • Android (исключая Huawei) — 40 %
  • Web — 50 %
  • iOS — 70 %

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

Итоговая архитектура получается примерно такой:

Полную версию проекта можно взять на GitHub.

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

Источник

Читайте также:  Riptide gp для android
Оцените статью