Push-уведомления для разработчика и пользователя

20
Push-уведомления: механизм работы и применение на практике Владимир Пузанов [email protected] Владимир Кириллов [email protected] Hack&Dev Team

Transcript of Push-уведомления для разработчика и пользователя

Page 1: Push-уведомления для разработчика и пользователя

Push-уведомления: механизмработы и применение на

практике

Владимир Пузанов [email protected]Владимир Кириллов [email protected]

Hack&Dev Team

Page 2: Push-уведомления для разработчика и пользователя

Push-уведомления

также известны, как удаленные оповещения (remote notifications)появились впервые в iPhone OS 3.0обеспечивают способ уведомления пользовтелей о ожидающих ихданныхиспользуют постоянное зашифрованное IP-соединениеприходят даже во время нахождения телефона в режиме ожиданияявляются альтернативой приложениям, работающим в фоновом режиме(которые запрещены на iPhone)

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 2 / 20

Page 3: Push-уведомления для разработчика и пользователя

Механизм работы Push

Apple Push Notification Services

Провайдер

Провайдер

ОПСОС ОПСОС

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 3 / 20

Page 4: Push-уведомления для разработчика и пользователя

Виды уведомлений

всплывающие сообщения(поддержка UTF-8, шаблонов,локализации ипользовательского наборакнопок)

бейдж-счетчик

звуковое уведомление

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 4 / 20

Page 5: Push-уведомления для разработчика и пользователя

Регистрация на получение уведомлений

регистрацияUIApplication *app = [UIApplication sharedApplication];[app registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert];

iPhone блокирует PDP-контекст в активном состоянии и устанавливаетTCP-соединение с PUSH-сервером$ netstat | grep 5223tcp4 0 0 79.124.146.15.51726 17.149.34.79.5223 ESTABLISHED

делегат UIApplication получает уведомление- (void)

application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

с 32-байтным токеном

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 5 / 20

Page 6: Push-уведомления для разработчика и пользователя

Проверка на наличие сообщенийЕсли iPhone не подключен к источнику питания, то раз в минуту происходитследующий процесс

CPU Baseband

PMU

zzz..1

Разбуди CPU, мне скучно!2

exton2(bb)

3Что там происходит? Есть пакеты?Нету? Ну я дальше спать пошел

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 6 / 20

Page 7: Push-уведомления для разработчика и пользователя

Получение уведомлений в приложение

PUSH-сообщение попадает в приложение, где его получает делегатUIApplication:

- (void)application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo

userInfo:{

aps = {alert = "fancy message!";

};msgtype = fancy;

}

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 7 / 20

Page 8: Push-уведомления для разработчика и пользователя

PUSH-Сервер

устанавливает постоянное TLS-соединение с APSпередает маленькие (до 256 байт) пакеты с уведомлениямицелевое приложение определяется по TLS-сертификату, используемомпри установке соединения. Сертификаты и генерируемые токенызависят от типа профиля — production или testing которыеиспользуются в provision профилях development и distributionсоответственно.

Структура пакета на C

#define PUSH_PKT_MAXSIZE 256struct push_pkt {

struct push_pkthdr {u_int8_t cmd; /* = 0 */u_int16_t devtokenlen; /* = htons(sizeof(devtoken)) */u_int8_t devtoken[32];u_int16_t payloadlen; /* = htons(sizeof(payload)); */

} hdr;u_char payload[PUSH_PKT_MAXSIZE - sizeof(struct push_pkthdr)]; /* json string */

} __packed;

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 8 / 20

Page 9: Push-уведомления для разработчика и пользователя

Примеры формирования пакета на другихязыкахPHP

function pack_message(token, message) {$payload = json_encode($message);$data = chr(0) . pack("n", 32) .

pack(’H*’, str_replace(’ ’, ’’, $token)) .pack("n",strlen($payload)) . $payload;

return $data;}

Python

def payload(token, data):payload = ’\0\0 ’ # 0 + u_int16_t 32 (network byte order)payload += ’’.join(

[chr(int(token[i:i + 2], 16)) for i in xrange(0, 64, 2)])payload += struct.pack(’!H’, len(data))payload += datareturn payload

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 9 / 20

Page 10: Push-уведомления для разработчика и пользователя

PUSH-Сервер: по сокету на приложение

APNS

Сервер уведомлений

{"aps":{ ... }} {"aps":{ ... }}

production: com.other.app

сокет

{"aps":{ ... }}

sandbox: com.some.app

сокет {"aps":{ ... }} {"aps":{ ... }}

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 10 / 20

Page 11: Push-уведомления для разработчика и пользователя

Шифрование пакетовTransport Layer Security

потомок ветки протоколов SSLинициация соединения происходит при помощи “рукопожатия”

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

поддерживает порядка 10 симметричных/ассиметричных алгоритмов ихеш-функции

Реализации

OpenSSL, GnuTLS, NSS, JSSE

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 11 / 20

Page 12: Push-уведомления для разработчика и пользователя

Путь сертификата

1 Создать новый уникальный Application ID на iDP2 Создать приватный ключ

openssl genrsa -out private-key.pem 2048

3 Сгенерировать Certificate Signing Requestopenssl req -new -key private-key.pem -out push.csr

Необходимо правильно заполнить Common Name и Email Address всоответсвии с данными iDP

4 Сгенерировать на iDP push-сертификаты для CSR(aps_developer_identity.cer и aps_production_identity.csr)

5 Сконвертировать сертификаты в формат PEMopenssl x509 -inform der -in aps_developer_identity.cer -out developer-cert.pemopenssl x509 -inform der -in aps_production_identity.cer -out production-cert.pem

6 Сгенерировать provision-профили для уникального Apple ID (споддержкой Push)

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 12 / 20

Page 13: Push-уведомления для разработчика и пользователя

демонстрация кода сервера на Objective-C

Cocotronhttp://cocotron.org

open-source проект, стремящийся реализовать API Objective-С подокументации Apple Cocoa

Objective-C RuntimeFoundationAppKitCoreFoundationCoreGraphicsCoreData (в разработке)

портирован на несколько программных платформ

DarwinWindowsLinuxSolarisBSD (OpenBSD, FreeBSD)

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 13 / 20

Page 14: Push-уведомления для разработчика и пользователя

демонстрация кода сервера на Objective-COpenBSDhttp://www.OpenBSD.org

Only two remote holes in the default install, in aheck of a long time!имеет встроенную поддержку криптографии вядреOpenSSL входит в комплект базовой системыимеет полный набор сетевого инструментария вкомплекте (от netcat до bgpd)имеет порт cocotron-gcc и cocotronпрекрасно выполняет функцию платформыразработчика серверных (а также консольных)приложений на Objective-C/Foundation(например, сервер push для iPhone). . . даже используется на настольных имультимедийных системах

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 14 / 20

Page 15: Push-уведомления для разработчика и пользователя

демонстрация кода сервера на Python

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 15 / 20

Page 16: Push-уведомления для разработчика и пользователя

Сервер — XML и JSON

С помощью сервиса HTTPush(http://httpush.com/) можно значительноупростить взаимодействие с клиентами

HTTPush предоставляет простой JSON или XML API для передачиуведомлений на iPhone.

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 16 / 20

Page 17: Push-уведомления для разработчика и пользователя

Возможности API HTTPush

Передача PUSH-уведомлений по HTTPS с использованием JSON илиXMLПоддержка групп подписчиковВозможность передать увдомление:

одному подписчикугруппе подписчиковвсем подписчикам (одного приложения)

Пример пакета для передачи уведомления подписчику (здесь <a>...</a> —ID приложения в HTTPush, а <r>...</r> — ID подписчика для конкретногоприложения):

<?xml version="1.0" encoding="UTF-8"?><notification>

<a>05673b6d12c796afc0cb74849e60573949bf2521</a><b>{"aps":{"badge":1,"alert":"Hi from squidshot!"}}</b><r>test</r>

</notification>

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 17 / 20

Page 18: Push-уведомления для разработчика и пользователя

HTTPush — условия использования

неограниченное число приложенийнеограниченное число пользователей (у одной учетной записи)

Sandbox1000 уведомлений в месяц —бесплатно

Production

1000 уведомлений в месяц —1€

предоплата

приобретенные уведомлениядействителны в течение 3-хмесяцев

уведомления действительныдля всех приложений ипользователей (можно делитсяс друзьями)

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 18 / 20

Page 19: Push-уведомления для разработчика и пользователя

демонстрация кода PUSH-уведомителя на Cappuccino

В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 19 / 20

Page 20: Push-уведомления для разработчика и пользователя

Итак, для того, чтобы рассказать Вам про PUSH мы:

написали больше 6 демо-программ, используя порядка 8 языков

использовав при этом 3 операционные системы

2 текстовых редактора

сделали презентацию в TEX(Beamer) и показали её на IBM, а не на MacBook ;)

выпили литр кофе

спорили только по поводу хранения исходников презентации в KOI8-R илиUnicode

выложили материалы в открытый доступ

Спасибо за внимание, задавайте вопросы

Материалы презентации доступны по адресу:http://iphone.hackndev.org/iphonedevcampua

© 2009 Hack&Dev Team