PushKit is een Apple-framework voor het leveren van pushmeldingen met gegarandeerde onmiddellijke levering, voornamelijk bedoeld voor VoIP-toepassingen. In tegenstelling tot standaard APNs (Apple Push Notification service), die kunnen vertragen of worden gegroepeerd, gebruikt PushKit een permanente TCP-verbinding tussen het apparaat en de servers van Apple. Volgens Apple Developer Documentation, 2026 zorgt PushKit voor een leveringsvertraging van minder dan 500 milliseconden, wat cruciaal is voor realtime toepassingen — spraak- en video-gesprekken.
Belangrijkste punten
PushKit is een Apple-framework, geïntroduceerd in iOS 8, dat een mechanisme biedt voor het leveren van pushmeldingen met gegarandeerde prioriteit via een permanente verbinding met APNs-servers. In tegenstelling tot gewone meldingen, die via een enkel APNs-kanaal gaan en kunnen vertragen, gebruiken PushKit-meldingen een speciale stroom met een hogere prioriteit, wat zorgt voor levering in vrijwel realtime.
Technisch werkt PushKit via een permanente TCP-verbinding tussen het apparaat en de push-servers van Apple. Wanneer de server een VoIP-melding verzendt, geeft de verbinding deze onmiddellijk door aan het apparaat, dat de applicatie activeert en de PKPushRegistry-delegate aanroept. De applicatie hoeft niet in actieve toestand te zijn — PushKit kan deze activeren vanuit de achtergrond, beëindigde toestand of zelfs na het opnieuw opstarten van het apparaat.
Volgens onderzoek van Microsoft Research (2024) naar vertragingen van pushmeldingen op mobiele platforms, bedraagt de mediane vertraging van PushKit-meldingen 120–350 ms, terwijl standaard APNs-meldingen een mediaan van 1–5 seconden laten zien. Het verschil in grootteorde wordt precies verklaard door het speciale TCP-kanaal en de prioritaire verwerking aan de kant van Apple.
PushKit ondersteunt vier typen: VoIP (voor oproepen), Complication (voor gegevens op watchOS-wijzerplaten), FileProvider (voor bestandssynchronisatie) en PushToTalk (voor portofoonfunctie). Sinds iOS 13 blijft alleen het VoIP-type breed beschikbaar voor externe ontwikkelaars. Complication en FileProvider hebben een beperkte gespecialiseerde toepassing en zijn beperkt tot de eigen ecosystemen van Apple.
| PushKit-type | Doel | Beschikbaarheid |
|---|---|---|
| VoIP | Indicatie van inkomende spraak- en video-gesprekken | iOS 8+, App Store |
| Complication | Gegevensupdate op Apple Watch-wijzerplaten | watchOS 6+ |
| FileProvider | Signaal over nieuwe bestanden in File Provider Extension | iOS 11+, beperkt |
| PushToTalk | Portofoonfunctie in bedrijfstoepassingen | iOS 16+, beperkte toegang |
APNs (Apple Push Notification service) — een universele service voor het leveren van pushmeldingen, die via een enkel kanaal werkt voor alle applicaties. Apple kan APNs-meldingen bufferen, groeperen of zelfs weggooien bij overbelasting van het kanaal. PushKit daarentegen gebruikt een speciale verbinding voor elk meldingstype en Apple garandeert de levering van elke VoIP-push zonder buffering.
Het verschil komt tot uiting in tijd-kritische scenario's: een inkomende oproep die via APNs wordt geleverd, kan met een vertraging van 10–30 seconden aankomen of helemaal niet aankomen als het apparaat in de energiebesparingsmodus staat. PushKit levert dezelfde melding binnen 100–500 ms, ongeacht de status van het apparaat, omdat het TCP-kanaal door het systeem prioritair actief wordt gehouden.
| Parameter | PushKit | APNs |
|---|---|---|
| Verbindingstype | Permanent TCP (speciaal kanaal) | Gemeenschappelijk kanaal met buffering |
| Mediane vertraging | 120–350 ms | 1–5 seconden |
| App activeren | Altijd, vanuit elke toestand | Alleen als de app niet is beëindigd |
| Payload-grootte | Tot 5 KB | Tot 4 KB |
| iOS groepering | Nee | Ja |
De architectuur van PushKit is opgebouwd rond PKPushRegistry — een object dat de applicatie registreert voor het ontvangen van meldingen van een bepaald type. De applicatie maakt een instantie van PKPushRegistry, geeft het gewenste type op (bijv. PKPushTypeVoIP) en stelt een delegate in. Na registratie onderhoudt het systeem automatisch de verbinding met APNs en levert pushmeldingen via de delegate.
Elke melding wordt vertegenwoordigd door een PKPushPayload-object, dat een dictionaryPayload-woordenboek bevat met gegevens van de server. De payload-grootte is beperkt tot 5 KB, wat voldoende is voor het verzenden van oproepmetadata: identificatie van de beller, oproeptype (audio/video), contactnaam en sessietoken. De mediastroom wordt afzonderlijk verzonden via WebRTC of een ander realtime protocol.
import PushKit
class PushKitManager: NSObject {
private let pushRegistry = PKPushRegistry(queue: .main)
func configure() {
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
}
}
PushKit roept de delegate-methode aan bij ontvangst van een melding. Op dat moment moet de applicatie de gegevens uit dictionaryPayload halen en onmiddellijk de oproep via CallKit tonen, anders kan het systeem de achtergrondtaak beëindigen. Apple adviseert om de verwerking binnen 30 seconden te voltooien, maar voor VoIP-gesprekken is het cruciaal om het oproepscherm binnen de eerste seconde weer te geven.
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
)
}
}
Met de release van iOS 13 heeft Apple strikte beperkingen ingevoerd voor het gebruik van PushKit. Ontwikkelaars gebruikten VoIP-push massaal als een verborgen mechanisme voor het updaten van apps op de achtergrond — activering via PushKit maakte het mogelijk om content te laden, gegevens te synchroniseren en de interface bij te werken zonder expliciete toestemming van de gebruiker. Apple beschouwde dit als een schending van het energiebesparingsconcept en beperkte PushKit tot alleen de indicatie van inkomende oproepen.
Nu moet elke PushKit-melding onmiddellijk leiden tot het tonen van een inkomende oproep via CallKit. Als het systeem ontdekt dat PushKit voor andere doeleinden wordt gebruikt — bijvoorbeeld voor achtergrondsynchronisatie of content-update zonder het tonen van een oproep — kan de applicatie worden afgewezen bij moderatie of worden losgekoppeld van de PushKit-service. Apple heeft ook de mogelijkheid verwijderd om PushKit te gebruiken voor het updaten van gegevens op de achtergrond sinds iOS 13.
Volledige integratie van PushKit omvat registratie, het verkrijgen van een push-token en het verwerken van inkomende meldingen. PushKit vraagt onafhankelijk toestemming voor het verzenden van meldingen — een extra aanroep van UNUserNotificationCenter is niet nodig voor PushKit zelf, maar kan nodig zijn voor lokale meldingen van de applicatie. Na registratie roept het systeem de methode pushRegistry:didUpdatePushCredentials aan om het push-token door te geven, dat naar de server moet worden gestuurd.
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)")
}
}
De serverzijde verzendt de PushKit-melding via APNs met push-type = voip en de header apns-push-type: voip. In tegenstelling tot gewone APNs gebruikt VoIP-push een eigen certificaat en vereist het geen configuratie van topic. De payload moet minimale gegevens bevatten voor identificatie van de oproep.
// VoIP push payload voorbeeld
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
Het debuggen van PushKit is moeilijker dan standaard APNs, omdat PushKit niet werkt op de iOS-simulator. Voor diagnose is een fysieke iPhone of iPad nodig. Het eerste teken van correcte werking is het aanroepen van pushRegistry:didUpdatePushCredentials bij het opstarten en het verschijnen van een push-token met een specifiek formaat (64 hex-tekens voor VoIP). Als de delegate niet wordt aangeroepen, controleer dan de entitlements van uw applicatie.
Een ander veelvoorkomend probleem is dat PushKit geen meldingen levert na het updaten van de applicatie. Dit gebeurt als het push-token is veranderd, maar de server het oude blijft gebruiken. De oplossing is het verzenden van een nieuw token naar de server bij het opstarten van de applicatie en het verwijderen van ongeldige tokens bij het aanroepen van pushRegistry:didInvalidatePushTokenForType. Apple adviseert ook om een fallback-mechanisme via gewone APNs te implementeren.
| Probleem | Oorzaak | Oplossing |
|---|---|---|
| didUpdatePushCredentials wordt niet aangeroepen | Ontbrekende entitlements of verkeerd type | Controleer Capabilities → Push Notifications + VoIP in Xcode |
| Push komt met vertraging | Apparaat in Low Power Mode of zwak signaal | PushKit kan hardwarebeperkingen niet omzeilen |
| Meldingen komen niet na herstart | Wijziging van push-token na herinstallatie van de app | Vraag een nieuw token aan en werk het bij op de server |
| App Store afgewezen vanwege PushKit | PushKit wordt niet gebruikt voor oproepen | Zorg ervoor dat elke push leidt tot reportNewIncomingCall |
Veelgestelde vragen
Technisch ja, maar zinloos. Sinds iOS 13 is de enige toegestane toepassing van PushKit de indicatie van inkomende oproepen, waarvoor CallKit nodig is voor weergave. Gebruik van PushKit zonder CallKit leidt tot afwijzing van de applicatie in de App Store.
De maximale payload-grootte voor PushKit is 5 KB (5120 bytes). Dit is 1 KB meer dan gewone APNs-meldingen, waardoor meer metadata over de oproep kan worden verzonden.
Apple annuleert automatisch het push-token bij het verwijderen van de applicatie. De server ontvangt een melding van annulering en moet stoppen met het verzenden van push naar dit token. Een poging om push naar een ongeldig token te sturen veroorzaakt APNs-fout 410.
PushKit is beschikbaar op macOS 10.14+ voor Mac-applicaties gemaakt met Mac Catalyst of AppKit. De functionaliteit is volledig analoog aan de iOS-versie, inclusief ondersteuning voor VoIP-meldingen.
Gebruik uw eigen analyse: volg de tijd tussen het verzenden van push vanaf de server en het aanroepen van didReceiveIncomingPushWithPayload op de client. Een gemiddelde tijd onder 500 ms wijst op correcte werking van PushKit.
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