APNS (Apple Push Notification Service) — infrastrukturní služba Apple pro doručování push oznámení na zařízení ekosystému: iPhone, iPad, Mac, Apple Watch a Apple TV. Služba zajišťuje spolehlivý přenos zpráv prostřednictvím trvalého TLS připojení mezi zařízením a servery Apple. Podle Apple Developer Documentation používá APNS protokol HTTP/2 pro obousměrnou komunikaci s aplikačními servery.
Hlavní body
Apple Push Notification Service (APNS) je vlastní služba Apple pro směrování push oznámení z aplikačního serveru na zařízení uživatelů. Na rozdíl od FCM nepodporuje APNS Android ani jiné platformy — je plně vázáno na ekosystém Apple.
Služba funguje prostřednictvím trvalého TLS připojení, které každé zařízení Apple naváže se servery APNS při zapnutí. Toto připojení je udržováno na pozadí a používá se k doručování oznámení s minimálním zpožděním.
APNS přebírá veškerou infrastrukturu doručování: šifrování, autentizaci, prioritizaci a opětovné odeslání v případě nedostupnosti zařízení. Vývojář potřebuje pouze poskytnout správně vytvořené payload a platný push token.
Původně APNS fungoval prostřednictvím binárního protokolu na portech 2195–2196. Od roku 2015 Apple převedl službu na moderní protokol HTTP/2, který podporuje multiplexování, kompresi hlaviček a serverová push oznámení. HTTP/2 se stal povinným od června 2020.
Proces doručení push oznámení přes APNS se skládá z pěti fází: registrace zařízení, získání push tokenu, odeslání požadavku serverem, směrování APNS a doručení na zařízení.
Pokud je zařízení nedostupné (vypnuté nebo bez sítě), APNS uloží poslední zprávu pro každou aplikaci a doručí ji po obnovení připojení. Maximální doba uložení je 4 týdny, poté je zpráva smazána.
Apple podporuje dva způsoby autentizace aplikačního serveru při odesílání push oznámení. Každý způsob má své vlastnosti týkající se doby platnosti, správy a snadnosti použití.
| Parametr | Token-based (p8) | Certificate-based (.p12) |
|---|---|---|
| Doba platnosti | Neomezená (klíč nevyprší) | Omezena platností certifikátu (obvykle 1 rok) |
| Rotace | Není vyžadována, pokud klíč není kompromitován | Povinná každoroční výměna |
| Více aplikací | Jeden klíč pro všechny aplikace účtu | Samostatný certifikát pro každou aplikaci |
| Prostředí | Jeden klíč pro Sandbox a Production | Různé certifikáty pro Sandbox a Production |
Token-based autentizace — doporučený způsob Applem od roku 2019. Vytvoříte jeden p8-klíč v Apple Developer Console, nahrajete jej na server a podepisujete jím každý APNS požadavek. Klíč nevyprší a funguje pro všechny aplikace vašeho účtu.
Pro nové projekty je Token-based autentizace jednoznačně výhodnější: jeden p8-klíč pro celý účet, neomezená platnost, bez vazby na prostředí. Certificate-based (.p12) se stále používá ve starších projektech, ale vyžaduje každoroční výměnu a samostatné certifikáty pro Sandbox a Production. Zohledněte vypršení certifikátu při plánování CI/CD.
APNS podporuje tři typy push oznámení, které se liší chováním na zařízení a požadavky na atributy požadavku. Výběr typu závisí na UX scénáři a naléhavosti zprávy.
Pro Background oznámení je nutné nastavit klíč content-available: 1 a prioritu 5 (energeticky úsporné doručení). Systém může omezit počet oznámení na pozadí, pokud je aplikace nezpracovává včas.
APNS podporuje dvě hodnoty priority: 10 (okamžité doručení) a 5 (energeticky úsporné). Pro alert oznámení použijte 10 — uživatel by je měl obdržet ihned. Pro background oznámení použijte 5 — systém může doručení zpozdit kvůli úspoře baterie. Nesprávná priorita pro background může vést k zamítnutí oznámení APNS.
APNS přijímá payload ve formátu JSON s maximální velikostí 4 KB pro běžná oznámení a 5 KB pro VOIP. Payload obsahuje povinný slovník aps s nastavením zobrazení a volitelná vlastní pole.
{
"aps": {
"alert": {
"title": "Nová zpráva",
"body": "Máte 3 nepřečtené chaty"
},
"badge": 3,
"sound": "default",
"category": "message_category",
"thread-id": "chat_room_42"
},
"customData": {
"chatId": "42"
}
}
Klíč thread-id sdružuje oznámení do skupin v Centru oznámení iOS. Klíč category propojuje oznámení s UNNotificationCategory pro zobrazení tlačítek akcí. Bez těchto klíčů se všechna oznámení zobrazují jednotlivě.
Kromě povinného slovníku aps může APNS payload obsahovat libovolná vlastní pole na nejvyšší úrovni. Tato pole jsou aplikaci k dispozici prostřednictvím slovníku userInfo při zpracování oznámení. Vlastní data jsou užitečná pro přenos identifikátorů entit, obrazovek nebo odkazů. Maximální velikost payloadu je 4 KB, proto se vyhněte přenosu velkých objemů dat přes push; načtěte je přes API po otevření oznámení.
Pro odeslání push oznámení na serveru je nutné provést POST požadavek na APNS endpoint se správnými hlavičkami autentizace. Níže je uveden příklad v Node.js s použitím Token-based autentizace.
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: "Ahoj!", body: "Testovací 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 odeslán úspěšně")
}
})
Po odeslání APNS vrátí HTTP stav 200 při úspěšném doručení nebo kód chyby s popisem v těle odpovědi. Je důležité zpracovávat chybu token-unregistered (410) — takový token by měl být odstraněn ze serveru, protože aplikace byla odebrána ze zařízení.
APNS vrací HTTP stavy pro každý požadavek na odeslání. Úspěšné odeslání — stav 200. Chyby vyžadují různé strategie zpracování. BadDeviceToken (400) nebo Unregistered (410) — token zařízení je zastaralý, je třeba jej odstranit ze serveru. PayloadTooLarge (413) — překročen limit 4 KB, zmenšete payload.
Chyba TooManyRequests (429) — překročen limit požadavků. APNS stanovuje kvótu na počet odeslání za sekundu. Při obdržení 429 je nutné zavést exponenciální zpoždění (exponential backoff) a odeslání opakovat. Doporučuje se nepřekračovat 100 požadavků za sekundu na jedno HTTP/2 připojení.
Chyby na straně APNS — 500 a 503 (Internal Server Error / Service Unavailable). Jedná se o dočasné výpadky infrastruktury Apple. V takových případech opakujte odeslání se zpožděním 1–5 sekund, maximálně 3 pokusy. Trvalé chyby 5xx při plně funkčním serveru jsou vzácným jevem, obvykle souvisejí s problémy TLS připojení.
Pro produkční prostředí nezapomeňte implementovat logování všech chyb APNS s uvedením tokenu, kódu chyby a času. To pomůže rychle identifikovat problémy s certifikáty, kvótami nebo konkrétními tokeny zařízení. Pravidelně kontrolujte platnost certifikátů, pokud používáte Certificate-based autentizaci.
Často kladené otázky
APNS funguje přes TCP 443 (HTTPS) pro HTTP/2 API. Dříve se používaly porty 2195 a 2196 pro binární protokol. Od června 2020 Apple vyžaduje výhradní použití HTTP/2 na portu 443. Ujistěte se, že server má přístup k api.push.apple.com.
Sandbox — testovací prostředí APNS pro ladění push oznámení. Production — produkční prostředí pro skutečné uživatele. S Token-based autentizací jeden klíč funguje pro obě prostředí — endpoint se liší: api.sandbox.push.apple.com nebo api.push.apple.com.
Push token se může změnit při: obnovení aplikace ze zálohy, přeinstalování aplikace, aktualizaci OS, resetu síťových nastavení. Token se nemění při běžných aktualizacích aplikace přes App Store. Server by měl zpracovat chybu BadDeviceToken (400) jako signál k odstranění tokenu.
4 KB (4096 bajtů) pro běžná alert/background oznámení. Pro VOIP oznámení přes PushKit — 5 KB (5120 bajtů). Překročení velikosti vrací chybu PayloadTooLarge (413). Doporučuje se udržovat payload minimální a načítat další data přes server.
APNS nemůže doručit oznámení na zařízení bez internetového připojení. Pokud je zařízení offline, APNS ukládá poslední zprávu (pro aplikaci a zařízení) po dobu až 28 dnů. Po obnovení připojení je zpráva doručena okamžitě. Starší zprávy se neukládají.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také