Push-уведомления: механизмработы и применение на
практике
Владимир Пузанов [email protected]Владимир Кириллов [email protected]
Hack&Dev Team
Push-уведомления
также известны, как удаленные оповещения (remote notifications)появились впервые в iPhone OS 3.0обеспечивают способ уведомления пользовтелей о ожидающих ихданныхиспользуют постоянное зашифрованное IP-соединениеприходят даже во время нахождения телефона в режиме ожиданияявляются альтернативой приложениям, работающим в фоновом режиме(которые запрещены на iPhone)
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 2 / 20
Механизм работы Push
Apple Push Notification Services
Провайдер
Провайдер
ОПСОС ОПСОС
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 3 / 20
Виды уведомлений
всплывающие сообщения(поддержка UTF-8, шаблонов,локализации ипользовательского наборакнопок)
бейдж-счетчик
звуковое уведомление
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 4 / 20
Регистрация на получение уведомлений
регистрация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
Проверка на наличие сообщенийЕсли iPhone не подключен к источнику питания, то раз в минуту происходитследующий процесс
CPU Baseband
PMU
zzz..1
Разбуди CPU, мне скучно!2
exton2(bb)
3Что там происходит? Есть пакеты?Нету? Ну я дальше спать пошел
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 6 / 20
Получение уведомлений в приложение
PUSH-сообщение попадает в приложение, где его получает делегатUIApplication:
- (void)application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo
userInfo:{
aps = {alert = "fancy message!";
};msgtype = fancy;
}
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 7 / 20
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
Примеры формирования пакета на другихязыках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
PUSH-Сервер: по сокету на приложение
APNS
Сервер уведомлений
{"aps":{ ... }} {"aps":{ ... }}
production: com.other.app
сокет
{"aps":{ ... }}
sandbox: com.some.app
сокет {"aps":{ ... }} {"aps":{ ... }}
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 10 / 20
Шифрование пакетовTransport Layer Security
потомок ветки протоколов SSLинициация соединения происходит при помощи “рукопожатия”
выбор лучшего алгоритма шифрования, поддерживаемого обеимисторонамиотправка клиенту сертификата и открытого ключагенерация случайного числа и передача в зашифрованном видеоткрытым ключомгенерация сессийного ключапри правильном “рукопожатии” начинается обмен криптованнымиданными при помощи сессийного ключа
поддерживает порядка 10 симметричных/ассиметричных алгоритмов ихеш-функции
Реализации
OpenSSL, GnuTLS, NSS, JSSE
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 11 / 20
Путь сертификата
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
демонстрация кода сервера на Objective-C
Cocotronhttp://cocotron.org
open-source проект, стремящийся реализовать API Objective-С подокументации Apple Cocoa
Objective-C RuntimeFoundationAppKitCoreFoundationCoreGraphicsCoreData (в разработке)
портирован на несколько программных платформ
DarwinWindowsLinuxSolarisBSD (OpenBSD, FreeBSD)
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 13 / 20
демонстрация кода сервера на 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
демонстрация кода сервера на Python
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 15 / 20
Сервер — XML и JSON
С помощью сервиса HTTPush(http://httpush.com/) можно значительноупростить взаимодействие с клиентами
HTTPush предоставляет простой JSON или XML API для передачиуведомлений на iPhone.
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 16 / 20
Возможности 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
HTTPush — условия использования
неограниченное число приложенийнеограниченное число пользователей (у одной учетной записи)
Sandbox1000 уведомлений в месяц —бесплатно
Production
1000 уведомлений в месяц —1€
предоплата
приобретенные уведомлениядействителны в течение 3-хмесяцев
уведомления действительныдля всех приложений ипользователей (можно делитсяс друзьями)
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 18 / 20
демонстрация кода PUSH-уведомителя на Cappuccino
В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 19 / 20
Итак, для того, чтобы рассказать Вам про PUSH мы:
написали больше 6 демо-программ, используя порядка 8 языков
использовав при этом 3 операционные системы
2 текстовых редактора
сделали презентацию в TEX(Beamer) и показали её на IBM, а не на MacBook ;)
выпили литр кофе
спорили только по поводу хранения исходников презентации в KOI8-R илиUnicode
выложили материалы в открытый доступ
Спасибо за внимание, задавайте вопросы
Материалы презентации доступны по адресу:http://iphone.hackndev.org/iphonedevcampua
© 2009 Hack&Dev Team