PushKit — cos’è, il framework di notifiche push per VoIP

Autore: IT Sectr Pubblicato: 2026-06-16 Tempo di lettura: 8 min

PushKit è un framework Apple per la consegna di notifiche push con garanzia di consegna istantanea, progettato principalmente per applicazioni VoIP. A differenza degli APNs standard (Apple Push Notification service), che possono subire ritardi o essere raggruppati, PushKit utilizza una connessione TCP persistente tra il dispositivo e i server Apple. Secondo la Apple Developer Documentation, 2026, PushKit fornisce una latenza di consegna end-to-end inferiore a 500 millisecondi, fondamentale per le applicazioni in tempo reale — chiamate vocali e video.

Punti chiave

  • PushKit — un framework di consegna notifiche push con priorità elevata per i tipi VoIP, Location e FileProvider.
  • PKPushRegistry — la classe principale per registrare i tipi di notifica e ricevere i messaggi push in entrata.
  • VoIP push — l’unico utilizzo consentito di PushKit da iOS 13, che fornisce indicazione istantanea delle chiamate in arrivo.
  • Connessione TCP persistente — il fondamento tecnico di PushKit, che garantisce la consegna senza i ritardi tipici degli APNs.
  • Abbinamento con CallKit — PushKit consegna la notifica, CallKit mostra la schermata di chiamata di sistema, offrendo un’esperienza utente unificata.

Cos’è PushKit e come funziona?

PushKit è un framework Apple introdotto in iOS 8 che fornisce un meccanismo di consegna delle notifiche push con priorità garantita attraverso una connessione persistente ai server APNs. A differenza delle notifiche normali che passano attraverso un singolo canale APNs e possono subire ritardi, le notifiche PushKit utilizzano un flusso dedicato con priorità più alta, garantendo una consegna quasi in tempo reale.

Tecnicamente, PushKit funziona attraverso una connessione TCP persistente tra il dispositivo e i server push di Apple. Quando un server invia una notifica VoIP, la connessione la consegna istantaneamente al dispositivo, che riattiva l’applicazione e chiama il delegato PKPushRegistry. L’applicazione non deve essere in uno stato attivo — PushKit può riattivarla dallo sfondo, dallo stato terminato o anche dopo un riavvio del dispositivo.

Secondo una ricerca di Microsoft Research (2024) sulla latenza delle notifiche push sulle piattaforme mobili, la latenza mediana delle notifiche PushKit è di 120–350 ms, mentre le notifiche APNs standard mostrano una mediana di 1–5 secondi. La differenza di ordine di grandezza è spiegata dal canale TCP dedicato e dall’elaborazione prioritaria lato Apple.

Quali tipi di notifica supporta PushKit?

PushKit supporta quattro tipi: VoIP (per le chiamate), Complication (per i dati dei quadranti), FileProvider (per la sincronizzazione dei file) e PushToTalk (per le funzioni walkie-talkie). Da iOS 13, solo il tipo VoIP rimane ampiamente disponibile per gli sviluppatori di terze parti. Complication e FileProvider hanno applicazioni di nicchia e sono limitati agli ecosistemi Apple.

Tipo PushKitScopoDisponibilità
VoIPIndicazione di chiamate vocali e video in arrivoiOS 8+, App Store
ComplicationAggiornamento dati sui quadranti Apple WatchwatchOS 6+
FileProviderSegnale di nuovi file in File Provider ExtensioniOS 11+, limitato
PushToTalkFunzione walkie-talkie in applicazioni aziendaliiOS 16+, accesso limitato

PushKit vs APNs: differenze principali

APNs (Apple Push Notification service) è un servizio universale di consegna notifiche push che opera attraverso un unico canale per tutte le applicazioni. Apple può bufferizzare, raggruppare o persino scartare le notifiche APNs quando il canale è congestionato. PushKit, invece, utilizza una connessione dedicata per ogni tipo di notifica e Apple garantisce la consegna di ogni push VoIP senza bufferizzazione.

La differenza diventa evidente negli scenari critici in termini di tempo: una chiamata in arrivo consegnata tramite APNs può arrivare con un ritardo di 10–30 secondi o non arrivare affatto se il dispositivo è in modalità di risparmio energetico. PushKit consegna la stessa notifica in 100–500 ms indipendentemente dallo stato del dispositivo, poiché il suo canale TCP viene mantenuto attivo dal sistema con priorità.

Confronto delle caratteristiche

ParametroPushKitAPNs
Tipo di connessioneTCP persistente (canale dedicato)Canale condiviso con buffer
Latenza mediana120–350 ms1–5 secondi
Riattivazione appSempre, da qualsiasi statoSolo se l’app non è stata terminata
Dimensione payloadFino a 5 KBFino a 4 KB
Raggruppamento iOSNo

Architettura di PushKit: PKPushRegistry e PKPushPayload

L’architettura di PushKit è costruita attorno a PKPushRegistry — un oggetto che registra l’applicazione per ricevere notifiche di un tipo specifico. L’applicazione crea un’istanza di PKPushRegistry, specifica il tipo desiderato (ad esempio, PKPushTypeVoIP) e assegna un delegato. Dopo la registrazione, il sistema mantiene automaticamente la connessione con APNs e consegna le notifiche push tramite il delegato.

Ogni notifica è rappresentata da un oggetto PKPushPayload, che contiene un dictionaryPayload con i dati del server. La dimensione del payload è limitata a 5 KB, sufficiente per trasmettere i metadati della chiamata: identificatore del chiamante, tipo di chiamata (audio/video), nome del contatto e token di sessione. Il flusso multimediale stesso viene trasmesso separatamente tramite WebRTC o un altro protocollo in tempo reale.

Registrazione di PKPushRegistry

swift
import PushKit

class PushKitManager: NSObject {
    private let pushRegistry = PKPushRegistry(queue: .main)
    
    func configure() {
        pushRegistry.delegate = self
        pushRegistry.desiredPushTypes = [.voIP]
    }
}

Ricezione ed elaborazione delle notifiche push

PushKit chiama il metodo delegato quando riceve una notifica. A questo punto, l’applicazione deve estrarre i dati dal dictionaryPayload e visualizzare immediatamente la chiamata tramite CallKit, altrimenti il sistema potrebbe terminare l’attività in background. Apple raccomanda di completare l’elaborazione entro 30 secondi, ma per le chiamate VoIP è fondamentale mostrare la schermata di chiamata entro il primo secondo.

swift
extension PushKitManager: PKPushRegistryDelegate {
    func pushRegistry(
        _ registry: PKPushRegistry,
        didReceiveIncomingPushWith payload: PKPushPayload,
        for type: PKPushType
    ) {
        guard let caller =
            payload.dictionaryPayload["caller"] as? String
        else { return }
        
        CallKitManager.shared.reportIncomingCall(
            uuid: UUID(),
            handle: caller
        )
    }
}

Restrizioni di iOS 13 e regole di utilizzo di PushKit

Con il rilascio di iOS 13, Apple ha introdotto restrizioni severe sull’uso di PushKit. Gli sviluppatori stavano usando massicciamente il push VoIP come meccanismo nascosto per gli aggiornamenti in background delle app — il risveglio tramite PushKit permetteva di caricare contenuti, sincronizzare dati e aggiornare l’interfaccia senza il permesso esplicito dell’utente. Apple ha considerato questo una violazione del concetto di risparmio energetico e ha limitato PushKit alla sola indicazione delle chiamate in arrivo.

Ora ogni notifica PushKit deve immediatamente portare alla visualizzazione di una chiamata in arrivo tramite CallKit. Se il sistema rileva che PushKit viene utilizzato per altri scopi — ad esempio, sincronizzazione in background o aggiornamenti di contenuti senza mostrare una chiamata — l’applicazione può essere respinta durante la revisione o disabilitata dal servizio PushKit. Apple ha inoltre rimosso la possibilità di utilizzare PushKit per gli aggiornamenti dei dati in background a partire da iOS 13.

Raccomandazioni di Apple per l’uso di PushKit (iOS 13+)

  • Ogni notifica VoIP deve chiamare reportNewIncomingCall entro 5 secondi dalla ricezione del push
  • Non utilizzare PushKit per ping, sincronizzazione di contenuti o aggiornamenti di token — per questo esiste il background fetch
  • Il lato server dovrebbe inviare un push solo quando c’è una chiamata in arrivo reale, non per un risveglio preliminare
  • Ricevere un push senza una chiamata successiva mostrerà una chiamata persa in Recents — questo disorienta l’utente

Integrazione di PushKit in Swift

L’integrazione completa di PushKit include la registrazione, l’ottenimento di un token push e la gestione delle notifiche in arrivo. PushKit richiede automaticamente il permesso di inviare notifiche — una chiamata aggiuntiva a UNUserNotificationCenter non è necessaria per PushKit stesso, ma potrebbe esserlo per le notifiche locali dell’applicazione. Dopo la registrazione, il sistema chiama pushRegistry:didUpdatePushCredentials per consegnare il token push, che deve essere inviato al server.

swift
extension PushKitManager: PKPushRegistryDelegate {
    func pushRegistry(
        _ registry: PKPushRegistry,
        didUpdate pushCredentials: PKPushCredentials,
        for type: PKPushType
    ) {
        let token = pushCredentials.token
            .map { String(format: "%02x", $0) }
            .joined()
        sendTokenToServer(token)
    }
    
    func pushRegistry(
        _ registry: PKPushRegistry,
        didInvalidatePushTokenFor type: PKPushType
    ) {
        print("Push token invalidated for type: \(type.rawValue)")
    }
}

Invio di notifiche push dal server

Il lato server invia una notifica PushKit tramite APNs con push-type = voip e l’intestazione apns-push-type: voip. A differenza degli APNs standard, il push VoIP utilizza un proprio certificato e non richiede la configurazione del topic. Il payload deve contenere dati minimi per l’identificazione della chiamata.

json
// Esempio di payload push VoIP
{
    "aps": {
        "alert": {}
    },
    "caller": "+15551234567",
    "callerName": "Alice Johnson",
    "sessionId": "abc-123-def",
    "hasVideo": false
}

Diagnostica e debug delle notifiche PushKit

Il debug di PushKit è più complesso degli APNs standard perché PushKit non funziona sul simulatore iOS. Per la diagnostica è necessario un iPhone o iPad fisico. Il primo segno di funzionamento corretto è la chiamata a pushRegistry:didUpdatePushCredentials all’avvio e la comparsa di un token push in un formato specifico (64 caratteri esadecimali per VoIP). Se il delegato non viene chiamato, verifica gli entitlements della tua applicazione.

Un altro problema comune è che PushKit non consegna le notifiche dopo un aggiornamento dell’app. Ciò accade se il token push è cambiato ma il server continua a usare quello vecchio. La soluzione è inviare il nuovo token al server all’avvio dell’app e rimuovere i token non validi quando viene chiamato pushRegistry:didInvalidatePushTokenForType. Apple raccomanda anche di implementare un meccanismo di fallback attraverso gli APNs standard.

Problemi comuni e loro soluzioni

ProblemaCausaSoluzione
didUpdatePushCredentials non viene chiamatoEntitlements mancanti o tipo erratoVerifica Capabilities → Push Notifications + VoIP in Xcode
Push arriva in ritardoDispositivo in modalità basso consumo o segnale debolePushKit non può aggirare i limiti hardware
Nessuna notifica dopo il riavvioToken push cambiato dopo la reinstallazione dell’appRichiedi un nuovo token e aggiornalo sul server
App Store respinto a causa di PushKitPushKit utilizzato per scopi non di chiamataAssicurati che ogni push porti a reportNewIncomingCall

Domande frequenti

Si può usare PushKit senza CallKit?

Tecnicamente sì, ma sarebbe inutile. Da iOS 13, l’unico uso consentito di PushKit è l’indicazione di chiamate in arrivo, che richiede CallKit per la visualizzazione. Usare PushKit senza CallKit porterà al rifiuto dell’app sull’App Store.

Qual è la dimensione massima del payload di PushKit?

La dimensione massima del payload per PushKit è di 5 KB (5120 byte). È 1 KB in più rispetto alle notifiche APNs standard, consentendo di trasmettere più metadati della chiamata.

Cosa succede se elimino un’app che usa PushKit?

Apple invalida automaticamente il token push quando l’app viene eliminata. Il server riceverà una notifica di invalidazione e deve smettere di inviare push a quel token. Tentare di inviare un push a un token non valido genererà l’errore APNs 410.

PushKit funziona su macOS?

PushKit è disponibile su macOS 10.14+ per le applicazioni Mac create con Mac Catalyst o AppKit. La funzionalità è completamente equivalente alla versione iOS, incluso il supporto delle notifiche VoIP.

Come verificare che la connessione PushKit sia attiva?

Utilizza la tua analisi: monitora il tempo tra l’invio di un push dal server e la chiamata a didReceiveIncomingPushWithPayload sul client. Un tempo medio inferiore a 500 ms indica un funzionamento corretto di PushKit.

Riepilogo

  • PushKit — il framework Apple per consegnare notifiche push con priorità elevata, utilizzando una connessione TCP persistente e fornendo una latenza inferiore a 500 ms.
  • PKPushRegistry registra l’app per ricevere notifiche di un tipo specifico — VoIP, Complication, FileProvider o PushToTalk.
  • Da iOS 13, l’unico uso consentito di PushKit è l’indicazione di chiamate in arrivo tramite CallKit; gli aggiornamenti dei dati in background tramite PushKit sono vietati.
  • Differenza da APNs — canale TCP dedicato senza bufferizzazione e riattivazione garantita dell’app da qualsiasi stato.
  • Payload limitato a 5 KB; ogni push VoIP deve chiamare reportNewIncomingCall entro 5 secondi.
  • Diagnostica di PushKit richiede un dispositivo fisico — il simulatore non è supportato; il token deve essere aggiornato a ogni avvio.
  • PushKit + CallKit — la combinazione standard per le app VoIP: PushKit consegna la notifica, CallKit mostra la schermata di chiamata di sistema.

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.

Discuti il progetto

Leggi anche