CallKit: mi ez, VoIP-keretrendszer és integráció a rendszertelefonnal

Szerző: IT Sectr Megjelenés: 2026-06-16 Olvasási idő: 9 perc

CallKit — Apple keretrendszer, amely lehetővé teszi a VoIP alkalmazások számára a bejövő és kimenő hívások megjelenítését az iOS telefon rendszerfelületén, beleértve a zárolási képernyőt. A fejlesztő szabványos vezérlőelemeket kap — elfogadás, elutasítás, hívás tartása — anélkül, hogy saját UI-t kellene létrehoznia. A Apple Developer Documentation, 2026 szerint a keretrendszer a VoIP-hívások akár 98%-át feldolgozza egységes rendszerfelületen keresztül, ami kiküszöböli a felhasználói élmény fragmentálódását a különböző üzenetküldők és kommunikációs alkalmazások között.

Főbb pontok

  • CallKit — keretrendszer a VoIP-hívások integrálásához a rendszer Telefon alkalmazásba iOS, macOS és iPadOS rendszeren.
  • CXProvider — a fő osztály a hívások kezeléséhez: indítás, befejezés, tartás és váltás a hívások között.
  • CXCallController — kliens felület kimenő hívások kezdeményezéséhez és műveletek kéréséhez az aktuális hívásokon.
  • Call Directory Extension — bővítmény a bejövő számok azonosításához és blokkolásához rendszerszinten.
  • PushKit — a CallKit kötelező társa: késedelem nélkül kézbesíti a bejövő VoIP-értesítéseket a hívás azonnali megjelenítéséhez.

Mi az a CallKit és mire való?

CallKit — Apple keretrendszer, amelyet iOS 10-ben vezettek be, és programozási felületet biztosít a VoIP alkalmazások integrálásához a rendszertelefon alkalmazással. A CallKit megjelenése előtt minden VoIP alkalmazás a saját UI-jában jelenítette meg a bejövő hívást — a felhasználó értesítést látott az alkalmazástól, de nem tudott rendszerszinten válaszolni. A CallKit egységesíti ezt az élményt: a bejövő VoIP-hívás ugyanazokkal a vezérlőelemekkel jelenik meg, mint egy szokásos telefonhívás.

A CallKit fő célja a felhasználói élmény fragmentálódásának megszüntetése. Amikor az alkalmazás CallKit-et használ, a hívás megjelenik a zárolási képernyőn, a hívás előzményekben és a rendszer Telefon alkalmazás legutóbbi hívásai között. A felhasználó ismerős mozdulatokkal válaszolhat, elutasíthatja vagy hangpostára küldheti a hívást — anélkül, hogy gondolkodnia kellene, melyik alkalmazás dolgozza fel a hívást.

Az Apple WWDC 2023 Session „What’s new in CallKit“ szerint a felhasználók több mint 85%-a részesíti előnyben a CallKit-integrációval rendelkező alkalmazásokat azokkal szemben, amelyek saját UI-t használnak a hívásokhoz. Ennek oka — a rendszerszintű vezérlőelemek egységessége és kiszámíthatósága, amelyek nem igényelnek tanulást.

Hogyan változtatja meg a CallKit a VoIP-felhasználói élményt

CallKit nélkül a bejövő VoIP-hívás szabványos push-értesítésen keresztül érkezik. A felhasználó egy banner-t lát, rákattint, megvárja az alkalmazás megnyitását, és csak azután látja a hívás képernyőt. CallKit a PushKit-tel együtt nullára csökkenti ezt az utat: a hívás azonnal megjelenik, még akkor is, ha az alkalmazás nincs elindítva, és a rendszerfelület ezredmásodpercek alatt készen áll a válaszadásra.

  • A hívás megjelenik a zárolási képernyőn és mindig látható más alkalmazások felett
  • Támogatott szabványos műveletek: elfogadás, elutasítás, emlékeztető, válasz üzenettel
  • Integráció a CarPlay-jel — a hívások megjelennek az autó képernyőjén
  • Automatikus rögzítés a Recents-ben és a rendszer hívás előzményeiben

CallKit architektúra: CXProvider és CXCallController

A CallKit architektúra két kulcsosztály köré épül — CXProvider és CXCallController, amelyek a provider-client mintát valósítják meg. A provider a hívást a rendszer oldaláról kezeli, a client a felhasználó vagy alkalmazás nevében kezdeményez műveleteket. Ez a szétválasztás garantálja, hogy a rendszerfelület mindig konzisztens marad, még akkor is, ha az alkalmazás ideiglenesen nem elérhető.

CXProvider — hívásprovider

CXProvider — a központi objektum, amely regisztrálja az alkalmazást a CallKit-ben hívásproviderként. A CXProviderConfiguration segítségével konfigurálható, ahol megadható az alkalmazás ikonja, a támogatott hívástípusok (audio, video) és az egyidejű csoportok maximális száma. A provider műveleti kéréseket kap a rendszertől, és továbbítja azokat az alkalmazásnak a CXProviderDelegate-en keresztül.

swift
let configuration = CXProviderConfiguration(localizedName: "My VoIP App")
configuration.supportedHandleTypes = [.phoneNumber, .generic]
configuration.maximumCallsPerCallGroup = 1

let provider = CXProvider(configuration: configuration)
provider.setDelegate(self, queue: .main)

CXCallController — hívások kezelése

CXCallController — a kliens objektum, amelyen keresztül az alkalmazás műveleteket kér a hívásokon: indítás, befejezés, tartás, váltás. A kérések CXTransaction-n keresztül kerülnek elküldésre a CallKit-nek, amely CXAction objektumok tömbjét tartalmazza. A CallKit érvényesíti az egyes műveleteket, és végrehajtja azokat, ha az aktuális állapotban engedélyezettek.

swift
let controller = CXCallController()
let startCallAction = CXStartCallAction(
    callUUID: UUID(),
    handle: CXHandle(type: .phoneNumber, value: "+15551234567")
)
startCallAction.isVideo = true
controller.request(CXTransaction(action: startCallAction))

CXProviderDelegate — események feldolgozása

A provider delegáltja megkapja az összes eseményt a CallKit-től. A kritikus metódus a providerDidBegin, amely jelzi, hogy a hívás elindult. A provider:performAnswerCallAction metódusban az alkalmazásnak el kell indítania egy audio munkamenetet: aktiválnia kell az AVAudioSession-t és el kell kezdenie a média átvitelét. Ha az alkalmazás nem aktiválja az audio munkamenetet korlátozott időn belül, a CallKit befejezi a hívást.

  • providerDidBegin — a hívás elindult, az audio előkészíthető
  • provider:performAnswerCallAction — a felhasználó válaszolt, az AVAudioSession aktiválása szükséges
  • provider:performEndCallAction — a hívás befejeződött, a médiát le kell állítani
  • provider:performSetMutedCallAction — mikrofon átkapcsolása

PushKit integráció CallKit-tel bejövő hívásokhoz

PushKit — kötelező komponens a bejövő VoIP-hívások CallKit-hez történő kézbesítéséhez. A szokásos push-értesítések (APNs) kiszámíthatatlan késleltetéssel rendelkeznek, és nem garantálják a kézbesítést, ha az alkalmazás háttérben fut. A PushKit állandó TCP-kapcsolatot használ az Apple szervereivel a VoIP-értesítések azonnali kézbesítéséhez, ami kritikus fontosságú a valós idejű hívásoknál.

Működési séma: a szerver VoIP-értesítést küld a PushKit-en keresztül → az alkalmazás fogadja azt a pushRegistry:didReceiveIncomingPushWithPayload-ben → az alkalmazás azonnal megjeleníti a bejövő hívást a CXProvider-en keresztül → a CallKit megjeleníti a rendszer hívás képernyőt. Minden a másodperc töredéke alatt történik, és a felhasználó a hívást a szerverre érkezéssel egy időben látja.

Az iOS 13-tól kezdve az Apple korlátozást vezetett be: a VoIP-értesítéseket csak a bejövő hívások jelzésére szabad használni. A PushKit használata háttéradatok betöltésére vagy tartalom frissítésére tilos — az ilyen alkalmazásokat a moderálás során elutasíthatják. Ez a változás kiszámíthatóbbá tette a VoIP ökoszisztémát, mivel az összes PushKit-értesítés mostantól garantáltan hívásokhoz kapcsolódik.

Példa bejövő PushKit-értesítés feldolgozására

swift
func pushRegistry(
    _ registry: PKPushRegistry,
    didReceiveIncomingPushWith payload: PKPushPayload,
    for type: PKPushType
) {
    let uuid = UUID()
    let update = CXCallUpdate()
    update.remoteHandle = CXHandle(
        type: .phoneNumber,
        value: payload.dictionaryPayload["caller"]
    )
    update.hasVideo = false
    
    provider.reportNewIncomingCall(with: uuid, update: update)
}

Call Directory Extension: számok blokkolása és azonosítása

Call Directory Extension — egy alkalmazásbővítmény, amely lehetővé teszi az alkalmazás számára, hogy számok listáit biztosítsa a rendszernek azonosításhoz (hívó nevének megjelenítése) és blokkoláshoz. A bővítmény a fő alkalmazástól függetlenül működik: a rendszer aktiváláskor betölti az adatokat a bővítményből, és minden további művelet az alkalmazás részvétele nélkül történik, ami erőforrásokat takarít meg és növeli a biztonságot.

A bővítmény CXCallDirectoryManager-t használ az adatok kezeléséhez. Az alkalmazás a fő folyamaton keresztül számokat ad hozzá a bővítmény adatbázisához, majd meghívja a reloadExtension-t a rendszer gyorsítótár frissítéséhez. Az Apple azt javasolja, hogy az adatokat óránként legfeljebb egyszer frissítsék a szükségtelen rendszerterhelés elkerülése érdekében.

Példa a Call Directory Extension megvalósítására

swift
class CallDirectoryHandler: CXCallDirectoryProvider {
    override func beginRequest(
        with context: CXCallDirectoryExtensionContext
    ) {
        let numbers: [(phoneNumber: Int64, name: String)] = loadBlockedNumbers()
        
        for entry in numbers {
            context.addIdentificationEntry(
                withNextSequentialPhoneNumber: entry.phoneNumber,
                label: entry.name
            )
        }
        context.completeRequest()
    }
}
CXCallDirectoryManager metódusRendeltetés
reloadExtensionRendszer gyorsítótár kényszerített frissítése
getEnabledStatusAnnak ellenőrzése, hogy a bővítmény engedélyezve van-e a felhasználó által
openSettingsNavigáció a bővítmény beállításai képernyőre

CallKit integráció példa Swift-ben

A teljes CallKit-integráció három komponens konfigurálását igényli: a provider konfigurációját, a bejövő hívások feldolgozását PushKit-en keresztül, és az audio munkamenet kezelését. Az alábbiakban egy minimális működő példa található, amely feldolgoz egy bejövő VoIP-hívást, megjeleníti azt CallKit-en keresztül, és aktiválja az audiót.

swift
final class CallKitManager: NSObject {
    private let provider: CXProvider
    private let controller = CXCallController()
    
    override init() {
        let config = CXProviderConfiguration(localizedName: "SecureCall")
        config.supportedHandleTypes = [.phoneNumber]
        config.maximumCallGroups = 1
        self.provider = CXProvider(configuration: config)
        super.init()
        provider.setDelegate(self, queue: .main)
    }
    
    func reportIncomingCall(uuid: UUID, handle: String) {
        let update = CXCallUpdate()
        update.remoteHandle = CXHandle(type: .phoneNumber, value: handle)
        provider.reportNewIncomingCall(with: uuid, update: update)
    }
}

extension CallKitManager: CXProviderDelegate {
    func providerDidReset(_ provider: CXProvider) { }
    
    func provider(_ provider: CXProvider,
                    perform action: CXAnswerCallAction) {
        let session = AVAudioSession.sharedInstance()
        try? session.setCategory(.playAndRecord)
        try? session.setActive(true)
        action.fulfill()
    }
}

CallKit korlátozások és jellemzők különböző platformokon

A CallKit iOS, macOS és iPadOS rendszeren érhető el, de a keretrendszer viselkedése platformonként eltérő. iOS-en a CallKit teljes mértékben működik: rendszer hívás képernyő, zárolási képernyő, CarPlay integráció. iPadOS-en a hívás megjelenítése rendszer banner formájában történik, nem teljes képernyős felületen. macOS-en a CallKit macOS 10.14 Mojave-tól érhető el, de csak a Catalyst-tel épített vagy közvetlenül AppKit-et használó Mac alkalmazások számára.

A kulcsfontosságú korlátozás — a CallKit nem támogatott watchOS rendszeren. Az Apple Watch fejlesztői nem tudják megjeleníteni a VoIP-hívásokat a rendszerfelületen az órán. Ehelyett a watchOS alkalmazás értesítést kap a hívásról a WCSession-ön keresztül, és saját hívás képernyőt kell megvalósítania. A CallKit emellett nem működik szimulátoron — a VoIP funkciók tesztelése csak fizikai eszközön lehetséges.

CallKit összehasonlítás iOS, iPadOS és macOS rendszeren

FunkcióiOSiPadOSmacOS
Rendszer hívás képernyőTeljes képernyőBannerBanner
Zárolási képernyőIgenNemNem
CarPlayIgenNemNem
Call DirectoryIgenIgenNem
Recents előzményekIgenIgenIgen

Gyakran ismételt kérdések

Kötelező a PushKit használata a CallKit-tel együtt?

Igen, bejövő hívások esetén a PushKit kötelező. Csak a PushKit garantálja a VoIP-értesítés azonnali kézbesítését alvó vagy zárolt alkalmazásnak, ami kritikus a hívás időben történő megjelenítéséhez a CallKit-en keresztül.

Használható a CallKit videohívásokhoz?

Igen, a CallKit támogatja az audio és videót. A CXProvider konfigurálásakor állítsa be a supportsVideo = true értéket, és a CXStartCallAction-ben állítsa be az isVideo = true értéket. A rendszer helyesen jeleníti meg a kamera ikont a hívás felületén.

Hogyan tesztelhető a CallKit fizikai eszköz nélkül?

Sehogy — a CallKit nem működik szimulátoron. Teszteléshez használjon fizikai iOS vagy iPadOS eszközt. macOS-en tesztelhet egy valódi Mac-en mikrofonnal.

Használhat két alkalmazás egyszerre CallKit-et?

Igen, minden alkalmazás regisztrálja a saját CXProvider-ét. A rendszer helyesen dolgozza fel a különböző alkalmazásokból érkező hívásokat, és különálló hívásokként jeleníti meg őket a Recents-ben. A felhasználó látja, hogy melyik alkalmazásból érkezett a hívás.

Mi történik, ha a hívás megválaszolása után nem aktiválódik az AVAudioSession?

A CallKit automatikusan befejezi a hívást korlátozott idő után, ha az alkalmazás nem aktiválja az audio munkamenetet. Az időzítő azért indul el, hogy a rendszer ne maradjon hívás állapotban valós audiofolyam nélkül.

Összefoglalás

  • CallKit — Apple keretrendszer a VoIP-hívások integrálásához a rendszer Telefon alkalmazásba iOS, iPadOS és macOS rendszeren, iOS 10 óta elérhető.
  • CXProvider és CXCallController — a CallKit architektúra fő osztályai, amelyek a provider-client mintát valósítják meg a hívások kezeléséhez.
  • PushKit — a CallKit kötelező társa a bejövő VoIP-értesítések azonnali kézbesítéséhez, állandó TCP-kapcsolaton keresztül működve.
  • Call Directory Extension lehetővé teszi a számok blokkolását és azonosítását rendszerszinten, ami hasznos az antispam alkalmazások számára.
  • A CallKit nem támogatott watchOS rendszeren és nem működik szimulátoron — a VoIP funkciók tesztelése fizikai eszközt igényel.
  • Különböző platformokon a CallKit viselkedése eltérő: iOS-en — teljes képernyős felület, iPadOS-en és macOS-en — rendszer banner.
  • Az AVAudioSession aktiválása a hívás megválaszolása után kötelező — enélkül a CallKit időtúllépés miatt befejezi a hívást.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is