PushKit — wat is het, VoIP-meldingen framework voor iOS

Auteur: IT Sectr Gepubliceerd: 2026-03-22 Leestijd: 8 min

PushKit is een iOS-framework voor het leveren van VoIP-meldingen met lage latentie, waarbij de standaard APNs wordt omzeild. Volgens Apple Developer Documentation (2025) garandeert PushKit de levering van oproepen binnen 5 seconden, zelfs op de achtergrond. VoIP-meldingen worden direct verwerkt, zonder dat een banner aan de gebruiker hoeft te worden getoond, waardoor het framework het belangrijkste hulpmiddel is voor messengers en video-apps op iOS.

Belangrijkste punten

  • PushKit — iOS-framework voor het leveren van VoIP-meldingen met prioriteit en lage latentie.
  • Meldingen worden verwerkt zonder bannerweergave — de app wordt op de achtergrond gewekt om de oproep te verwerken.
  • Registratie gebeurt via PKPushRegistry met het type pushType .voIP.
  • Verschil met APNs — PushKit gebruikt geen standaard meldingskanaal en heeft een hogere prioriteit.
  • Beperkingen — PushKit is alleen bedoeld voor VoIP en kan niet worden gebruikt voor gewone pushmeldingen.

Wat is PushKit

PushKit is een framework van Apple, geïntroduceerd in iOS 8, dat pushmeldingen met lage latentie levert voor VoIP-apps. In tegenstelling tot de standaard APNs (Apple Push Notification service) kan PushKit de app op de achtergrond wekken bij een inkomende oproep, zonder een melding aan de gebruiker te tonen. Dit is cruciaal voor spraak- en videoapps — de gebruiker ontvangt de oproep onmiddellijk, zelfs als de app is gesloten. Volgens Apple WWDC 2024 verwerkt PushKit dagelijks meer dan 2 miljard VoIP-meldingen wereldwijd.

Hoe PushKit werkt

Het werkingsmechanisme is gebaseerd op een directe verbinding tussen het apparaat en de Apple-pushserver, waarbij het standaard meldingskanaal wordt omzeild. Wanneer de app-server een VoIP-melding verzendt, gaat deze via een dedicated PushKit-server en wordt met maximale prioriteit aan het apparaat geleverd. Het systeem wekt de app op de achtergrond en roept de delegatenmethode pushRegistry:didReceiveIncomingPushWithPayload:forType: aan. De app ontvangt de payload, verwerkt de oproep en roept de completion handler aan voor bevestiging. De volledige cyclus van verzending tot verwerking duurt maximaal 5 seconden, zoals bevestigd door de Apple-specificatie.

Verschillen tussen PushKit en APNs

Het belangrijkste verschil tussen PushKit en APNs zit in het leveringsmechanisme en de verwerking. APNs gebruikt het standaard meldingskanaal met weergave van een banner, geluid of badge, terwijl PushKit gegevens rechtstreeks aan de app levert zonder visuele melding. Hieronder staat een vergelijkingstabel van de belangrijkste kenmerken.

KenmerkPushKitAPNs
LeveringsprioriteitHoog (directe levering)Gemiddeld (mogelijke vertraging)
App wekkenJa, op de achtergrondAlleen bij klikken op melding
Banner weergevenNeeJa (optioneel)
GebruikVoIP, oproepen, videocommunicatieAlle soorten meldingen
PayloadAlleen JSON, zonder mediaJSON + bijlagen

PushKit ondersteunt ook geen rijke media-bijlagen en kan niet worden gebruikt voor gewone marketingmeldingen. Apple controleert het gebruik van PushKit strikt — de app moet expliciete VoIP-functionaliteit hebben, anders wordt deze afgewezen bij beoordeling. APNs blijft de universele oplossing voor alle andere scenario's.

Registratie en ontvangen van VoIP-meldingen

Om PushKit te gebruiken, moet de app zich registreren via PKPushRegistry met het type pushType .voIP. Registratie gebeurt eenmalig bij de eerste start, waarna het systeem een unieke push-token genereert en via de delegate doorgeeft. Deze token wordt naar de app-server gestuurd voor het later verzenden van VoIP-meldingen. Hieronder staat een voorbeeld van PushKit-registratie en het verkrijgen van een token in Swift.

PushKit-registratie configureren

swift
import PushKit

let registry = PKPushRegistry(queue: DispatchQueue.main)
registry.delegate = self
registry.desiredPushTypes = [.voIP]

// MARK: - PKPushRegistryDelegate
func pushRegistry(
    _ registry: PKPushRegistry,
    didUpdate pushCredentials: PKPushCredentials,
    for type: PKPushType
) {
    let deviceToken = pushCredentials.token
        .map { String.format("%02x", $0) }
        .joined()
    sendVoIPTokenToServer(deviceToken)
}

Na het aanroepen van desiredPushTypes met PKPushType.voIP vraagt het systeem automatisch toestemming om VoIP-meldingen te ontvangen. In de methode pushRegistry:didUpdatePushCredentials:forType: ontvangt de app een device token als Data, die wordt omgezet naar een hex-string en naar de server wordt gestuurd. De token is uniek voor elk apparaat en verandert bij herinstallatie van de app — de server moet token-updates verwerken.

Een inkomende melding ontvangen

swift
func pushRegistry(
    _ registry: PKPushRegistry,
    didReceiveIncomingPushWith payload: PKPushPayload,
    for type: PKPushType,
    completion: @escaping VoidBlock
) {
    guard let caller = payload.dictionaryPayload["caller"] as? String else {
        completion()
        return
    }

    let update = CXCallUpdate()
    update.remoteHandle = CXHandle(type: .generic, value: caller)

    provider.reportNewIncomingCall(
        with: UUID(),
        update: update,
        completion: { error in
            if let error = error {
                print("Call error: \(error)")
            }
            completion()
        }
    )
}

In de methode didReceiveIncomingPushWith ontvangt de app de payload met oproepgegevens. Na het extraheren van de informatie over de beller wordt een CXCallUpdate van het CallKit-framework gemaakt om het inkomende oproepscherm weer te geven. Het is belangrijk om de completion handler aan te roepen na het voltooien van de verwerking — anders kan het systeem het app-proces geforceerd beëindigen wegens tijdoverschrijding. De maximale verwerkingstijd is 30 seconden, waarna iOS de melding als onverwerkt beschouwt.

Inkomende oproepen verwerken met CallKit

PushKit is nauw geïntegreerd met CallKit — het framework voor het weergeven van de systeeminterface voor oproepen op iOS. Wanneer de app een VoIP-melding ontvangt via PushKit, moet deze een CXProvider en CXCallController maken om de oproep te beheren. CallKit toont automatisch het inkomende oproepscherm op het vergrendelingsscherm, zelfs als de app is geminimaliseerd. Hieronder staat een voorbeeld van het configureren van een CallKit-provider.

swift
let config = CXProviderConfiguration(localizedName: "MyApp")
config.supportsVideo = true
config.maximumCallGroups = 1
config.maximumCallsPerCallGroup = 1
config.supportedHandleTypes = [.phoneNumber, .generic]

let provider = CXProvider(configuration: config)
provider.setDelegate(self, queue: nil)

CXProviderConfiguration bepaalt het uiterlijk en gedrag van het oproepscherm — de app-naam, video-ondersteuning, aantal gelijktijdige oproepen. Integratie van PushKit met CallKit is verplicht voor VoIP-apps: zonder dit toont het systeem geen inkomend oproepscherm en mist de gebruiker de oproep. Apple vereist het gebruik van CallKit voor alle apps die PushKit gebruiken.

Functies en beperkingen

Het gebruik van PushKit brengt een aantal strikte beperkingen met zich mee die door Apple zijn opgesteld. Het framework mag alleen worden gebruikt voor VoIP-functionaliteit — pogingen om marketingmeldingen via PushKit te verzenden leiden tot blokkering van de app. De payload mag niet groter zijn dan 4 KB en mag alleen JSON-gegevens bevatten zonder bijlagen. Vanaf iOS 13 heeft Apple een beperking ingevoerd op de frequentie van VoIP-meldingen — maximaal één melding per minuut per apparaat. De server moet deze beperking naleven, anders worden meldingen door het systeem afgewezen. PushKit werkt ook niet op de iOS-simulator — testen is alleen mogelijk op een fysiek apparaat.

PushKit payload-structuur

De payload van een VoIP-melding is een JSON-woordenboek met aangepaste oproepgegevens. In tegenstelling tot APNs ondersteunt PushKit geen standaardvelden als alert, badge en sound — alle gegevens worden door de ontwikkelaar bepaald. Een typische structuur bevat de identificatie van de beller (caller), het type oproep (voice of video), een kamer- of sessie-ID en een tijdstempel. De grootte van elk veld moet minimaal zijn om ruimte te besparen binnen de limiet van 4 KB. Apple raadt aan om alleen de gegevens in de payload op te nemen die nodig zijn om het inkomende oproepscherm op het vergrendelingsscherm weer te geven, en de overige informatie (avatar, gespreksgeschiedenis) te laden nadat de gebruiker heeft geantwoord via een afzonderlijk netwerkverzoek. Voorbeeld van een minimale payload: { „caller”: „Anna”, „caller_id”: „+79161234567”, „type”: „audio”, „room”: „uuid-room-1234”, „ts”: 1718534400 }. Alle sleutels in de payload moeten kort, eenduidig en gedocumenteerd zijn op de server voor compatibiliteit tussen app-versies.

Foutafhandeling en herpogingen

Bij het werken met PushKit moet men leveringsfouten en verbindingsverlies voorzien. Als het apparaat offline is of geen netwerkverbinding heeft, wordt de VoIP-melding niet geleverd — PushKit ondersteunt geen opslag en opnieuw verzenden, in tegenstelling tot APNs die de melding tot 24 uur bewaart voor een herpoging. De server moet zelf niet-geleverde meldingen bijhouden en opnieuw proberen na herstel van de verbinding. Hiervoor wordt het push kit feedback service-mechanisme gebruikt — het retourneert een lijst van niet-geleverde meldingen met vermelding van de foutoorzaak. Het wordt aanbevolen om monitoring in te stellen van het succes van VoIP-meldingleveringen via serveranalyses en de ontwikkelaar te waarschuwen wanneer het percentage succesvolle leveringen onder de 95% zakt. Het PushKit-systeem garandeert levering alleen bij een actieve internetverbinding op het apparaat — bij afwezigheid daarvan gaat de melding onherroepelijk verloren, wat kritisch is om rekening mee te houden bij het ontwerpen van een betrouwbaar VoIP-oproepsysteem met gegarandeerde levering.

Veelgestelde vragen

Wat is PushKit?

PushKit is een Apple-framework voor het leveren van VoIP-meldingen met lage latentie, waarmee de app op de achtergrond kan worden gewekt bij een inkomende oproep zonder een banner te tonen. Het wordt gebruikt in messengers en video-apps.

Wat is het verschil tussen PushKit en APNs?

PushKit heeft een hogere leveringsprioriteit en wekt de app op de achtergrond zonder een melding aan de gebruiker te tonen. APNs levert meldingen met een banner en kan de app niet wekken voor het verwerken van een oproep zonder gebruikersinteractie.

Is het verplicht om CallKit met PushKit te gebruiken?

Ja, Apple vereist integratie van PushKit met CallKit voor het tonen van het systeemscherm voor inkomende oproepen. Zonder CallKit kan de app de inkomende oproep niet op het vergrendelingsscherm tonen, waardoor VoIP-functionaliteit nutteloos wordt.

Hoe krijg ik een PushKit-token?

De token wordt verkregen na het maken van PKPushRegistry met type .voIP en implementatie van de delegate pushRegistry:didUpdatePushCredentials:forType:. De token wordt als Data doorgegeven en moet worden omgezet naar een hex-string om naar de server te worden gestuurd.

Wat zijn de beperkingen van de payload-grootte in PushKit?

De maximale payload-grootte voor PushKit is 4 KB. Gegevens moeten in JSON-formaat zijn. Media-bijlagen worden niet ondersteund. Vanaf iOS 13 geldt een limiet van maximaal één VoIP-melding per minuut per apparaat.

Samenvatting

  • PushKit — iOS-framework voor het leveren van VoIP-meldingen met lage latentie, waarbij APNs wordt omzeild.
  • Prioriteit van PushKit-levering is hoger dan APNs — de melding arriveert binnen 5 seconden.
  • De app wordt op de achtergrond gewekt bij ontvangst van de melding, zonder banner aan de gebruiker.
  • Registratie gebeurt via PKPushRegistry met PKPushType.voIP en delegate PKPushRegistryDelegate.
  • CallKit is verplicht voor het tonen van het systeemscherm voor inkomende oproepen op iOS.
  • Payload beperkt tot 4 KB, alleen JSON, maximaal één melding per minuut vanaf iOS 13.
  • Aanbeveling — gebruik PushKit alleen voor VoIP-functionaliteit, voor andere meldingen gebruik APNs.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook