Urbanairship, push-уведомления для мобильных приложений
Note
Статью про самостоятельную реализацию IOS Push смотрите здесь. Самостоятельная серверная реализация Android Push рассматривается тут
Разрабатывая мобильные приложения рано или поздно сталкиваешься с необходимостью оперативного оповещения клиентов о происходящих на сервере изменениях. Клиентское приложение иногда связывается с сервером и получает данные которые его ожидают. Но что делать если приложение не соединено с сервером или выключено, а оповестить о событиях необходимо?
Для этого практически для всех популярных мобильных платформ (ios, android, blackberry) компаниями-разработчиками реализована функциональность Push-уведомлений.
Push-уведомления — сообщения которые сервер отправляет клиенту для информирования его о новых данных. Например это может быть новое сообщение от знакомого, изменение статуса заказа, появление определенного товара и так далее.
Note
Для веб-приложений вариант реализации push-уведомлений описывается в статье: Создание сервера оповещений с использованием Tornado и Socket.IO
Практически для каждого типа мобильных устройств данный функционал необходимо реализовывать отдельно, поэтому для своего последнего проекта я решил воспользовался специальным сервисом Urbanairship.
Данный сервис позволяет пользоваться едиными API для отправки уведомлений на apple, android, blackberry устройства. Позволяет вести статистику и пользоваться отладочной консолью. Без сложностей переключаться между боевым и разработческим режимами отправки. И самое главное демократичной ценовой политикой https://urbanairship.com/pricing/. Бесплатное ограничение в миллион уведомлений в месяц покроет большинство небольших проектов, а если ваше приложение перерастет этот порог то $0.001 за уведомление (2.8 копейки) при превышении не должно составить трудностей и это значительно дешевле SMS-сообщений.
В данной статье рассматривается работа c Urbanairship на примере iPhone push-уведомлений.
Регистрация и создание приложения
- Регистрируемся на http://urbanairship.com, при регистрации вас попросят указать адрес для платежей и действующие данные кредитной карты.
- Перед созданием приложения на Urbanairship нам необходимо получить push SSL сертификат. Идем на iOS Provisioning Portal и получаем Development и Production Push SSL Certificate в формате *.cer. Получив их на любое Apple Mac устройство конвертируйте в Personal Information Exchange (.p12) формат.
- Теперь мы готовы зарегистрировать наше приложение на Urbanairship. Идем по адресу https://go.urbanairship.com/apps/ и создаем два новых приложения ( example-production, example-development ) выбирая соответственно Production или Development режимы и загружая соответствующие сертификаты. Для каждого из режимов записываем Application Key и Application Master Secret они нам понадобятся для работы с API.
Note
Рекомендуется создавать по отдельному приложению для production и development режимов.
Отправка push-уведомлений
Реализуем с помощью python механизм push-уведомлений для нашего приложения. Прежде всего рассмотрим каким образом это все реализовано на примере IOS устройств.
Для работы службы уведомлений требуется IOS 3.0 или выше, подключение к Интернету и поддержка в вашей мобильной программе. Чтобы получать уведомления от программы, ее необходимо открыть как минимум один раз. Когда IOS устройство находится в активном режиме (экран включен) прием уведомлений осуществляется в любое время, в противном случае через каждые 15 минут.
Для отправки уведомления на устройство сервер должен знать Device token который приложение получает при регистрации в Apple Push Notification Service. В уведомлениях можно использовать звуки, значки, текстовые сообщения.
Резюмируя:
Приложение должно зарегистрироваться в Apple и получить Device Token;
- Приложение должно сообщить Device Token серверу (например
http-заголовком);
Для отправки уведомления сервер делает http запрос к API Urbanairship, с JSON данными.
Реализация на python (django) может выглядеть следующим образом:
from urllib import urlencode
from urllib2 import urlopen, Request, URLError
from django.utils import simplejson
from django.conf import settings
from celery.decorators import task
@task(ignore_result=True, max_retries=3, default_retry_delay=10)
def send_ios(message, sound=None, device_token=None):
""" Send IOS push notification
with urbanairship service.
Celery async task.
"""
if isinstance(message, basestring):
message = dict(alert = message)
if device_token:
try:
return urlopen(Request(
settings.URBANSHIP_PUSH_URL,
simplejson.dumps(dict(
device_tokens = [ device_token ],
aps = dict(sound=sound, alert=message.get('alert'),
data=message.get('data'))
)),
headers = {
'Authorization': 'Basic %s' % base64.b64encode(
"%s:%s" % (settings.URBANSHIP_APP_KEY,
settings.URBANSHIP_MASTER_SECRET)),
'Content-type': 'application/json',
},
), timeout=10)
except URLError, e:
_send_ios.get_logger().error("urbanairship server is unresponsible, cannot send ios notification")
_send_ios.retry(exc=e)
Note
В данном примере я использовал Celery для выполнения асинхронного оповещения. Если на вашем проекте очереди задач не используются уберите декоратор task и обвязку кода отправки в try ... except.
В настройках проекта мы должны указать ключи: 'URBANSHIP_PUSH_URL, URBANSHIP_APP_KEY, URBANSHIP_MASTER_SECRET' полученные нами ранее. В своей разработке я стартую продакшен и дев сервера с разными настройками, соответственно с разными ключами для Urbanairship.
Обратите внимание, что для использования этой функции нам необходимо знать device_token, который нам должно сообщить приложение.
Использование:
# simple message
send_ios('Hello', device_token='FAKEDEVICETOKEN')
# message with sound
send_ios('Beep', sound='default', device_token='FAKEDEVICETOKEN')
# message with data
send_ios({
alert = 'Some data',
data = {
order: 999,
status: 'updated',
}
}, sound='default', device_token='FAKEDEVICETOKEN')
Если отправка не происходит откройте приложение в Urbanairship в режиме просмотра и посмотрите сообщения в консоли (для отладки должен быть активирован чекбокс debug в настройках (production, development) приложения).
Заключение
Мы рассмотрели push-уведомления для IOS устройств, но фактически уже имеем поддержку android или blackberry. Необходимо только изменять JSON данные в запросе к API Urbanairship.
Мой опыт взаимодействия с Urbanairship на протяжении последних трех месяцев исключительно позитивный.