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

Push Notifications

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Push Notifications

Avatar for Vladimir Pouzanov

Vladimir Pouzanov

July 18, 2009
Tweet

More Decks by Vladimir Pouzanov

Other Decks in Programming

Transcript

  1. Push-уведомления также известны, как удаленные оповещения (remote notifications) появились впервые

    в iPhone OS 3.0 обеспечивают способ уведомления пользовтелей о ожидающих их данных используют постоянное зашифрованное IP-соединение приходят даже во время нахождения телефона в режиме ожидания являются альтернативой приложениям, работающим в фоновом режиме (которые запрещены на iPhone) В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 2 / 20
  2. Механизм работы Push Apple Push Notification Services Провайдер Провайдер ОПСОС

    ОПСОС В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 3 / 20
  3. Виды уведомлений всплывающие сообщения (поддержка UTF-8, шаблонов, локализации и пользовательского

    набора кнопок) бейдж-счетчик звуковое уведомление В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 4 / 20
  4. Регистрация на получение уведомлений регистрация 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
  5. Проверка на наличие сообщений Если iPhone не подключен к источнику

    питания, то раз в минуту происходит следующий процесс CPU Baseband PMU zzz.. 1 Разбуди CPU, мне скучно! 2 exton2(bb) 3 Что там происходит? Есть пакеты? Нету? Ну я дальше спать пошел В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 6 / 20
  6. Получение уведомлений в приложение PUSH-сообщение попадает в приложение, где его

    получает делегат UIApplication: - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo userInfo: { aps = { alert = "fancy message!"; }; msgtype = fancy; } В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 7 / 20
  7. 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
  8. Примеры формирования пакета на других языках 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
  9. PUSH-Сервер: по сокету на приложение APNS Сервер уведомлений {"aps":{ ...

    }} {"aps":{ ... }} production: com.other.app сокет {"aps":{ ... }} sandbox: com.some.app сокет {"aps":{ ... }} {"aps":{ ... }} В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 10 / 20
  10. Шифрование пакетов Transport Layer Security потомок ветки протоколов SSL инициация

    соединения происходит при помощи “рукопожатия” выбор лучшего алгоритма шифрования, поддерживаемого обеими сторонами отправка клиенту сертификата и открытого ключа генерация случайного числа и передача в зашифрованном виде открытым ключом генерация сессийного ключа при правильном “рукопожатии” начинается обмен криптованными данными при помощи сессийного ключа поддерживает порядка 10 симметричных/ассиметричных алгоритмов и хеш-функции Реализации OpenSSL, GnuTLS, NSS, JSSE В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 11 / 20
  11. Путь сертификата 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
  12. демонстрация кода сервера на 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
  13. демонстрация кода сервера на 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
  14. Сервер XML и JSON С помощью сервиса HTTPush (http://httpush.com/) можно

    значительно упростить взаимодействие с клиентами HTTPush предоставляет простой JSON или XML API для передачи уведомлений на iPhone. В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 16 / 20
  15. Возможности 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
  16. HTTPush условия использования неограниченное число приложений неограниченное число пользователей (у

    одной учетной записи) Sandbox 1000 уведомлений в месяц бесплатно Production 1000 уведомлений в месяц 1€ предоплата приобретенные уведомления действителны в течение 3-х месяцев уведомления действительны для всех приложений и пользователей (можно делится с друзьями) В. Пузанов и В. Кириллов (Hack&Dev) Push-уведомления 18 июля 2009 18 / 20
  17. Итак, для того, чтобы рассказать Вам про PUSH мы: написали

    больше 6 демо-программ, используя порядка 8 языков использовав при этом 3 операционные системы 2 текстовых редактора сделали презентацию в TEX(Beamer) и показали её на IBM, а не на MacBook ;) выпили литр кофе спорили только по поводу хранения исходников презентации в KOI8-R или Unicode выложили материалы в открытый доступ Спасибо за внимание, задавайте вопросы Материалы презентации доступны по адресу: http://iphone.hackndev.org/iphonedevcampua © 2009 Hack&Dev Team