PushKit je framework od Apple pro doručení push oznámení s garantovaným okamžitým doručením, určený především pro VoIP aplikace. Na rozdíl od standardních APNs (Apple Push Notification service), které se mohou zpožďovat nebo seskupovat, PushKit používá trvalé TCP spojení mezi zařízením a servery Apple. Podle Apple Developer Documentation, 2026 poskytuje PushKit zpoždění doručení kratší než 500 milisekund, což je kritické pro aplikace v reálném čase — hlasové a video hovory.
Hlavní body
PushKit je framework Apple, představený v iOS 8, který poskytuje mechanismus doručení push oznámení s garantovanou prioritou prostřednictvím trvalého spojení se servery APNs. Na rozdíl od běžných oznámení, která procházejí jediným kanálem APNs a mohou se zpožďovat, PushKit oznámení používají vyhrazený proud s vyšší prioritou, což zajišťuje doručení prakticky v reálném čase.
Technicky PushKit funguje prostřednictvím trvalého TCP spojení mezi zařízením a push servery Apple. Když server odešle VoIP oznámení, spojení jej okamžitě předá zařízení, které probudí aplikaci a zavolá delegáta PKPushRegistry. Aplikace nemusí být v aktivním stavu — PushKit ji může probudit z pozadí, ukončeného stavu nebo dokonce po restartu zařízení.
Podle výzkumu Microsoft Research (2024) o zpožděních push oznámení na mobilních platformách je mediánní zpoždění PushKit oznámení 120–350 ms, zatímco standardní APNs oznámení vykazují medián 1–5 sekund. Rozdíl v řádu velikosti je způsoben právě vyhrazeným TCP kanálem a prioritním zpracováním na straně Apple.
PushKit podporuje čtyři typy: VoIP (pro hovory), Complication (pro data na cifernících watchOS), FileProvider (pro synchronizaci souborů) a PushToTalk (pro funkci vysílačky). Od iOS 13 zůstává pouze typ VoIP široce dostupný pro externí vývojáře. Complication a FileProvider mají úzce specializované použití a jsou omezeny na vlastní ekosystémy Apple.
| Typ PushKit | Účel | Dostupnost |
|---|---|---|
| VoIP | Indikace příchozích hlasových a video hovorů | iOS 8+, App Store |
| Complication | Aktualizace dat na cifernících Apple Watch | watchOS 6+ |
| FileProvider | Signál o nových souborech v File Provider Extension | iOS 11+, omezeno |
| PushToTalk | Funkce vysílačky v podnikových aplikacích | iOS 16+, omezený přístup |
APNs (Apple Push Notification service) — univerzální služba doručení push oznámení, která funguje prostřednictvím jednoho kanálu pro všechny aplikace. Apple může při přetížení kanálu APNs oznámení vyrovnávat do vyrovnávací paměti, seskupovat nebo dokonce zahazovat. PushKit naproti tomu používá vyhrazené spojení pro každý typ oznámení a Apple garantuje doručení každého VoIP-push bez vyrovnávání.
Rozdíl se projevuje v časově kritických scénářích: příchozí hovor doručený prostřednictvím APNs může přijít se zpožděním 10–30 sekund nebo vůbec nepřijít, pokud je zařízení v režimu úspory energie. PushKit doručí stejné oznámení za 100–500 ms bez ohledu na stav zařízení, protože jeho TCP kanál je systémem udržován aktivní prioritním způsobem.
| Parametr | PushKit | APNs |
|---|---|---|
| Typ spojení | Trvalé TCP (vyhrazený kanál) | Společný kanál s vyrovnávací pamětí |
| Mediánní zpoždění | 120–350 ms | 1–5 sekund |
| Probuzení aplikace | Vždy, z jakéhokoli stavu | Pouze pokud aplikace není ukončena |
| Velikost payloadu | Až 5 KB | Až 4 KB |
| Seskupování iOS | Ne | Ano |
Architektura PushKit je postavena kolem PKPushRegistry — objektu, který registruje aplikaci pro příjem oznámení určitého typu. Aplikace vytvoří instanci PKPushRegistry, určí požadovaný typ (např. PKPushTypeVoIP) a přiřadí delegáta. Po registraci systém automaticky udržuje spojení s APNs a doručuje push oznámení prostřednictvím delegáta.
Každé oznámení je reprezentováno objektem PKPushPayload, který obsahuje slovník dictionaryPayload s daty ze serveru. Velikost payloadu je omezena na 5 KB, což je dostatečné pro přenos metadat hovoru: identifikátor volajícího, typ hovoru (audio/video), jméno kontaktu a token relace. Mediální proud je přenášen samostatně prostřednictvím WebRTC nebo jiného protokolu reálného času.
import PushKit
class PushKitManager: NSObject {
private let pushRegistry = PKPushRegistry(queue: .main)
func configure() {
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
}
}
PushKit zavolá delegátskou metodu při přijetí oznámení. V tuto chvíli musí aplikace extrahovat data z dictionaryPayload a okamžitě zobrazit hovor prostřednictvím CallKit, jinak systém může ukončit úlohu na pozadí. Apple doporučuje dokončit zpracování do 30 sekund, ale pro VoIP hovory je kritické zobrazit obrazovku hovoru před uplynutím první sekundy.
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
)
}
}
S vydáním iOS 13 zavedla Apple přísná omezení na používání PushKit. Vývojáři masivně používali VoIP-push jako skrytý mechanismus pro aktualizaci aplikací na pozadí — probuzení prostřednictvím PushKit umožňovalo načítání obsahu, synchronizaci dat a aktualizaci rozhraní bez výslovného souhlasu uživatele. Apple to považovalo za porušení konceptu úspory energie a omezilo PushKit pouze na indikaci příchozích hovorů.
Nyní každé PushKit oznámení musí okamžitě vést k zobrazení příchozího hovoru prostřednictvím CallKit. Pokud systém zjistí, že PushKit je používán k jiným účelům — například pro synchronizaci na pozadí nebo aktualizaci obsahu bez zobrazení hovoru — aplikace může být při moderování odmítnuta nebo odpojena od služby PushKit. Apple také odstranila možnost používat PushKit pro aktualizaci dat na pozadí od iOS 13.
Plná integrace PushKit zahrnuje registraci, získání push tokenu a zpracování příchozích oznámení. PushKit nezávisle žádá o povolení k odesílání oznámení — další volání UNUserNotificationCenter není pro samotný PushKit nutné, ale může být potřebné pro lokální oznámení aplikace. Po registraci systém zavolá metodu pushRegistry:didUpdatePushCredentials pro předání push tokenu, který musí být odeslán na server.
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)")
}
}
Serverová strana odešle PushKit oznámení prostřednictvím APNs s push-type = voip a hlavičkou apns-push-type: voip. Na rozdíl od běžných APNs, VoIP-push používá vlastní certifikát a nevyžaduje konfiguraci topic. Payload by měl obsahovat minimální data pro identifikaci hovoru.
// Παράδειγμα payload VoIP push
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
Ladění PushKit je obtížnější než standardních APNs, protože PushKit nefunguje na iOS simulátoru. Pro diagnostiku je potřebné fyzické iPhone nebo iPad. Prvním příznakem správné funkce je volání pushRegistry:didUpdatePushCredentials při spuštění a objevení push tokenu specifického formátu (64 hex znaků pro VoIP). Pokud delegát není volán, zkontrolujte entitlements své aplikace.
Dalším častým problémem je, že PushKit nedoručuje oznámení po aktualizaci aplikace. K tomu dochází, pokud se změnil push token, ale server nadále používá starý. Řešením je odeslání nového tokenu na server při spuštění aplikace a odstranění neplatných tokenů při volání pushRegistry:didInvalidatePushTokenForType. Apple také doporučuje implementovat záložní mechanismus prostřednictvím běžných APNs.
| Problém | Příčina | Řešení |
|---|---|---|
| didUpdatePushCredentials není voláno | Chybící entitlements nebo špatný typ | Zkontrolujte Capabilities → Push Notifications + VoIP v Xcode |
| Push přichází se zpožděním | Zařízení v režimu Low Power Mode nebo slabý signál | PushKit nemůže obejít hardwarová omezení |
| Oznámení nepřicházejí po restartu | Změna push tokenu po přeinstalování aplikace | Vyžádejte nový token a aktualizujte jej na serveru |
| App Store odmítnuto kvůli PushKit | PushKit není používán pro hovory | Ujistěte se, že každý push vede k reportNewIncomingCall |
Často kladené otázky
Technicky ano, ale postrádá to smysl. Od iOS 13 je jediným povoleným použitím PushKit indikace příchozích hovorů, která vyžaduje CallKit pro zobrazení. Používání PushKit bez CallKit povede k odmítnutí aplikace v App Store.
Maximální velikost payloadu pro PushKit je 5 KB (5120 bajtů). To je o 1 KB více než běžná APNs oznámení, což umožňuje přenést více metadat o hovoru.
Apple automaticky zneplatní push token při smazání aplikace. Server obdrží oznámení o zneplatnění a musí zastavit odesílání push na tento token. Pokus o odeslání push na neplatný token způsobí chybu APNs 410.
PushKit je k dispozici na macOS 10.14+ pro Mac aplikace vytvořené s Mac Catalyst nebo AppKit. Funkcionalita je zcela analogická verzi pro iOS, včetně podpory VoIP oznámení.
Použijte vlastní analýzu: sledujte čas mezi odesláním push ze serveru a voláním didReceiveIncomingPushWithPayload na klientovi. Průměrný čas pod 500 ms indikuje správnou funkci PushKit.
Shrnutí
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης