Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Push Notifications

Push Notifications

Abc432bb0450574a25b15ff23d399d5a?s=128

Vladimir Pouzanov

July 18, 2009
Tweet

Transcript

  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 Baseband PMU zzz.. 1 Разбуди CPU, мне скучно! 2 exton2(bb) 3 Что там происходит? Есть пакеты? Нету? Ну я дальше спать пошел В. Пузанов и В. Кириллов (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 = ’\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 += data return payload В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 9 / 20
  10. PUSH-Сервер: по сокету на приложение APNS Сервер уведомлений {"aps":{ ...

    }} {"aps":{ ... }} production: com.other.app сокет {"aps":{ ... }} sandbox: com.some.app сокет {"aps":{ ... }} {"aps":{ ... }} В. Пузанов и В. Кириллов (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 1000 уведомлений в месяц бесплатно Production 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