PushKit ist ein Apple-Framework für die Zustellung von Push-Benachrichtigungen mit garantierter sofortiger Lieferung, das hauptsächlich für VoIP-Anwendungen entwickelt wurde. Im Gegensatz zu standardmäßigen APNs (Apple Push Notification service), die verzögert oder gruppiert werden können, verwendet PushKit eine persistente TCP-Verbindung zwischen dem Gerät und den Apple-Servern. Laut Apple Developer Documentation, 2026 bietet PushKit eine End-to-End-Zustellungslatenz von weniger als 500 Millisekunden, was für Echtzeitanwendungen — Sprach- und Videoanrufe — entscheidend ist.
Das Wichtigste
PushKit ist ein Apple-Framework, das in iOS 8 eingeführt wurde und einen Mechanismus zur Zustellung von Push-Benachrichtigungen mit garantierter Priorität über eine persistente Verbindung zu APNs-Servern bereitstellt. Im Gegensatz zu regulären Benachrichtigungen, die über einen einzigen APNs-Kanal laufen und verzögert werden können, verwenden PushKit-Benachrichtigungen einen dedizierten Stream mit höherer Priorität, was eine nahezu Echtzeit-Zustellung gewährleistet.
Technisch gesehen arbeitet PushKit über eine persistente TCP-Verbindung zwischen dem Gerät und den Apple-Push-Servern. Wenn ein Server eine VoIP-Benachrichtigung sendet, stellt die Verbindung sie sofort dem Gerät zu, das die Anwendung aufweckt und den PKPushRegistry-Delegaten aufruft. Die Anwendung muss sich nicht in einem aktiven Zustand befinden — PushKit kann sie aus dem Hintergrund, dem beendeten Zustand oder sogar nach einem Neustart des Geräts aufwecken.
Laut einer Studie von Microsoft Research (2024) zur Latenz von Push-Benachrichtigungen auf mobilen Plattformen beträgt die mittlere Latenz von PushKit-Benachrichtigungen 120–350 ms, während standardmäßige APNs-Benachrichtigungen einen Median von 1–5 Sekunden aufweisen. Der Unterschied von mehreren Größenordnungen erklärt sich durch den dedizierten TCP-Kanal und die prioritäre Verarbeitung auf Apple-Seite.
PushKit unterstützt vier Typen: VoIP (für Anrufe), Complication (für Zifferblattdaten), FileProvider (für Dateisynchronisierung) und PushToTalk (für Walkie-Talkie-Funktionen). Seit iOS 13 ist nur noch der VoIP-Typ für Drittanbieter-Entwickler weit verfügbar. Complication und FileProvider haben Nischenanwendungen und sind auf Apples eigene Ökosysteme beschränkt.
| PushKit-Typ | Zweck | Verfügbarkeit |
|---|---|---|
| VoIP | Anzeige eingehender Sprach- und Videoanrufe | iOS 8+, App Store |
| Complication | Aktualisierung von Daten auf Apple Watch-Zifferblättern | watchOS 6+ |
| FileProvider | Signal über neue Dateien in der File Provider Extension | iOS 11+, eingeschränkt |
| PushToTalk | Walkie-Talkie-Funktion in Unternehmensanwendungen | iOS 16+, eingeschränkter Zugriff |
APNs (Apple Push Notification service) ist ein universeller Zustelldienst für Push-Benachrichtigungen, der über einen einzigen Kanal für alle Anwendungen arbeitet. Apple kann APNs-Benachrichtigungen bei Überlastung des Kanals puffern, gruppieren oder sogar verwerfen. PushKit hingegen verwendet eine dedizierte Verbindung für jeden Benachrichtigungstyp, und Apple garantiert die Zustellung jedes VoIP-Push ohne Pufferung.
Der Unterschied zeigt sich in zeitkritischen Szenarien: Ein über APNs zugestellter eingehender Anruf kann mit einer Verzögerung von 10–30 Sekunden eintreffen oder gar nicht ankommen, wenn sich das Gerät im Energiesparmodus befindet. PushKit stellt dieselbe Benachrichtigung in 100–500 ms zu, unabhängig vom Gerätezustand, da sein TCP-Kanal vom System prioritär aktiv gehalten wird.
| Parameter | PushKit | APNs |
|---|---|---|
| Verbindungstyp | Persistentes TCP (dedizierter Kanal) | Gemeinsamer Kanal mit Pufferung |
| Mittlere Latenz | 120–350 ms | 1–5 Sekunden |
| App-Aufwecken | Immer, aus jedem Zustand | Nur wenn die App nicht beendet wurde |
| Payload-Größe | Bis zu 5 KB | Bis zu 4 KB |
| iOS-Gruppierung | Nein | Ja |
Die PushKit-Architektur ist um PKPushRegistry herum aufgebaut — ein Objekt, das die Anwendung registriert, um Benachrichtigungen eines bestimmten Typs zu empfangen. Die Anwendung erstellt eine Instanz von PKPushRegistry, gibt den gewünschten Typ an (z. B. PKPushTypeVoIP) und weist einen Delegaten zu. Nach der Registrierung hält das System automatisch die Verbindung zu APNs aufrecht und liefert Push-Benachrichtigungen über den Delegaten.
Jede Benachrichtigung wird durch ein PKPushPayload-Objekt repräsentiert, das ein dictionaryPayload mit Serverdaten enthält. Die Payload-Größe ist auf 5 KB begrenzt, was für die Übertragung von Anruf-Metadaten ausreicht: Ruferkennung, Anruftyp (Audio/Video), Kontaktname und Sitzungstoken. Der Medienstrom selbst wird separat über WebRTC oder ein anderes Echtzeitprotokoll übertragen.
import PushKit
class PushKitManager: NSObject {
private let pushRegistry = PKPushRegistry(queue: .main)
func configure() {
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
}
}
PushKit ruft die Delegatenmethode auf, wenn eine Benachrichtigung eingeht. An diesem Punkt muss die Anwendung Daten aus dictionaryPayload extrahieren und den Anruf sofort über CallKit anzeigen, andernfalls kann das System die Hintergrundaufgabe beenden. Apple empfiehlt, die Verarbeitung innerhalb von 30 Sekunden abzuschließen, aber bei VoIP-Anrufen ist es entscheidend, den Anrufbildschirm innerhalb der ersten Sekunde anzuzeigen.
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
)
}
}
Mit der Veröffentlichung von iOS 13 führte Apple strenge Einschränkungen für die Nutzung von PushKit ein. Entwickler hatten VoIP-Push in großem Umfang als verdeckten Mechanismus für Hintergrundaktualisierungen von Apps genutzt — das Aufwecken über PushKit ermöglichte das Laden von Inhalten, das Synchronisieren von Daten und das Aktualisieren der Benutzeroberfläche ohne explizite Zustimmung des Benutzers. Apple betrachtete dies als Verstoß gegen das Energiesparkonzept und schränkte PushKit auf die Anzeige eingehender Anrufe ein.
Jetzt muss jede PushKit-Benachrichtigung sofort zur Anzeige eines eingehenden Anrufs über CallKit führen. Wenn das System feststellt, dass PushKit für andere Zwecke verwendet wird — zum Beispiel für Hintergrundsynchronisation oder Inhaltsaktualisierungen ohne Anrufanzeige — kann die App bei der Überprüfung abgelehnt oder vom PushKit-Dienst deaktiviert werden. Apple hat außerdem die Möglichkeit entfernt, PushKit ab iOS 13 für Hintergrunddatenaktualisierungen zu verwenden.
Die vollständige PushKit-Integration umfasst die Registrierung, das Abrufen eines Push-Tokens und die Verarbeitung eingehender Benachrichtigungen. PushKit fordert automatisch die Berechtigung zum Senden von Benachrichtigungen an — ein zusätzlicher UNUserNotificationCenter-Aufruf ist für PushKit selbst nicht erforderlich, kann aber für lokale Benachrichtigungen der App notwendig sein. Nach der Registrierung ruft das System pushRegistry:didUpdatePushCredentials auf, um das Push-Token zu übermitteln, das an den Server gesendet werden muss.
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)")
}
}
Die Serverseite sendet eine PushKit-Benachrichtigung über APNs mit push-type = voip und dem Header apns-push-type: voip. Im Gegensatz zu regulären APNs verwendet VoIP-Push ein eigenes Zertifikat und erfordert keine Topic-Konfiguration. Der Payload sollte minimale Daten zur Identifizierung des Anrufs enthalten.
// VoIP-Push-Payload-Beispiel
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
Das Debuggen von PushKit ist komplexer als bei standardmäßigen APNs, da PushKit nicht auf dem iOS-Simulator funktioniert. Für die Diagnose ist ein physisches iPhone oder iPad erforderlich. Das erste Anzeichen für einen korrekten Betrieb ist der Aufruf von pushRegistry:didUpdatePushCredentials beim Start und das Erscheinen eines Push-Tokens in einem bestimmten Format (64 Hexadezimalzeichen für VoIP). Wenn der Delegat nicht aufgerufen wird, überprüfen Sie die Berechtigungen Ihrer App.
Ein weiteres häufiges Problem ist, dass PushKit nach einem App-Update keine Benachrichtigungen zustellt. Dies geschieht, wenn sich das Push-Token geändert hat, der Server aber weiterhin das alte verwendet. Die Lösung besteht darin, beim Start der App ein neues Token an den Server zu senden und ungültige Token zu entfernen, wenn pushRegistry:didInvalidatePushTokenForType aufgerufen wird. Apple empfiehlt außerdem die Implementierung eines Fallback-Mechanismus über reguläre APNs.
| Problem | Ursache | Lösung |
|---|---|---|
| didUpdatePushCredentials wird nicht aufgerufen | Fehlende Berechtigungen oder falscher Typ | Überprüfen Sie Capabilities → Push Notifications + VoIP in Xcode |
| Push kommt mit Verzögerung an | Gerät im Energiesparmodus oder schwaches Signal | PushKit kann Hardwareeinschränkungen nicht umgehen |
| Keine Benachrichtigungen nach Neustart | Push-Token nach Neuinstallation der App geändert | Neues Token anfordern und auf dem Server aktualisieren |
| App Store wegen PushKit abgelehnt | PushKit für andere Zwecke als Anrufe verwendet | Sicherstellen, dass jeder Push zu reportNewIncomingCall führt |
Häufig gestellte Fragen
Technisch ja, aber es wäre sinnlos. Seit iOS 13 ist die einzig zulässige Verwendung von PushKit die Anzeige eingehender Anrufe, die CallKit zur Darstellung benötigt. Die Verwendung von PushKit ohne CallKit führt zur Ablehnung der App im App Store.
Die maximale Payload-Größe für PushKit beträgt 5 KB (5120 Byte). Das ist 1 KB mehr als bei regulären APNs-Benachrichtigungen und ermöglicht die Übertragung weiterer Anruf-Metadaten.
Apple ungültigt automatisch das Push-Token, wenn die App gelöscht wird. Der Server erhält eine Ungültigkeitsmitteilung und muss das Senden von Pushs an dieses Token einstellen. Der Versuch, einen Push an ein ungültiges Token zu senden, führt zum APNs-Fehler 410.
PushKit ist unter macOS 10.14+ für Mac-Anwendungen verfügbar, die mit Mac Catalyst oder AppKit erstellt wurden. Die Funktionalität ist vollständig äquivalent zur iOS-Version, einschließlich der VoIP-Benachrichtigungsunterstützung.
Verwenden Sie Ihre eigene Analyse: Verfolgen Sie die Zeit zwischen dem Senden eines Push vom Server und dem Aufruf von didReceiveIncomingPushWithPayload auf dem Client. Eine durchschnittliche Zeit von weniger als 500 ms weist auf einen korrekten PushKit-Betrieb hin.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch