PushKit — vad är det, ramverk för VoIP-notiser på iOS

Författare: IT Sectr Publicerad: 2026-03-22 Lästid: 8 min

PushKit är ett iOS-ramverk för leverans av VoIP-notiser med låg latens som kringgår standard-APNs. Enligt Apple Developer Documentation (2025) garanterar PushKit leverans av samtal inom 5 sekunder även i bakgrunden. VoIP-notiser bearbetas direkt utan att behöva visa en banner för användaren, vilket gör ramverket till det huvudsakliga verktyget för meddelande- och videoappar på iOS.

Huvudpunkter

  • PushKit — iOS-ramverk för leverans av VoIP-notiser med prioritet och låg latens.
  • Notiser bearbetas utan att visa banner — appen vaknar i bakgrunden för att bearbeta samtalet.
  • Registrering sker via PKPushRegistry med typen pushType .voIP.
  • Skillnad från APNs — PushKit använder inte standardkanalen för notiser och har högre prioritet.
  • Begränsningar — PushKit är endast avsett för VoIP och kan inte användas för vanliga push-notiser.

Vad är PushKit

PushKit är ett ramverk från Apple, introducerat i iOS 8, som levererar push-notiser med låg latens för VoIP-appar. Till skillnad från standard-APNs (Apple Push Notification service) kan PushKit väcka appen i bakgrunden vid ett inkommande samtal utan att visa en notis för användaren. Detta är avgörande för röst- och videoappar — användaren får samtalet omedelbart, även om appen är stängd. Enligt Apple WWDC 2024 bearbetar PushKit över 2 miljarder VoIP-notiser dagligen globalt.

Hur PushKit fungerar

Funktionsmekanismen bygger på en direkt anslutning mellan enheten och Apples push-server, som kringgår standardkanalen för notiser. När app-servern skickar en VoIP-notis passerar den via en dedikerad PushKit-server och levereras till enheten med högsta prioritet. Systemet väcker appen i bakgrunden och anropar delegatmetoden pushRegistry:didReceiveIncomingPushWithPayload:forType:. Appen tar emot payload, bearbetar samtalet och anropar completion handler för bekräftelse. Hela cykeln från sändning till bearbetning tar högst 5 sekunder, vilket bekräftas av Apples specifikation.

Skillnader mellan PushKit och APNs

Den huvudsakliga skillnaden mellan PushKit och APNs ligger i leveransmekanismen och bearbetningen. APNs använder standardkanalen för notiser med visning av banner, ljud eller märke, medan PushKit levererar data direkt till appen utan visuell notis. Nedan finns en jämförelsetabell över nyckelegenskaper.

EgenskapPushKitAPNs
LeveransprioritetHög (omedelbar leverans)Medel (möjlig försening)
Väck appenJa, i bakgrundenEndast vid klick på notis
Visa bannerNejJa (valfritt)
AnvändningVoIP, samtal, videokommunikationAlla typer av notiser
PayloadEndast JSON, utan mediaJSON + bilagor

PushKit stöder inte heller rika mediabilagor och kan inte användas för vanliga marknadsföringsnotiser. Apple kontrollerar strikt användningen av PushKit — appen måste ha explicit VoIP-funktionalitet, annars kommer den att avvisas vid granskning. APNs förblir den universella lösningen för alla andra scenarier.

Registrering och mottagning av VoIP-notiser

För att använda PushKit måste appen registrera sig via PKPushRegistry med typen pushType .voIP. Registrering sker en gång vid första start, varefter systemet genererar en unik push-token och skickar den via delegaten. Denna token skickas till app-servern för efterföljande sändning av VoIP-notiser. Nedan finns ett exempel på PushKit-registrering och inhämtning av token i Swift.

Konfigurera PushKit-registrering

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

Efter anrop av desiredPushTypes med PKPushType.voIP begär systemet automatiskt tillstånd att ta emot VoIP-notiser. I metoden pushRegistry:didUpdatePushCredentials:forType: tar appen emot en enhetstoken som Data, som omvandlas till en hex-sträng och skickas till servern. Token är unik för varje enhet och ändras vid ominstallation av appen — servern måste hantera token-uppdateringar.

Ta emot en inkommande notis

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

I metoden didReceiveIncomingPushWith tar appen emot payload med samtalsdata. Efter att information om den som ringer har extraherats skapas en CXCallUpdate från CallKit-ramverket för att visa skärmen för inkommande samtal. Det är viktigt att anropa completion handler efter bearbetningens slutförande — annars kan systemet tvångsavsluta appens process på grund av tidsöverskridning. Maximal bearbetningstid är 30 sekunder, varefter iOS betraktar notisen som obearbetad.

Hantering av inkommande samtal med CallKit

PushKit är nära integrerat med CallKit — ramverket för att visa systemgränssnittet för samtal på iOS. När appen tar emot en VoIP-notis via PushKit måste den skapa en CXProvider och CXCallController för att hantera samtalet. CallKit visar automatiskt skärmen för inkommande samtal på låsskärmen, även om appen är minimerad. Nedan finns ett exempel på konfiguration av en CallKit-leverantör.

swift
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 definierar utseendet och beteendet för samtalskärmen — appens namn, videostöd, antal samtidiga samtal. Integrationen av PushKit med CallKit är obligatorisk för VoIP-appar: utan den visar systemet inte skärmen för inkommande samtal och användaren missar samtalet. Apple kräver användning av CallKit för alla appar som använder PushKit.

Funktioner och begränsningar

Användning av PushKit medför ett antal strikta begränsningar som fastställts av Apple. Ramverket får endast användas för VoIP-funktionalitet — alla försök att skicka marknadsföringsnotiser via PushKit leder till blockering av appen. Payload-storleken får inte överstiga 4 KB och får endast innehålla JSON-data utan bilagor. Från och med iOS 13 införde Apple en begränsning av frekvensen för VoIP-notiser — högst en notis per minut per enhet. Servern måste följa denna begränsning, annars kommer notiserna att avvisas av systemet. PushKit fungerar inte heller på iOS-simulatorn — testning är endast möjlig på en fysisk enhet.

PushKit payload-struktur

Payload för en VoIP-notis är en JSON-ordbok med anpassade samtalsdata. Till skillnad från APNs stöder PushKit inte standardfälten alert, badge och sound — alla data definieras av utvecklaren. En typisk struktur innehåller den uppringdas identifierare (caller), samtals typ (voice eller video), ett rum eller sessions-ID och en tidsstämpel. Storleken på varje fält bör vara minimal för att spara utrymme inom 4 KB-gränsen. Apple rekommenderar att endast den data som krävs för att visa skärmen för inkommande samtal på låsskärmen inkluderas i payload, medan övrig information (avatar, chattlogg) laddas efter att användaren svarat via en separat nätverksförfrågan. Exempel på minimal payload: { “caller”: “Anna”, “caller_id”: “+79161234567”, “type”: “audio”, “room”: “uuid-room-1234”, “ts”: 1718534400 }. Alla nycklar i payload bör vara korta, entydiga och dokumenterade på serversidan för kompatibilitet mellan appversioner.

Felhantering och återförsök

Vid arbete med PushKit måste hantering av leveransfel och anslutningsförlust förutses. Om enheten är offline eller frånkopplad från nätverket kommer VoIP-notisen inte att levereras — PushKit stöder inte lagring och omsändning, till skillnad från APNs som lagrar notisen i upp till 24 timmar för återförsök. Servern måste själv spåra olevererade notiser och göra om försök efter att anslutningen återställts. För detta används mekanismen push kit feedback service — den returnerar en lista över olevererade notiser med angivande av felorsak. Det rekommenderas att övervaka leveransframgången för VoIP-notiser via serveranalys och meddela utvecklaren när andelen framgångsrika leveranser sjunker under 95 %. PushKit-systemet garanterar leverans endast vid aktiv internetanslutning på enheten — i avsaknad av detta förloras notisen oåterkalleligt, vilket är kritiskt att ta hänsyn till vid design av ett tillförlitligt VoIP-samtalssystem med garanterad leverans.

Vanliga frågor

Vad är PushKit?

PushKit är ett Apple-ramverk för leverans av VoIP-notiser med låg latens som gör att appen kan väckas i bakgrunden vid inkommande samtal utan banner. Används i meddelande- och videoappar.

Vad är skillnaden mellan PushKit och APNs?

PushKit har högre leveransprioritet och väcker appen i bakgrunden utan att visa en notis för användaren. APNs levererar notiser med banner och kan inte väcka appen för att bearbeta ett samtal utan användarinteraktion.

Är det obligatoriskt att använda CallKit med PushKit?

Ja, Apple kräver integration av PushKit med CallKit för att visa systemets skärm för inkommande samtal. Utan CallKit kan appen inte visa inkommande samtal på låsskärmen, vilket gör VoIP-funktionaliteten oanvändbar.

Hur får man en PushKit-token?

Token erhålls efter att ha skapat PKPushRegistry med typ .voIP och implementerat delegaten pushRegistry:didUpdatePushCredentials:forType:. Token överförs som Data och måste omvandlas till en hex-sträng för sändning till servern.

Vilka begränsningar finns för payload-storleken i PushKit?

Den maximala payload-storleken för PushKit är 4 KB. Data måste vara i JSON-format. Mediabilagor stöds inte. Från iOS 13 gäller en begränsning på högst en VoIP-notis per minut per enhet.

Sammanfattning

  • PushKit — iOS-ramverk för leverans av VoIP-notiser med låg latens, som kringgår APNs.
  • Prioriteten för PushKit-leverans är högre än APNs — notisen anländer inom 5 sekunder.
  • Appen vaknar i bakgrunden vid mottagning av notis, utan banner för användaren.
  • Registrering sker via PKPushRegistry med PKPushType.voIP och delegaten PKPushRegistryDelegate.
  • CallKit är obligatoriskt för att visa systemets skärm för inkommande samtal på iOS.
  • Payload begränsad till 4 KB, endast JSON, högst en notis per minut från iOS 13.
  • Rekommendation — använd PushKit endast för VoIP-funktionalitet, för andra notiser använd APNs.

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å