dp_push - Erlang бібліотека для роботи з Apple Push Notification Service
Бібліотека для роботи з APNs від dieselpuppet.com.
APNs - що це і навіщо
Припустимо, у вас проект з клієнт-серверною архітектурою, де в ролі клієнта виступає додаток на iOS пристрої. Ваш чудовий сервер прекрасно спілкується з вашим чудовим додатком, поки воно активно.
Але ось користувач запустив інший додаток, або поклав девайс в кишеню, або виявився десь, де немає WiFi. І на жаль, зв'язку між сервером і вашим додатком більше немає. А сервера потрібно доставити якісь дані, або повідомити про якусь подію.
Замість того, щоб відправляти повідомлення клієнтського додатку, ваш сервер може відправити повідомлення на APNs. А APNs доставить його на iOS пристрій, якщо воно є. Пристрій покаже повідомлення користувачу, і на його вимогу активує потрібну програму.
Як це працює
APNs має хорошу документацію. де описані всі подробиці.
Так само рекомендую чудовий тутор. який дає хороший старт. І, зокрема, розкриває непросту тему сертифікатів :)
dp_push - що це і навіщо
Оскільки працювати з APNs потрібно практично в кожному нашому проекті, вирішено це уніфікувати і винести в окрему бібліотеку Diesel Puppet push. Ніяких таємних секретів в цьому функціонал немає, потрібно просто акуратно його реалізувати. Тому ми сміливо викладаємо модуль в open source, під MIT ліцензією.
Реалізація досить проста, і являє собою OTP-додаток з 4х модулів.
dp_push.erl Головний модуль, запускає додаток і є фасадом до функцій бібліотеки.
dp_push_sup.erl Супервизор, запускає dp_push_sender і стежить, щоб він не падав :)
dp_push_sender.erl gen_server, виконує send запити і працює з feedback сервісом (про який нижче).
dp_push_apns.erl Містить набір низькорівневих функцій для формування пакетів, встановлення SSL з'єднання, відправки даних.
Додаток вимагає деяких налаштувань. Вони, втім, досить очевидні - куди Конект, який сертифікат використовувати, і настройки для feedback сервісу (про який нижче).
device token
Токен має розмір 32 байти, і виглядає приблизно так:
Працюючи з ним в Erlang, потрібно мати на увазі, що це не рядок і не binary. Ось так не правильно:
Це 16-ти розрядне число. Ось так вірно:
feedback сервіс
Все чуйна складніше, ніж спершу здавалося :) Буває таке, що ваш додаток було видалено з девайса, а ви продовжуєте надсилати йому повідомлення. Apple не дуже хочуть, щоб APNs навантажували непотрібними повідомленнями, тому вони вимагають періодично звертатися до їх feedback сервісу. отримувати звідти список таких девайсів, зберігати список у себе і не посилати їм повідомлення.
Ця функціональність теж реалізована в dp_push_sender.erl. Модуль опитує feedback сервіс із заданою частотою і зберігає токени в DETS.
Якщо трохи подумати, то все ще трошки складніше, ніж спершу здавалося :) Буває таке, що після того, як ваш додаток було видалено з девайса, воно було знову на нього встановлено :) Тому повинен бути спосіб видалити токен з DETS. І відповідний метод передбачений в API бібліотеки.
У мене ще є mock_feedback_service.erl. Це заглушка, яка використовувалася для налагодження роботи з feedback service. Бо робити таку налагодження, постійно встановлюючи і видаляючи додаток з девайса дуже вже незручно.
Як підключити dp_push до проекту і як використовувати
Підключаємо як залежність в rebar.config:
І викликаємо API методи:
Як можна dp_push розвивати далі
Запити до APNs можуть бути двох видів: simple і enchanced. На simple запити сервіс нічого не відповідає, а на enchanced відповідає. Можна приймати ці відповіді і, наприклад, як-то обробляти помилки.
Можна зробити dp_push не підключати бібліотекою, а окремим сервером (TCP і / або Web). У цьому випадку він може обслуговувати відразу кілька додатків. Правда йому потрібно буде мати сертифікати для кожної програми і вибирати потрібний сертифікат при відправці повідомлення.
Можна додати збір будь-якої статистики та засоби моніторингу.