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) се још увек користи у legacy пројектима, али захтева годишњу замену и посебне сертификате за 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 KB за обична обавештења и 5 KB за 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 KB, зато избегавајте пренос великих количина података путем 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) — такав token треба уклонити са сервера, јер је апликација уклоњена са уређаја.
APNS враћа HTTP статусе за сваки захтев за слање. Успешно слање — статус 200. Грешке захтевају различите стратегије обраде. BadDeviceToken (400) или Unregistered (410) — token уређаја је застарео, треба га уклонити са сервера. PayloadTooLarge (413) — прекорачен лимит од 4 KB, скратите payload.
Грешка 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 грешака са навођењем token-а, кода грешке и времена. Ово ће помоћи да се брзо идентификују проблеми са сертификатима, квотама или специфичним token-има уређаја. Редовно проверавајте рок трајања сертификата ако користите 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 се може променити при: враћању апликације из резервне копије, поновној инсталацији апликације, ажурирању оперативног система, ресетовању мрежних подешавања. Token се не мења при уобичајеним ажурирањима апликације путем App Store-а. Сервер треба да третира грешку BadDeviceToken (400) као сигнал за уклањање token-а.
4 KB (4096 бајтова) за обична alert/background обавештења. За VOIP путем PushKit-а — 5 KB (5120 бајтова). Прекорачење величине враћа грешку PayloadTooLarge (413). Препоручује се да payload буде минималан и да се додатни подаци учитавају путем сервера.
APNS не може доставити обавештење на уређај без интернет везе. Ако је уређај ван мреже, APNS чува последњу поруку (per app per device) до 28 дана. При успостављању везе порука се доставља одмах. Старије поруке се не чувају.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође