APNS (Apple Push Notification Service) è il servizio infrastrutturale di Apple per la consegna di notifiche push ai dispositivi dell’ecosistema: iPhone, iPad, Mac, Apple Watch e Apple TV. Il servizio garantisce una consegna affidabile dei messaggi attraverso una connessione TLS persistente tra il dispositivo e i server Apple. Secondo la Documentazione Sviluppatore Apple, APNS utilizza il protocollo HTTP/2 per la comunicazione bidirezionale con i server applicativi.
Punti Chiave
Apple Push Notification Service (APNS) è il servizio proprietario di Apple per instradare le notifiche push dal server applicativo ai dispositivi degli utenti. A differenza di FCM, APNS non supporta Android o altre piattaforme — è completamente legato all’ecosistema Apple.
Il servizio opera attraverso una connessione TLS persistente che ogni dispositivo Apple stabilisce con i server APNS all’avvio. Questa connessione viene mantenuta in background e utilizzata per consegnare le notifiche con latenza minima.
APNS gestisce l’intera infrastruttura di consegna: crittografia, autenticazione, prioritizzazione e ritrasmissione quando il dispositivo non è disponibile. Lo sviluppatore deve solo fornire un payload correttamente formattato e un token push valido.
Originariamente, APNS funzionava tramite un protocollo binario sulle porte 2195–2196. Dal 2015, Apple ha migrato il servizio al moderno protocollo HTTP/2, che supporta multiplexing, compressione degli header e notifiche push dal server. HTTP/2 è diventato obbligatorio nel giugno 2020.
Il processo di consegna delle notifiche push tramite APNS si compone di cinque fasi: registrazione del dispositivo, ottenimento del token push, invio della richiesta dal server, routing APNS e consegna al dispositivo.
Se il dispositivo è non disponibile (spento o senza rete), APNS memorizza l’ultimo messaggio per ciascuna app e lo consegna al ripristino della connessione. La durata massima di memorizzazione è di 4 settimane, dopo le quali il messaggio viene eliminato.
Apple supporta due metodi per autenticare il server applicativo durante l’invio di notifiche push. Ogni metodo ha le proprie caratteristiche in termini di periodo di validità, gestione e facilità d’uso.
| Parametro | Basato su Token (p8) | Basato su Certificato (.p12) |
|---|---|---|
| Validità | Illimitata (la chiave non scade) | Limitata alla validità del certificato (di solito 1 anno) |
| Rotazione | Non necessaria a meno che la chiave non sia compromessa | Sostituzione annuale obbligatoria |
| Multi-app | Una chiave per tutte le app dell’account | Certificato separato per ciascuna app |
| Ambiente | Una chiave per Sandbox e Production | Certificati diversi per Sandbox e Production |
L’autenticazione basata su Token è il metodo raccomandato da Apple dal 2019. Crei un’unica chiave p8 nella Apple Developer Console, la carichi sul tuo server e firmi ogni richiesta APNS con essa. La chiave non scade mai e funziona per tutte le app del tuo account.
Per i nuovi progetti, l’autenticazione basata su Token è chiaramente preferibile: una chiave p8 per l’intero account, illimitata, senza vincoli di ambiente. Il metodo basato su Certificato (.p12) è ancora utilizzato in progetti legacy ma richiede sostituzione annuale e certificati separati per Sandbox e Production. Considera la scadenza del certificato quando pianifichi CI/CD.
APNS supporta tre tipi di notifiche push, che differiscono per comportamento sul dispositivo e requisiti degli attributi della richiesta. La scelta del tipo dipende dallo scenario UX e dall’urgenza del messaggio.
Per le notifiche Background, devi specificare la chiave content-available: 1 e impostare la priorità su 5 (consegna efficiente dal punto di vista energetico). Il sistema può limitare il numero di notifiche in background se l’app non le elabora tempestivamente.
APNS supporta due valori di priorità: 10 (consegna immediata) e 5 (efficiente dal punto di vista energetico). Per le notifiche alert, usa 10 — l’utente deve riceverle immediatamente. Per le notifiche background, usa 5 — il sistema può ritardare la consegna per risparmiare batteria. Una priorità errata per background può portare al rifiuto di APNS.
APNS accetta payload in formato JSON con dimensione massima di 4 KB per le notifiche regolari e 5 KB per VOIP. Il payload contiene il dizionario aps obbligatorio con le impostazioni di visualizzazione e campi personalizzati opzionali.
{
"aps": {
"alert": {
"title": "Nuovo messaggio",
"body": "Hai 3 chat non lette"
},
"badge": 3,
"sound": "default",
"category": "message_category",
"thread-id": "chat_room_42"
},
"customData": {
"chatId": "42"
}
}
La chiave thread-id raggruppa le notifiche nel Centro Notifiche iOS. La chiave category collega la notifica a una UNNotificationCategory per mostrare i pulsanti di azione. Senza queste chiavi, tutte le notifiche vengono visualizzate singolarmente.
Oltre al dizionario aps obbligatorio, il payload APNS può contenere qualsiasi campo personalizzato al livello superiore. Questi campi sono accessibili all’app tramite il dizionario userInfo durante l’elaborazione della notifica. I dati personalizzati sono utili per passare identificatori di entità, schermate o collegamenti. La dimensione massima del payload è di 4 KB, quindi evita di trasferire grandi volumi di dati tramite push; caricali tramite API dopo aver aperto la notifica.
Per inviare una notifica push dal server, devi eseguire una richiesta POST all’endpoint APNS con gli header di autenticazione corretti. Di seguito un esempio in Node.js che utilizza l’autenticazione basata su Token.
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: "Ciao!", body: "Push di test" } }
})
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 inviato con successo")
}
})
Dopo l’invio, APNS restituisce lo stato HTTP 200 in caso di consegna riuscita o un codice di errore con descrizione nel corpo della risposta. È importante gestire gli errori token-unregistered (410) — questi token devono essere rimossi dal server, poiché l’app è stata eliminata dal dispositivo.
APNS restituisce codici di stato HTTP per ogni richiesta di invio. La consegna riuscita restituisce lo stato 200. Gli errori richiedono diverse strategie di gestione. BadDeviceToken (400) o Unregistered (410) — il token del dispositivo è obsoleto e deve essere rimosso dal server. PayloadTooLarge (413) — il limite di 4 KB è stato superato, riduci il payload.
TooManyRequests (429) — limite di richieste superato. APNS imposta una quota sul numero di invii al secondo. Quando ricevi 429, implementa un backoff esponenziale (exponential backoff) e riprova. Si raccomanda di non superare 100 richieste al secondo per connessione HTTP/2.
Errori lato APNS — 500 e 503 (Errore Interno del Server / Servizio Non Disponibile). Sono guasti temporanei dell’infrastruttura Apple. In questi casi, riprova con un ritardo di 1–5 secondi, non più di 3 tentativi. Errori 5xx persistenti con un server completamente operativo sono rari e solitamente legati a problemi di connessione TLS.
Per gli ambienti di Production, assicurati di implementare la registrazione di tutti gli errori APNS con token, codice di errore e ora. Ciò aiuterà a identificare rapidamente problemi con certificati, quote o token di dispositivi specifici. Controlla regolarmente le date di scadenza dei certificati se utilizzi l’autenticazione basata su Certificato.
Domande Frequenti
APNS funziona tramite la porta TCP 443 (HTTPS) per l’API HTTP/2. In precedenza, le porte 2195 e 2196 venivano utilizzate per il protocollo binario. Da giugno 2020, Apple richiede l’uso esclusivo di HTTP/2 sulla porta 443. Assicurati che il tuo server abbia accesso a api.push.apple.com.
Sandbox è l’ambiente di test APNS per il debug delle notifiche push. Production è l’ambiente reale per gli utenti finali. Con l’autenticazione basata su Token, una chiave funziona per entrambi gli ambienti — l’endpoint differisce: api.sandbox.push.apple.com o api.push.apple.com.
Il token push può cambiare in caso di: ripristino dell’app da un backup, reinstallazione dell’app, aggiornamento del sistema operativo, ripristino delle impostazioni di rete. Il token non cambia durante gli aggiornamenti regolari dell’app tramite App Store. Il server deve gestire l’errore BadDeviceToken (400) come segnale per rimuovere il token.
4 KB (4096 byte) per le notifiche alert/background regolari. Per le notifiche VOIP tramite PushKit — 5 KB (5120 byte). Il superamento della dimensione restituisce un errore PayloadTooLarge (413). Si raccomanda di mantenere il payload minimo e caricare dati aggiuntivi tramite il server.
APNS non può consegnare una notifica a un dispositivo senza connessione internet. Se il dispositivo è offline, APNS memorizza l’ultimo messaggio (per app per dispositivo) fino a 28 giorni. Quando la connessione viene ripristinata, il messaggio viene consegnato immediatamente. I messaggi più vecchi non vengono conservati.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche