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 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.
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.
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.
| Kenmerk | PushKit | APNs |
|---|---|---|
| Leveringsprioriteit | Hoog (directe levering) | Gemiddeld (mogelijke vertraging) |
| App wekken | Ja, op de achtergrond | Alleen bij klikken op melding |
| Banner weergeven | Nee | Ja (optioneel) |
| Gebruik | VoIP, oproepen, videocommunicatie | Alle soorten meldingen |
| Payload | Alleen JSON, zonder media | JSON + 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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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
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.
Lees ook