SlideShare a Scribd company logo
Push-уведомления: механизм
  работы и применение на
         практике
  Владимир Пузанов    farcaller@hackndev.com
  Владимир Кириллов      proger@hackndev.com

              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 5223
       tcp4       0      0 79.124.146.15.51726           17.149.34.79.5223          ESTABLISHED

       делегат UIApplication получает уведомление
       - (void)
         application:(UIApplication *)application
         didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
       с 32-байтным токеном




В. Пузанов и В. Кириллов (Hack&Dev)   Push-уведомления                       18 июля 2009   5 / 20
Проверка на наличие сообщений
 Если iPhone не подключен к источнику питания, то раз в минуту происходит
 следующий процесс




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


                                      zzz..
                                                                                   1




                                              2           PMU
                          exton2(bb)                                 Разбуди CPU, мне скучно!




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

 PUSH-сообщение попадает в приложение, где его получает делегат
 UIApplication:
 - (void)
   application:(UIApplication *)application
   didReceiveRemoteNotification:(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   256
 struct 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 = ’00 ’ # 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 += data
   return payload
В. Пузанов и В. Кириллов (Hack&Dev)   Push-уведомления      18 июля 2009   9 / 20
PUSH-Сервер: по сокету на приложение



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

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

                                      sandbox: com.some.app

                APNS


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

                                      production: com.other.app




В. Пузанов и В. Кириллов (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 на iDP
    2   Создать приватный ключ
        openssl genrsa -out private-key.pem 2048

    3   Сгенерировать Certificate Signing Request
        openssl 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   Сконвертировать сертификаты в формат PEM
        openssl x509 -inform der -in aps_developer_identity.cer -out developer-cert.pem
        openssl 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
 Cocotron
 http://cocotron.org

       open-source проект, стремящийся реализовать API Objective-С по
       документации Apple Cocoa
              Objective-C Runtime
              Foundation
              AppKit
              CoreFoundation
              CoreGraphics
              CoreData (в разработке)
       портирован на несколько программных платформ
              Darwin
              Windows
              Linux
              Solaris
              BSD (OpenBSD, FreeBSD)


В. Пузанов и В. Кириллов (Hack&Dev)     Push-уведомления          18 июля 2009   13 / 20
демонстрация кода сервера на Objective-C
 OpenBSD
 http://www.OpenBSD.org
         Only two remote holes in the default install, in a
         heck 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                      условия использования

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

     Sandbox                                     Production
         1000 уведомлений в месяц
                                                         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

More Related Content

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

Dive into Push Notifications
Dive into Push NotificationsDive into Push Notifications
Dive into Push Notifications
Igor Khomenko
 
Программируемость коммутаторов для ЦОД Cisco Nexus
Программируемость коммутаторов для ЦОД Cisco NexusПрограммируемость коммутаторов для ЦОД Cisco Nexus
Программируемость коммутаторов для ЦОД Cisco Nexus
Cisco Russia
 
Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”
Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”
Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”
Lviv Startup Club
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Vadim Kruchkov
 
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ontico
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
beshkenadze
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
Mikhail Kurnosov
 
02 История Open-Source Hardware - Олег Садов
02 История Open-Source Hardware - Олег Садов02 История Open-Source Hardware - Олег Садов
02 История Open-Source Hardware - Олег СадовAlexander Chemeris
 
Антон Тюрин, Евгений Сафронов, Инфраструктура под Cocaine
Антон Тюрин, Евгений Сафронов, Инфраструктура под CocaineАнтон Тюрин, Евгений Сафронов, Инфраструктура под Cocaine
Антон Тюрин, Евгений Сафронов, Инфраструктура под Cocaine
Tanya Denisyuk
 
Cocaine: погружение в облака — Евгений Сафронов
Cocaine: погружение в облака — Евгений СафроновCocaine: погружение в облака — Евгений Сафронов
Cocaine: погружение в облака — Евгений Сафронов
Yandex
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish
SQALab
 
Bgp методякоби
Bgp методякобиBgp методякоби
Bgp методякобиMichael Karpov
 
Модуль доверенной загрузки "Соболь". Новая версия флагманского продукта
Модуль доверенной загрузки "Соболь".  Новая версия флагманского продукта  Модуль доверенной загрузки "Соболь".  Новая версия флагманского продукта
Модуль доверенной загрузки "Соболь". Новая версия флагманского продукта
Security Code Ltd.
 
Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1
Illya Klymov
 
Arduino and Azure IoT
Arduino and Azure IoTArduino and Azure IoT
Arduino and Azure IoT
Alexej Sommer
 
Поймай меня, если сможешь: защита от ботов с PT Application Firewall
Поймай меня, если сможешь: защита от ботов с PT Application FirewallПоймай меня, если сможешь: защита от ботов с PT Application Firewall
Поймай меня, если сможешь: защита от ботов с PT Application Firewall
Vsevolod Petrov
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
Yandex
 
Инфраструктура распределенных приложений на Node.js
Инфраструктура распределенных приложений на Node.jsИнфраструктура распределенных приложений на Node.js
Инфраструктура распределенных приложений на Node.js
Stanislav Gumeniuk
 
Средства строгой аутентификации в новой парадигме: от защиты объекта - к защи...
Средства строгой аутентификации в новой парадигме: от защиты объекта - к защи...Средства строгой аутентификации в новой парадигме: от защиты объекта - к защи...
Средства строгой аутентификации в новой парадигме: от защиты объекта - к защи...Nick Turunov
 

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

Dive into Push Notifications
Dive into Push NotificationsDive into Push Notifications
Dive into Push Notifications
 
Программируемость коммутаторов для ЦОД Cisco Nexus
Программируемость коммутаторов для ЦОД Cisco NexusПрограммируемость коммутаторов для ЦОД Cisco Nexus
Программируемость коммутаторов для ЦОД Cisco Nexus
 
Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”
Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”
Lviv MDDay 2014. Андріан Буданцов “Внутрішній світ iOS додатків”
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
 
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
Ловля сетями. Инструменты отладки сетевых запросов приложений / Дмитрий Рыбак...
 
Кратко о Linux
Кратко о LinuxКратко о Linux
Кратко о Linux
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
02 История Open-Source Hardware - Олег Садов
02 История Open-Source Hardware - Олег Садов02 История Open-Source Hardware - Олег Садов
02 История Open-Source Hardware - Олег Садов
 
Антон Тюрин, Евгений Сафронов, Инфраструктура под Cocaine
Антон Тюрин, Евгений Сафронов, Инфраструктура под CocaineАнтон Тюрин, Евгений Сафронов, Инфраструктура под Cocaine
Антон Тюрин, Евгений Сафронов, Инфраструктура под Cocaine
 
Cocaine: погружение в облака — Евгений Сафронов
Cocaine: погружение в облака — Евгений СафроновCocaine: погружение в облака — Евгений Сафронов
Cocaine: погружение в облака — Евгений Сафронов
 
Froglogic Squish
Froglogic Squish Froglogic Squish
Froglogic Squish
 
Bgp методякоби
Bgp методякобиBgp методякоби
Bgp методякоби
 
Модуль доверенной загрузки "Соболь". Новая версия флагманского продукта
Модуль доверенной загрузки "Соболь".  Новая версия флагманского продукта  Модуль доверенной загрузки "Соболь".  Новая версия флагманского продукта
Модуль доверенной загрузки "Соболь". Новая версия флагманского продукта
 
Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1
 
Arduino and Azure IoT
Arduino and Azure IoTArduino and Azure IoT
Arduino and Azure IoT
 
Поймай меня, если сможешь: защита от ботов с PT Application Firewall
Поймай меня, если сможешь: защита от ботов с PT Application FirewallПоймай меня, если сможешь: защита от ботов с PT Application Firewall
Поймай меня, если сможешь: защита от ботов с PT Application Firewall
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Инфраструктура распределенных приложений на Node.js
Инфраструктура распределенных приложений на Node.jsИнфраструктура распределенных приложений на Node.js
Инфраструктура распределенных приложений на Node.js
 
Средства строгой аутентификации в новой парадигме: от защиты объекта - к защи...
Средства строгой аутентификации в новой парадигме: от защиты объекта - к защи...Средства строгой аутентификации в новой парадигме: от защиты объекта - к защи...
Средства строгой аутентификации в новой парадигме: от защиты объекта - к защи...
 

More from Yandex

Kanban at Yandex Images (Agile Days 2013)
Kanban at Yandex Images (Agile Days 2013)Kanban at Yandex Images (Agile Days 2013)
Kanban at Yandex Images (Agile Days 2013)
Yandex
 
iPhoneDevCamp Ukraine - вступление
iPhoneDevCamp Ukraine - вступлениеiPhoneDevCamp Ukraine - вступление
iPhoneDevCamp Ukraine - вступлениеYandex
 
Разработка кросс-платформенного кода между iPhone &lt; -> Windows с помощью o...
Разработка кросс-платформенного кода между iPhone &lt; -> Windows с помощью o...Разработка кросс-платформенного кода между iPhone &lt; -> Windows с помощью o...
Разработка кросс-платформенного кода между iPhone &lt; -> Windows с помощью o...Yandex
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Yandex
 
Обзор фреймворков в iPhone SDK
Обзор фреймворков в iPhone SDKОбзор фреймворков в iPhone SDK
Обзор фреймворков в iPhone SDKYandex
 
Unity3d - простой путь к iPhone приложению
Unity3d - простой путь к iPhone приложениюUnity3d - простой путь к iPhone приложению
Unity3d - простой путь к iPhone приложениюYandex
 
iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)Yandex
 
Objective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантаймаObjective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантаймаYandex
 
Принципы разработки ПО для iPhone с использованием акселерометра
Принципы разработки ПО для iPhone с использованием акселерометраПринципы разработки ПО для iPhone с использованием акселерометра
Принципы разработки ПО для iPhone с использованием акселерометраYandex
 

More from Yandex (9)

Kanban at Yandex Images (Agile Days 2013)
Kanban at Yandex Images (Agile Days 2013)Kanban at Yandex Images (Agile Days 2013)
Kanban at Yandex Images (Agile Days 2013)
 
iPhoneDevCamp Ukraine - вступление
iPhoneDevCamp Ukraine - вступлениеiPhoneDevCamp Ukraine - вступление
iPhoneDevCamp Ukraine - вступление
 
Разработка кросс-платформенного кода между iPhone &lt; -> Windows с помощью o...
Разработка кросс-платформенного кода между iPhone &lt; -> Windows с помощью o...Разработка кросс-платформенного кода между iPhone &lt; -> Windows с помощью o...
Разработка кросс-платформенного кода между iPhone &lt; -> Windows с помощью o...
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 
Обзор фреймворков в iPhone SDK
Обзор фреймворков в iPhone SDKОбзор фреймворков в iPhone SDK
Обзор фреймворков в iPhone SDK
 
Unity3d - простой путь к iPhone приложению
Unity3d - простой путь к iPhone приложениюUnity3d - простой путь к iPhone приложению
Unity3d - простой путь к iPhone приложению
 
iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)iPhone Unit Testing (Google tool Box)
iPhone Unit Testing (Google tool Box)
 
Objective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантаймаObjective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантайма
 
Принципы разработки ПО для iPhone с использованием акселерометра
Принципы разработки ПО для iPhone с использованием акселерометраПринципы разработки ПО для iPhone с использованием акселерометра
Принципы разработки ПО для iPhone с использованием акселерометра
 

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

  • 1. Push-уведомления: механизм работы и применение на практике Владимир Пузанов farcaller@hackndev.com Владимир Кириллов proger@hackndev.com Hack&Dev Team
  • 2. Push-уведомления также известны, как удаленные оповещения (remote notifications) появились впервые в iPhone OS 3.0 обеспечивают способ уведомления пользовтелей о ожидающих их данных используют постоянное зашифрованное IP-соединение приходят даже во время нахождения телефона в режиме ожидания являются альтернативой приложениям, работающим в фоновом режиме (которые запрещены на iPhone) В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 2 / 20
  • 3. Механизм работы Push Apple Push Notification Services Провайдер ОПСОС ОПСОС Провайдер В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 3 / 20
  • 4. Виды уведомлений всплывающие сообщения (поддержка UTF-8, шаблонов, локализации и пользовательского набора кнопок) бейдж-счетчик звуковое уведомление В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 4 / 20
  • 5. Регистрация на получение уведомлений регистрация UIApplication *app = [UIApplication sharedApplication]; [app registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert]; iPhone блокирует PDP-контекст в активном состоянии и устанавливает TCP-соединение с PUSH-сервером $ netstat | grep 5223 tcp4 0 0 79.124.146.15.51726 17.149.34.79.5223 ESTABLISHED делегат UIApplication получает уведомление - (void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken с 32-байтным токеном В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 5 / 20
  • 6. Проверка на наличие сообщений Если iPhone не подключен к источнику питания, то раз в минуту происходит следующий процесс CPU 3 Baseband Что там происходит? Есть пакеты? Нету? Ну я дальше спать пошел zzz.. 1 2 PMU exton2(bb) Разбуди CPU, мне скучно! В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 6 / 20
  • 7. Получение уведомлений в приложение PUSH-сообщение попадает в приложение, где его получает делегат UIApplication: - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo userInfo: { aps = { alert = "fancy message!"; }; msgtype = fancy; } В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 7 / 20
  • 8. PUSH-Сервер устанавливает постоянное TLS-соединение с APS передает маленькие (до 256 байт) пакеты с уведомлениями целевое приложение определяется по TLS-сертификату, используемом при установке соединения. Сертификаты и генерируемые токены зависят от типа профиля production или testing которые используются в provision профилях development и distribution соответственно. Структура пакета на C #define PUSH_PKT_MAXSIZE 256 struct 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
  • 9. Примеры формирования пакета на других языках 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 = ’00 ’ # 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 += data return payload В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 9 / 20
  • 10. PUSH-Сервер: по сокету на приложение Сервер уведомлений сокет {"aps":{ ... }} {"aps":{ ... }} {"aps":{ ... }} sandbox: com.some.app APNS сокет {"aps":{ ... }} {"aps":{ ... }} production: com.other.app В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 10 / 20
  • 11. Шифрование пакетов Transport Layer Security потомок ветки протоколов SSL инициация соединения происходит при помощи “рукопожатия” выбор лучшего алгоритма шифрования, поддерживаемого обеими сторонами отправка клиенту сертификата и открытого ключа генерация случайного числа и передача в зашифрованном виде открытым ключом генерация сессийного ключа при правильном “рукопожатии” начинается обмен криптованными данными при помощи сессийного ключа поддерживает порядка 10 симметричных/ассиметричных алгоритмов и хеш-функции Реализации OpenSSL, GnuTLS, NSS, JSSE В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 11 / 20
  • 12. Путь сертификата 1 Создать новый уникальный Application ID на iDP 2 Создать приватный ключ openssl genrsa -out private-key.pem 2048 3 Сгенерировать Certificate Signing Request openssl 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 Сконвертировать сертификаты в формат PEM openssl x509 -inform der -in aps_developer_identity.cer -out developer-cert.pem openssl x509 -inform der -in aps_production_identity.cer -out production-cert.pem 6 Сгенерировать provision-профили для уникального Apple ID (с поддержкой Push) В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 12 / 20
  • 13. демонстрация кода сервера на Objective-C Cocotron http://cocotron.org open-source проект, стремящийся реализовать API Objective-С по документации Apple Cocoa Objective-C Runtime Foundation AppKit CoreFoundation CoreGraphics CoreData (в разработке) портирован на несколько программных платформ Darwin Windows Linux Solaris BSD (OpenBSD, FreeBSD) В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 13 / 20
  • 14. демонстрация кода сервера на Objective-C OpenBSD http://www.OpenBSD.org Only two remote holes in the default install, in a heck of a long time! имеет встроенную поддержку криптографии в ядре OpenSSL входит в комплект базовой системы имеет полный набор сетевого инструментария в комплекте (от netcat до bgpd) имеет порт cocotron-gcc и cocotron прекрасно выполняет функцию платформы разработчика серверных (а также консольных) приложений на Objective-C/Foundation (например, сервер push для iPhone) . . . даже используется на настольных и мультимедийных системах В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 14 / 20
  • 15. демонстрация кода сервера на Python В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 15 / 20
  • 16. Сервер XML и JSON С помощью сервиса HTTPush (http://httpush.com/) можно значительно упростить взаимодействие с клиентами HTTPush предоставляет простой JSON или XML API для передачи уведомлений на iPhone. В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 16 / 20
  • 17. Возможности 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
  • 18. HTTPush условия использования неограниченное число приложений неограниченное число пользователей (у одной учетной записи) Sandbox Production 1000 уведомлений в месяц 1000 уведомлений в месяц бесплатно 1€ предоплата приобретенные уведомления действителны в течение 3-х месяцев уведомления действительны для всех приложений и пользователей (можно делится с друзьями) В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 18 / 20
  • 19. демонстрация кода PUSH-уведомителя на Cappuccino В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 19 / 20
  • 20. Итак, для того, чтобы рассказать Вам про PUSH мы: написали больше 6 демо-программ, используя порядка 8 языков использовав при этом 3 операционные системы 2 текстовых редактора сделали презентацию в TEX(Beamer) и показали её на IBM, а не на MacBook ;) выпили литр кофе спорили только по поводу хранения исходников презентации в KOI8-R или Unicode выложили материалы в открытый доступ Спасибо за внимание, задавайте вопросы Материалы презентации доступны по адресу: http://iphone.hackndev.org/iphonedevcampua © 2009 Hack&Dev Team