APNS (Apple Push Notification Service) — це інфраструктурний сервіс Apple для доставки push-сповіщень на пристрої екосистеми: iPhone, iPad, Mac, Apple Watch та Apple TV. Сервіс забезпечує надійну передачу повідомлень через постійне TLS-з'єднання між пристроєм та серверами Apple. За даними Apple Developer Documentation, APNS використовує протокол HTTP/2 для двосторонньої комунікації з серверами застосунків.
Головне
Apple Push Notification Service (APNS) — це власний сервіс Apple для маршрутизації push-сповіщень від сервера застосунку до пристроїв користувачів. На відміну від FCM, APNS не підтримує Android або інші платформи — він повністю прив'язаний до екосистеми Apple.
Сервіс працює через постійне TLS-з'єднання, яке кожен пристрій Apple встановлює з серверами APNS при запуску. Це з'єднання підтримується у фоновому режимі та використовується для доставки сповіщень з мінімальною затримкою.
APNS бере на себе всю інфраструктуру доставки: шифрування, автентифікацію, пріоритезацію та повторне надсилання у разі недоступності пристрою. Розробнику потрібно лише надати правильно сформований payload та дійсний push token.
Спочатку APNS працював через бінарний протокол на портах 2195–2196. З 2015 року Apple перевела сервіс на сучасний протокол HTTP/2, який підтримує мультиплексування, стиснення заголовків та серверні push-сповіщення. HTTP/2 став обов'язковим з червня 2020 року.
Процес доставки push-сповіщення через APNS складається з п'яти етапів: реєстрація пристрою, отримання push token, надсилання запиту сервером, маршрутизація APNS та доставка на пристрій.
Якщо пристрій недоступний (вимкнено або немає мережі), APNS зберігає останнє повідомлення для кожного застосунку та доставляє його при відновленні з'єднання. Максимальний термін зберігання — 4 тижні, після чого повідомлення видаляється.
Apple підтримує два способи автентифікації сервера застосунку при надсиланні push-сповіщень. Кожен спосіб має свої особливості щодо терміну дії, управління та зручності використання.
| Параметр | Token-based (p8) | Certificate-based (.p12) |
|---|---|---|
| Термін дії | Безстроковий (ключ не закінчується) | Обмежений терміном сертифіката (зазвичай 1 рік) |
| Ротація | Не потрібна, якщо ключ не скомпрометовано | Обов'язкова щорічна заміна |
| Мультизастосунковість | Один ключ для всіх застосунків облікового запису | Окремий сертифікат для кожного застосунку |
| Середовище | Один ключ для Sandbox та Production | Різні сертифікати для Sandbox та Production |
Token-based автентифікація — рекомендований Apple спосіб з 2019 року. Ви створюєте один ключ p8 в Apple Developer Console, завантажуєте його на сервер та підписуєте ним кожен APNS-запит. Ключ не закінчується та працює для всіх застосунків вашого облікового запису.
Для нових проєктів Token-based автентифікація однозначно краща: один ключ p8 на весь обліковий запис, безстроковий, без прив'язки до середовища. Certificate-based (.p12) все ще використовується в застарілих проєктах, але вимагає щорічної заміни та окремих сертифікатів для Sandbox та Production. Враховуйте термін дії сертифіката при плануванні CI/CD.
APNS підтримує три типи push-сповіщень, які відрізняються за поведінкою на пристрої та вимогами до атрибутів запиту. Вибір типу залежить від UX-сценарію та терміновості повідомлення.
Для Background сповіщень необхідно вказати ключ content-available: 1 та встановити пріоритет 5 (енергоефективна доставка). Система може обмежити кількість фонових сповіщень, якщо застосунок не обробляє їх своєчасно.
APNS підтримує два значення пріоритету: 10 (негайна доставка) та 5 (енергоефективна). Для alert-сповіщень використовуйте 10 — користувач повинен отримати їх одразу. Для background-сповіщень використовуйте 5 — система може затримати доставку для економії батареї. Некоректний пріоритет для background може призвести до відхилення сповіщення APNS.
APNS приймає payload у форматі JSON з максимальним розміром 4 КБ для звичайних сповіщень та 5 КБ для VOIP. Payload містить обов'язковий словник aps з налаштуваннями відображення та опціональні кастомні поля.
{
"aps": {
"alert": {
"title": "Нове повідомлення",
"body": "У вас 3 непрочитаних чати"
},
"badge": 3,
"sound": "default",
"category": "message_category",
"thread-id": "chat_room_42"
},
"customData": {
"chatId": "42"
}
}
Ключ thread-id об'єднує сповіщення в групи в Центрі сповіщень iOS. Ключ category пов'язує сповіщення з UNNotificationCategory для показу кнопок дій. Без цих ключів всі сповіщення відображаються окремо.
Окрім обов'язкового словника aps, APNS-пейлоад може містити будь-які кастомні поля на верхньому рівні. Ці поля доступні застосунку через словник userInfo при обробці сповіщення. Кастомні дані зручні для передачі ідентифікаторів сутностей, екранів або посилань. Максимальний розмір пейлоаду — 4 КБ, тому уникайте передачі великих обсягів даних через push; завантажуйте їх через API після відкриття сповіщення.
Для надсилання push-сповіщення на сервері необхідно виконати POST-запит до APNS endpoint з коректними заголовками автентифікації. Нижче наведено приклад на Node.js з використанням Token-based автентифікації.
const http2 = require("http2")
const fs = require("fs")
const jwt = require("jsonwebtoken")
const token = jwt.sign(
{ iss: "TEAM_ID", iat: Math.floor(Date.now() / 1000) },
fs.readFileSync("AuthKey.p8"),
{ algorithm: "ES256", keyid: "KEY_ID" }
)
const payload = JSON.stringify({
aps: { alert: { title: "Привіт!", body: "Тестовий push" } }
})
const client = http2.connect(
"https://api.push.apple.com"
)
const req = client.request({
":method": "POST",
":path": "/3/device/DEVICE_PUSH_TOKEN",
"authorization": "bearer " + token,
"apns-push-type": "alert",
"apns-topic": "com.example.app",
"apns-priority": "10"
})
req.end(payload)
req.on("response", (headers) => {
if (headers[":status"] === 200) {
console.log("Push успішно надіслано")
}
})
Після надсилання APNS повертає HTTP-статус 200 при успішній доставці або код помилки з описом у тілі відповіді. Важливо обробляти помилки token-unregistered (410) — такий токен слід видалити з сервера, оскільки застосунок було видалено з пристрою.
APNS повертає HTTP-статуси для кожного запиту надсилання. Успішна доставка — статус 200. Помилки вимагають різних стратегій обробки. BadDeviceToken (400) або Unregistered (410) — токен пристрою застарів, його потрібно видалити з сервера. PayloadTooLarge (413) — перевищено ліміт 4 КБ, скоротить пейлоад.
Помилка TooManyRequests (429) — перевищено ліміт запитів. APNS встановлює квоту на кількість надсилань за секунду. При отриманні 429 необхідно впровадити експоненційну затримку (exponential backoff) та повторити надсилання. Рекомендується не перевищувати 100 запитів за секунду на одне з'єднання HTTP/2.
Помилки на стороні APNS — 500 та 503 (Internal Server Error / Service Unavailable). Це тимчасові збої інфраструктури Apple. В таких випадках повторюйте надсилання із затримкою 1–5 секунд, не більше 3 спроб. Постійні помилки 5xx при повністю робочому сервері — рідкісне явище, зазвичай пов'язане з проблемами TLS-з'єднання.
Для Production-середовища обов'язково реалізуйте логування всіх помилок APNS із зазначенням токена, коду помилки та часу. Це допоможе швидко виявити проблеми з сертифікатами, квотами або конкретними токенами пристроїв. Регулярно перевіряйте термін дії сертифікатів, якщо використовуєте Certificate-based автентифікацію.
Часто задавані питання
APNS працює через TCP 443 (HTTPS) для HTTP/2 API. Раніше використовувалися порти 2195 та 2196 для бінарного протоколу. З червня 2020 року Apple вимагає використання виключно HTTP/2 на порту 443. Переконайтеся, що сервер має доступ до api.push.apple.com.
Sandbox — тестове середовище APNS для налагодження push-сповіщень. Production — бойове середовище для реальних користувачів. З Token-based автентифікацією один ключ працює для обох середовищ — endpoint відрізняється: api.sandbox.push.apple.com або api.push.apple.com.
Push token може змінитися при: відновленні застосунку з бекапу, перевстановленні застосунку, оновленні ОС, скиданні налаштувань мережі. Токен не змінюється при звичайних оновленнях застосунку через App Store. Сервер повинен обробляти помилку BadDeviceToken (400) як сигнал до видалення токена.
4 КБ (4096 байт) для звичайних alert/background сповіщень. Для VOIP-сповіщень через PushKit — 5 КБ (5120 байт). Перевищення розміру повертає помилку PayloadTooLarge (413). Рекомендується тримати payload мінімальним та підвантажувати додаткові дані через сервер.
APNS не може доставити сповіщення на пристрій без інтернет-з'єднання. Якщо пристрій офлайн, APNS зберігає останнє повідомлення (per app per device) до 28 днів. При відновленні з'єднання повідомлення доставляється негайно. Старіші повідомлення не зберігаються.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також