CallKit: шта је то, VoIP оквир и интеграција са системским телефоном

Аутор: IT Sectr Објављено: 2026-06-16 Време читања: 9 мин

CallKit — Apple оквир који омогућава VoIP апликацијама да прикажу долазне и одлазне позиве у системском интерфејсу телефона iOS, укључујући екран закључавања. Програмер добија стандардне контроле — прихватање, одбијање, задржавање позива — без потребе за креирањем сопственог UI. Према Apple Developer Documentation, 2026, оквир обрађује до 98% VoIP позива кроз јединствени системски интерфејс, чиме се елиминише фрагментација корисничког искуства између различитих месенџера и комуникационих апликација.

Главне тачке

  • CallKit — оквир за интеграцију VoIP позива у системску апликацију Телефон на iOS, macOS и iPadOS.
  • CXProvider — главна класа за управљање позивима: започињање, завршетак, задржавање и пребацивање између позива.
  • CXCallController — клијентски интерфејс за обављање одлазних позива и захтевање радњи над тренутним позивима.
  • Call Directory Extension — проширење за идентификацију и блокирање долазних бројева на нивоу система.
  • PushKit — обавезни пратилац CallKit-а: доставља долазне VoIP обавештења без кашњења за тренутни приказ позива.

Шта је CallKit и зашто је потребан?

CallKit — Apple оквир, представљен у iOS 10, који пружа програмски интерфејс за интеграцију VoIP апликација са системском телефонском апликацијом. Пре појаве CallKit-а, свака VoIP апликација је приказивала долазни позив у сопственом UI-ју — корисник је видео обавештење од апликације, али није могао да одговори на системски начин. CallKit обједињује ово искуство: долазни VoIP позив се приказује као обичан телефонски позив са истим контролама.

Главни циљ CallKit-а је елиминисање фрагментације корисничког искуства. Када апликација користи CallKit, позив се појављује на екрану закључавања, у историји позива и на листи недавних позива системске апликације Телефон. Корисник може да одговори, одбије или пошаље позив на говорну пошту познатим гестовима — не размишљајући која апликација обрађује позив.

Према Apple WWDC 2023 Session „What’s new in CallKit“, више од 85% корисника преферира апликације са CallKit интеграцијом у односу на оне које користе сопствени UI за позиве. Разлог — једнообразност и предвидљивост системских контрола које не захтевају учење.

Како CallKit мења корисничко искуство VoIP-а

Без CallKit-а, долазни VoIP позив се доставља путем стандардног push обавештења. Корисник види банер, тапне на њега, чека отварање апликације и тек тада види екран позива. CallKit заједно са PushKit-ом скраћује овај пут на нулу: позив се појављује тренутно, чак и ако апликација није покренута, а системски интерфејс је спреман за одговор у милисекундама.

  • Позив се приказује на закључаном екрану и увек је видљив изнад других апликација
  • Подржане су стандардне радње: прихвати, одбиј, подсети, одговори поруком
  • Интеграција са CarPlay-ом — позиви се приказују на екрану аутомобила
  • Аутоматско бележење у Recents и системској историји позива

Архитектура CallKit-а: CXProvider и CXCallController

Архитектура CallKit-а је изграђена око две кључне класе — CXProvider и CXCallController, које реализују образац провајдер-клијент. Провајдер управља позивом на страни система, клијент покреће радње у име корисника или апликације. Ова подела гарантује да системски интерфејс увек остаје доследан, чак и ако је апликација привремено недоступна.

CXProvider — провајдер позива

CXProvider — централни објекат који региструје апликацију у CallKit-у као провајдера позива. Конфигурише се кроз CXProviderConfiguration, где се наводе иконица апликације, подржани типови позива (аудио, видео) и максимални број истовремених група. Провајдер прима од система захтеве за радње и прослеђује их апликацији преко делегата CXProviderDelegate.

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 — управљање позивима

CXCallController — клијентски објекат кроз који апликација захтева радње над позивима: започињање, завршетак, задржавање, пребацивање. Захтеви се прослеђују CallKit-у кроз CXTransaction, који садржи низ CXAction објеката. CallKit валидира сваку радњу и извршава је ако је дозвољена у тренутном стању.

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

CXProviderDelegate — обрада догађаја

Делегат провајдера прима све догађаје од CallKit-а. Критична метода — providerDidBegin, која сигнализира да је позив започет. У provider:performAnswerCallAction апликација треба да започне аудио сесију: активира AVAudioSession и започне пренос медија. Ако апликација не активира аудио сесију у ограниченом времену, CallKit ће завршити позив.

  • providerDidBegin — позив је започет, може се припремити аудио
  • provider:performAnswerCallAction — корисник је одговорио, потребна је активација AVAudioSession-а
  • provider:performEndCallAction — позив је завршен, потребно зауставити медије
  • provider:performSetMutedCallAction — пребацивање микрофона

Интеграција PushKit-а са CallKit-ом за долазне позиве

PushKit — обавезна компонента за достављање долазних VoIP позива у CallKit. Обична push обавештења (APNs) имају непредвидиво кашњење и не гарантују доставу ако је апликација у позадини. PushKit користи сталну TCP везу са Apple серверима за тренутну доставу VoIP обавештења, што је критично за позиве у реалном времену.

Шема рада: сервер шаље VoIP обавештење путем PushKit-а → апликација га прима у pushRegistry:didReceiveIncomingPushWithPayload → апликација одмах приказује долазни позив кроз CXProvider → CallKit приказује системски екран позива. Све се дешава у делићу секунде, а корисник види позив истовремено са његовим пристизањем на сервер.

Почев од iOS 13, Apple је увео ограничење: VoIP обавештења треба користити само за индикацију долазних позива. Коришћење PushKit-а за позадинско учитавање података или ажурирање садржаја је забрањено — такве апликације могу бити одбијене при модерацији. Ова промена је учинила VoIP екосистем предвидљивијим, јер су сада сва PushKit обавештења гарантовано повезана са позивима.

Пример обраде долазног PushKit обавештења

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: блокирање и идентификација бројева

Call Directory Extension — проширење апликације које омогућава апликацији да пружи систему листе бројева за идентификацију (приказ имена позиваоца) и блокирање. Проширење ради независно од главне апликације: систем учитава податке из проширења при активацији, а све даље операције се извршавају без учешћа апликације, што штеди ресурсе и повећава безбедност.

Проширење користи CXCallDirectoryManager за управљање подацима. Апликација кроз главни процес додаје бројеве у базу података проширења, а затим позива reloadExtension за ажурирање системског кеша. Apple препоручује ажурирање података не чешће од једном на сат како би се избегло непотребно оптерећење система.

Пример имплементације Call Directory Extension-а

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-аНамена
reloadExtensionПринудно ажурирање системског кеша
getEnabledStatusПровера да ли је проширење омогућено од стране корисника
openSettingsПрелазак на екран подешавања проширења

Пример интеграције CallKit-а у Swift-у

Потпуна интеграција CallKit-а захтева подешавање три компоненте: конфигурацију провајдера, обраду долазних позива кроз PushKit и управљање аудио сесијом. Испод је минимални радни пример који обрађује долазни VoIP позив, приказује га кроз CallKit и активира аудио.

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-а на различитим платформама

CallKit је доступан на iOS, macOS и iPadOS, али се понашање оквира разликује између платформи. На iOS-у CallKit ради у пуном обиму: системски екран позива, закључани екран, интеграција са CarPlay-ом. На iPadOS-у приказ позива се одвија у облику системског банера, а не преко целог екрана. На macOS-у CallKit је доступан од macOS 10.14 Mojave, али само за Mac апликације саграђене са Catalyst-ом или које директно користе AppKit.

Кључно ограничење — CallKit није подржан на watchOS-у. Програмери Apple Watch-а не могу приказивати VoIP позиве кроз системски интерфејс на сату. Уместо тога, watchOS апликација добија обавештење о позиву кроз WCSession и мора да имплементира сопствени екран позива. Такође, CallKit не ради на симулатору — тестирање VoIP функција је могуће само на физичком уређају.

Поређење CallKit-а на iOS, iPadOS и macOS

ФункцијаiOSiPadOSmacOS
Системски екран позиваЦео екранБанерБанер
Закључани екранДаНеНе
CarPlayДаНеНе
Call DirectoryДаДаНе
Историја RecentsДаДаДа

Често постављана питања

Да ли је обавезно користити PushKit заједно са CallKit-ом?

Да, за долазне позиве PushKit је обавезан. Само PushKit гарантује тренутну доставу VoIP обавештења успаваној или затвореној апликацији, што је критично за благовремено приказивање позива кроз CallKit.

Може ли се CallKit користити за видео позиве?

Да, CallKit подржава аудио и видео. При конфигурацији CXProvider поставите supportsVideo = true, а у CXStartCallAction поставите isVideo = true. Систем ће исправно приказати иконицу камере у интерфејсу позива.

Како тестирати CallKit без физичког уређаја?

Никако — CallKit не ради на симулатору. За тестирање користите физички iOS или iPadOS уређај. На macOS-у можете тестирати на правом Mac-у са микрофоном.

Могу ли две апликације истовремено користити CallKit?

Да, свака апликација региструје сопствени CXProvider. Систем исправно обрађује позиве из различитих апликација и приказује их као одвојене позиве у Recents-у. Корисник види из које апликације је позив дошао.

Шта се дешава ако се AVAudioSession не активира након одговора на позив?

CallKit ће аутоматски завршити позив након ограниченог времена ако апликација не активира аудио сесију. Тајмер се покреће како систем не би остао у стању позива без стварног аудио тока.

Резиме

  • CallKit — Apple оквир за интеграцију VoIP позива у системску апликацију Телефон на iOS, iPadOS и macOS, доступан од iOS 10.
  • CXProvider и CXCallController — главне класе CallKit архитектуре које реализују образац провајдер-клијент за управљање позивима.
  • PushKit — обавезни пратилац CallKit-а за тренутну доставу долазних VoIP обавештења, који ради преко сталне TCP везе.
  • Call Directory Extension омогућава блокирање и идентификацију бројева на системском нивоу, што је корисно за антиспам апликације.
  • CallKit није подржан на watchOS-у и не ради на симулатору — тестирање VoIP функција захтева физички уређај.
  • На различитим платформама понашање CallKit-а се разликује: на iOS-у — интерфејс преко целог екрана, на iPadOS-у и macOS-у — системски банер.
  • Активација AVAudioSession-а након одговора на позив је обавезна — без ње CallKit завршава позив због тајмаута.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође