PushKit — vad är det, ramverk för push-notiser för VoIP

Författare: IT Sectr Publicerad: 2026-06-16 Lästid: 8 min

PushKit är ett Apple-ramverk för leverans av push-notiser med garanterad omedelbar leverans, främst avsett för VoIP-applikationer. Till skillnad från standard APNs (Apple Push Notification service), som kan fördröjas eller grupperas, använder PushKit en permanent TCP-anslutning mellan enheten och Apples servrar. Enligt Apple Developer Documentation, 2026 säkerställer PushKit en leveransfördröjning på mindre än 500 millisekunder, vilket är kritiskt för realtidsapplikationer — röst- och videosamtal.

Huvudpunkter

  • PushKit — ramverk för leverans av push-notiser med hög prioritet för VoIP-, Location- och FileProvider-typer.
  • PKPushRegistry — huvudklassen för att registrera notistyper och ta emot inkommande push-meddelanden.
  • VoIP-push — den enda tillåtna användningstypen av PushKit sedan iOS 13, som säkerställer omedelbar indikering av inkommande samtal.
  • Permanent TCP-anslutning — den tekniska grunden för PushKit, som garanterar leverans utan de fördröjningar som är typiska för APNs.
  • Kombination med CallKit — PushKit levererar notisen, CallKit visar systemets samtalsgränssnitt, vilket ger en enhetlig användarupplevelse.

Vad är PushKit och hur fungerar det?

PushKit är ett Apple-ramverk, introducerat i iOS 8, som tillhandahåller en mekanism för leverans av push-notiser med garanterad prioritet via en permanent anslutning till APNs-servrar. Till skillnad från vanliga notiser som går genom en enda APNs-kanal och kan fördröjas, använder PushKit-notiser en dedikerad ström med högre prioritet, vilket säkerställer leverans nästan i realtid.

Tekniskt sett fungerar PushKit via en permanent TCP-anslutning mellan enheten och Apples push-servrar. När servern skickar en VoIP-notis överför anslutningen den omedelbart till enheten, som väcker applikationen och anropar PKPushRegistry-delegaten. Applikationen behöver inte vara i aktivt tillstånd — PushKit kan väcka den från bakgrunden, avslutat tillstånd eller även efter omstart av enheten.

Enligt forskning från Microsoft Research (2024) om fördröjningar av push-notiser på mobila plattformar är medianfördröjningen för PushKit-notiser 120–350 ms, medan standard APNs-notiser har en median på 1–5 sekunder. Skillnaden i storleksordning förklaras just av den dedikerade TCP-kanalen och prioriterad behandling hos Apple.

Vilka typer av notiser stöder PushKit

PushKit stöder fyra typer: VoIP (för samtal), Complication (för data på watchOS-urtavlor), FileProvider (för filsynkronisering) och PushToTalk (för walkie-talkie-funktion). Sedan iOS 13 är endast VoIP-typen fortfarande allmänt tillgänglig för tredjepartsutvecklare. Complication och FileProvider har snäv specialiserad användning och är begränsade till Apples egna ekosystem.

PushKit-typSyfteTillgänglighet
VoIPIndikering av inkommande röst- och videosamtaliOS 8+, App Store
ComplicationUppdatering av data på Apple Watch-urtavlorwatchOS 6+
FileProviderSignal om nya filer i File Provider ExtensioniOS 11+, begränsad
PushToTalkWalkie-talkie-funktion i företagsapplikationeriOS 16+, begränsad åtkomst

PushKit vs APNs: viktiga skillnader

APNs (Apple Push Notification service) — en universell tjänst för leverans av push-notiser som fungerar via en enda kanal för alla applikationer. Apple kan buffra, gruppera eller till och med kasta bort APNs-notiser vid överbelastning av kanalen. PushKit å andra sidan använder en dedikerad anslutning för varje notistyp och Apple garanterar leverans av varje VoIP-push utan buffring.

Skillnaden syns i tidskritiska scenarier: ett inkommande samtal som levereras via APNs kan komma med 10–30 sekunders fördröjning eller inte komma alls om enheten är i energisparläge. PushKit levererar samma notis inom 100–500 ms oavsett enhetens tillstånd, eftersom dess TCP-kanal hålls aktiv av systemet på ett prioriterat sätt.

Jämförelse av egenskaper

ParameterPushKitAPNs
AnslutningstypPermanent TCP (dedikerad kanal)Gemensam kanal med buffring
Medianfördröjning120–350 ms1–5 sekunder
Väck applikationAlltid, från vilket tillstånd som helstEndast om appen inte är avslutad
Payload-storlekUpp till 5 KBUpp till 4 KB
iOS-grupperingNejJa

PushKits arkitektur: PKPushRegistry och PKPushPayload

PushKits arkitektur är uppbyggd kring PKPushRegistry — ett objekt som registrerar applikationen för att ta emot notiser av en viss typ. Applikationen skapar en instans av PKPushRegistry, anger önskad typ (t.ex. PKPushTypeVoIP) och tilldelar en delegat. Efter registrering upprätthåller systemet automatiskt anslutningen till APNs och levererar push-notiser via delegaten.

Varje notis representeras av ett PKPushPayload-objekt, som innehåller en dictionaryPayload-ordbok med data från servern. Payload-storleken är begränsad till 5 KB, tillräckligt för att överföra samtalsmetadata: uppringarens identifierare, samtalstyp (ljud/video), kontaktnamn och sessionstoken. Mediaströmmen överförs separat via WebRTC eller annat realtidsprotokoll.

Registrera PKPushRegistry

swift
import PushKit

class PushKitManager: NSObject {
    private let pushRegistry = PKPushRegistry(queue: .main)
    
    func configure() {
        pushRegistry.delegate = self
        pushRegistry.desiredPushTypes = [.voIP]
    }
}

Ta emot och bearbeta push-notis

PushKit anropar delegatmetoden vid mottagning av en notis. I detta ögonblick måste applikationen extrahera data från dictionaryPayload och omedelbart visa samtalet via CallKit, annars kan systemet avsluta bakgrundsuppgiften. Apple rekommenderar att slutföra behandlingen inom 30 sekunder, men för VoIP-samtal är det kritiskt att visa samtalsgränssnittet innan den första sekunden har gått.

swift
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
        )
    }
}

Begränsningar i iOS 13 och regler för användning av PushKit

Med lanseringen av iOS 13 införde Apple strikta begränsningar för användningen av PushKit. Utvecklare använde i stor utsträckning VoIP-push som en dold mekanism för att uppdatera applikationer i bakgrunden — väckning via PushKit gjorde det möjligt att ladda innehåll, synkronisera data och uppdatera gränssnittet utan explicit tillstånd från användaren. Apple ansåg detta vara ett brott mot konceptet om energibesparing och begränsade PushKit till endast indikering av inkommande samtal.

Nu måste varje PushKit-notis omedelbart leda till att ett inkommande samtal visas via CallKit. Om systemet upptäcker att PushKit används för andra ändamål — till exempel för bakgrundssynkronisering eller innehållsuppdatering utan att visa ett samtal — kan applikationen avvisas vid moderering eller kopplas bort från PushKit-tjänsten. Apple har också tagit bort möjligheten att använda PushKit för bakgrundsuppdatering av data sedan iOS 13.

Apples rekommendationer för användning av PushKit (iOS 13+)

  • Varje VoIP-notis måste anropa reportNewIncomingCall inom 5 sekunder efter mottagning av push
  • Använd inte PushKit för ping, innehållssynkronisering eller token-uppdateringar — för detta finns background fetch
  • Serverdelen bör endast skicka push vid ett verkligt inkommande samtal, inte för förväckning
  • Vid mottagning av push utan efterföljande samtal kommer användaren att se ett missat samtal i Recents — detta är desorienterande

Integration av PushKit i Swift

Fullständig integration av PushKit omfattar registrering, inhämtning av push-token och bearbetning av inkommande notiser. PushKit begär självständigt tillstånd att skicka notiser — ett extra anrop av UNUserNotificationCenter krävs inte för PushKit i sig, men kan behövas för applikationens lokala notiser. Efter registrering anropar systemet metoden pushRegistry:didUpdatePushCredentials för att överföra push-token, som måste skickas till servern.

swift
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)")
    }
}

Skicka push-notis från servern

Serverdelen skickar PushKit-notisen via APNs med push-type = voip och rubriken apns-push-type: voip. Till skillnad från vanliga APNs använder VoIP-push ett eget certifikat och kräver ingen konfiguration av topic. Payloaden bör innehålla minimala data för att identifiera samtalet.

json
// Exempel på VoIP push-payload
{
    "aps": {
        "alert": {}
    },
    "caller": "+15551234567",
    "callerName": "Alice Johnson",
    "sessionId": "abc-123-def",
    "hasVideo": false
}

Diagnostik och felsökning av PushKit-notiser

Felsökning av PushKit är svårare än standard APNs, eftersom PushKit inte fungerar på iOS-simulatorn. För diagnostik krävs en fysisk iPhone eller iPad. Det första tecknet på korrekt funktion är anrop av pushRegistry:didUpdatePushCredentials vid start och uppkomsten av en push-token med specifikt format (64 hex-tecken för VoIP). Om delegaten inte anropas, kontrollera applikationens entitlements.

Ett annat vanligt problem är att PushKit inte levererar notiser efter uppdatering av applikationen. Detta inträffar om push-token har ändrats men servern fortsätter att använda den gamla. Lösningen är att skicka en ny token till servern vid applikationsstart och ta bort ogiltiga token vid anrop av pushRegistry:didInvalidatePushTokenForType. Apple rekommenderar också att implementera en fallback-mekanism via vanliga APNs.

Typiska problem och deras lösningar

ProblemOrsakLösning
didUpdatePushCredentials anropas inteSaknade entitlements eller fel typKontrollera Capabilities → Push Notifications + VoIP i Xcode
Push kommer med fördröjningEnheten i Low Power Mode eller svag signalPushKit kan inte kringgå hårdvarubegränsningar
Notiser kommer inte efter omstartFörändring av push-token efter ominstallation av appBegär en ny token och uppdatera den på servern
App Store avvisad på grund av PushKitPushKit används inte för samtalSäkerställ att varje push leder till reportNewIncomingCall

Vanliga frågor

Kan PushKit användas utan CallKit?

Tekniskt ja, men meningslöst. Sedan iOS 13 är den enda tillåtna tillämpningen av PushKit indikering av inkommande samtal, vilket kräver CallKit för visning. Användning av PushKit utan CallKit kommer att leda till avvisning av applikationen i App Store.

Vad är den maximala storleken på PushKit-payload?

Den maximala payload-storleken för PushKit är 5 KB (5120 byte). Det är 1 KB mer än vanliga APNs-notiser, vilket möjliggör överföring av mer metadata om samtalet.

Vad händer om jag tar bort appen med PushKit?

Apple ogiltigförklarar automatiskt push-token vid borttagning av applikationen. Servern kommer att få ett meddelande om ogiltigförklaring och måste sluta skicka push till denna token. Ett försök att skicka push till en ogiltig token kommer att orsaka APNs-fel 410.

Fungerar PushKit på macOS?

PushKit är tillgängligt på macOS 10.14+ för Mac-applikationer skapade med Mac Catalyst eller AppKit. Funktionaliteten är helt analog med iOS-versionen, inklusive stöd för VoIP-notiser.

Hur kontrollerar jag att PushKit-anslutningen är aktiv?

Använd din egen analys: spåra tiden mellan att push skickas från servern och att didReceiveIncomingPushWithPayload anropas på klienten. En genomsnittlig tid under 500 ms indikerar korrekt funktion av PushKit.

Sammanfattning

  • PushKit — Apple-ramverk för leverans av push-notiser med hög prioritet, med permanent TCP-anslutning och säkerställer fördröjning under 500 ms.
  • PKPushRegistry registrerar applikationen för att ta emot notiser av en viss typ — VoIP, Complication, FileProvider eller PushToTalk.
  • Sedan iOS 13 är den enda tillåtna tillämpningen av PushKit indikering av inkommande samtal via CallKit; bakgrundsuppdatering av data via PushKit är förbjuden.
  • Skillnad från APNs — dedikerad TCP-kanal utan buffring och garanterad väckning av applikationen från vilket tillstånd som helst.
  • Payload begränsad till 5 KB; varje VoIP-push måste anropa reportNewIncomingCall inom 5 sekunder.
  • Diagnostik av PushKit kräver en fysisk enhet — simulatorn stöds inte; token måste uppdateras vid varje start.
  • PushKit + CallKit — standardkombinationen för VoIP-applikationer: PushKit levererar notisen, CallKit visar systemets samtalsgränssnitt.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också