CallKit — Apple freymvorki bo‘lib, VoIP ilovalariga kiruvchi va chiquvchi qo‘ng‘iqlarni iOS telefonining tizim interfeysida, jumladan qulf ekranida ko‘rsatish imkonini beradi. Dasturchi standart boshqaruv elementlarini — qabul qilish, rad etish, ushlab turish — o‘z UI ni yaratmasdan oladi. Apple Developer Documentation, 2026 ma‘lumotiga ko‘ra, freymvork yagona tizim interfeysi orqali VoIP qo‘ng‘iqlarining 98% gacha qayta ishlaydi, bu esa turli messengerlar va aloqa ilovalari o‘rtasida foydalanuvchi tajribasining parchalanishini bartaraf etadi.
Asosiy fikrlar
CallKit — iOS 10 da taqdim etilgan Apple freymvorki bo‘lib, VoIP ilovalarini tizim telefoni ilovasi bilan integratsiya qilish uchun dasturiy interfeysni ta’minlaydi. CallKit dan oldin har bir VoIP ilovasi kiruvchi qo‘ng‘iroqni o‘z UI da ko‘rsatardi — foydalanuvchi ilovadan bildirishnomani ko‘rar edi, lekin tizim usulida javob bera olmas edi. CallKit bu tajribani birlashtiradi: kiruvchi VoIP qo‘ng‘irog‘i oddiy telefon qo‘ng‘irog‘i kabi bir xil boshqaruv elementlari bilan ko‘rsatiladi.
CallKit ning asosiy maqsadi foydalanuvchi tajribasining parchalanishini bartaraf etishdir. Ilova CallKit dan foydalanganda, qo‘ng‘iroq qulf ekranida, qo‘ng‘iroqlar tarixida va tizim Telefon ilovasining so‘nggi qo‘ng‘iroqlar ro‘yxatida paydo bo‘ladi. Foydalanuvchi tanish imo-ishoralar bilan javob berishi, rad etishi yoki qo‘ng‘iroqni ovozli pochtaga yuborishi mumkin — qaysi ilova qo‘ng‘iroqni qayta ishlayotganini o‘ylamasdan.
Apple WWDC 2023 Session “What’s new in CallKit” ma‘lumotiga ko‘ra, foydalanuvchilarning 85% dan ortig‘i CallKit integratsiyasiga ega ilovalarni o‘z UI dan foydalanadiganlarga nisbatan afzal ko‘radi. Sabab — o‘rganishni talab qilmaydigan tizim boshqaruv elementlarining bir xilligi va bashorat qilish mumkinligi.
CallKit siz kiruvchi VoIP qo‘ng‘irog‘i standart push bildirishnomasi orqali yetkaziladi. Foydalanuvchi bannerni ko‘radi, unga tegadi, ilovaning ochilishini kutadi va shundan keyingina qo‘ng‘iroq ekranini ko‘radi. CallKit PushKit bilan birgalikda bu yo‘lni nolga tushiradi: qo‘ng‘iroq bir zumda ko‘rinadi, hatto ilova ishga tushirilmagan bo‘lsa ham, tizim interfeysi millisoniyalarda javob berishga tayyor.
CallKit arxitekturasi ikkita asosiy sinf — CXProvider va CXCallController atrofida qurilgan bo‘lib, ular provayder-mijoz namunasini amalga oshiradi. Provayder tizim tomonidan qo‘ng‘iroqni boshqaradi, mijoz foydalanuvchi yoki ilova nomidan harakatlarni boshlaydi. Bu bo‘linish, ilova vaqtincha mavjud bo‘lmaganda ham, tizim interfeysining doimo izchil qolishini kafolatlaydi.
CXProvider — ilovani CallKit da qo‘ng‘iroq provayderi sifatida ro‘yxatdan o‘tkazadigan markaziy ob’ekt. U CXProviderConfiguration orqali sozlanadi, unda ilova ikonkasi, qo‘llab-quvvatlanadigan qo‘ng‘iroq turlari (audio, video) va bir vaqtning o‘zida guruhlarning maksimal soni ko‘rsatiladi. Provayder tizimdan harakat so‘rovlarini oladi va ularni CXProviderDelegate orqali ilovaga uzatadi.
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 — ilova qo‘ng‘iroqlar ustida harakatlarni so‘raydigan mijoz ob’ekti: boshlash, tugatish, ushlab turish, almashish. So‘rovlar CallKit ga CXTransaction orqali uzatiladi, unda CXAction ob’ektlari massivi mavjud. CallKit har bir harakatni tekshiradi va joriy holatda ruxsat etilsa, uni bajaradi.
let controller = CXCallController()
let startCallAction = CXStartCallAction(
callUUID: UUID(),
handle: CXHandle(type: .phoneNumber, value: "+15551234567")
)
startCallAction.isVideo = true
controller.request(CXTransaction(action: startCallAction))
Provayderning delegati CallKit dan barcha hodisalarni oladi. Kritik metod — providerDidBegin, qo‘ng‘iroq boshlanganini bildiradi. provider:performAnswerCallAction da ilova audio sessiyani boshlashi kerak: AVAudioSession ni faollashtirishi va media uzatishni boshlashi kerak. Agar ilova cheklangan vaqt ichida audio sessiyani faollashtirmasa, CallKit qo‘ng‘iroqni tugatadi.
PushKit — kiruvchi VoIP qo‘ng‘iqlarini CallKit ga yetkazish uchun majburiy komponent. Oddiy push bildirishnomalari (APNs) oldindan aytib bo‘lmaydigan kechikishga ega va ilova fonda bo‘lsa, yetkazishni kafolatlamaydi. PushKit real vaqtda qo‘ng‘iroqlar uchun muhim bo‘lgan VoIP bildirishnomalarini darhol yetkazish uchun Apple serverlari bilan doimiy TCP ulanishidan foydalanadi.
Ish sxemasi: server PushKit orqali VoIP bildirishnomasini yuboradi → ilova uni pushRegistry:didReceiveIncomingPushWithPayload da qabul qiladi → ilova darhol CXProvider orqali kiruvchi qo‘ng‘iroqni ko‘rsatadi → CallKit tizim qo‘ng‘iroq ekranini namoyish etadi. Hammasi soniyaning kichik qismida sodir bo‘ladi va foydalanuvchi qo‘ng‘iroqni serverga kelishi bilan bir vaqtda ko‘radi.
iOS 13 dan boshlab Apple cheklov kiritdi: VoIP bildirishnomalari faqat kiruvchi qo‘ng‘iroqlarni ko‘rsatish uchun ishlatilishi kerak. PushKit ni fon ma’lumotlarini yuklash yoki tarkibni yangilash uchun ishlatish taqiqlangan — bunday ilovalar moderatsiyada rad etilishi mumkin. Bu o‘zgarish VoIP ekotizimini oldindan aytish mumkin bo‘lgan holga keltirdi, chunki barcha PushKit bildirishnomalari endi kafolatlangan holda qo‘ng‘iroqlar bilan bog‘liq.
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 — ilovaga tizimga aniqlash (qo‘ng‘iroq qiluvchining nomini ko‘rsatish) va bloklash uchun raqamlar ro‘yxatini taqdim etish imkonini beradigan ilova kengaytmasi. Kengaytma asosiy ilovadan mustaqil ishlaydi: tizim faollashtirishda kengaytmadan ma’lumotlarni yuklaydi va barcha keyingi operatsiyalar ilova ishtirokisiz bajariladi, bu resurslarni tejaydi va xavfsizlikni oshiradi.
Kengaytma ma’lumotlarni boshqarish uchun CXCallDirectoryManager dan foydalanadi. Ilova asosiy jarayon orqali kengaytma ma’lumotlar bazasiga raqamlarni qo‘shadi va keyin tizim keshlarini yangilash uchun reloadExtension ni chaqiradi. Apple keraksiz tizim yukini oldini olish uchun ma’lumotlarni soatiga bir martadan ko‘p bo‘lmagan holda yangilashni tavsiya qiladi.
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 metodi | Maqsad |
|---|---|
| reloadExtension | Tizim keshlarini majburiy yangilash |
| getEnabledStatus | Kengaytma foydalanuvchi tomonidan yoqilganligini tekshirish |
| openSettings | Kengaytma sozlamalari ekraniga o‘tish |
To‘liq CallKit integratsiyasi uch komponentni sozlashni talab qiladi: provayder konfiguratsiyasi, PushKit orqali kiruvchi qo‘ng‘iroqlarni qayta ishlash va audio sessiyasini boshqarish. Quyida kiruvchi VoIP qo‘ng‘irog‘ini qayta ishlaydigan, uni CallKit orqali ko‘rsatadigan va audio faollashtiradigan minimal ishlaydigan misol keltirilgan.
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 iOS, macOS va iPadOS da mavjud, ammo freymvorkning xatti-harakati platformalar orasida farq qiladi. iOS da CallKit to‘liq hajmda ishlaydi: tizim qo‘ng‘iroq ekrani, qulf ekrani, CarPlay bilan integratsiya. iPadOS da qo‘ng‘iroqni ko‘rsatish to‘liq ekran interfeysi emas, balki tizim banneri shaklida amalga oshiriladi. macOS da CallKit macOS 10.14 Mojave dan boshlab mavjud, ammo faqat Catalyst bilan qurilgan yoki to‘g‘ridan-to‘g‘ri AppKit dan foydalanadigan Mac ilovalari uchun.
Asosiy cheklov — CallKit watchOS da qo‘llab-quvvatlanmaydi. Apple Watch dasturchilari soatda VoIP qo‘ng‘iqlarini tizim interfeysi orqali ko‘rsata olmaydi. Buning o‘rniga watchOS ilovasi WCSession orqali qo‘ng‘iroq haqida bildirishnoma oladi va o‘z qo‘ng‘iroq ekranini amalga oshirishi kerak. CallKit shuningdek simulyatorda ishlamaydi — VoIP funksiyalarini sinash faqat jismoniy qurilmada mumkin.
| Funksiya | iOS | iPadOS | macOS |
|---|---|---|---|
| Tizim qo‘ng‘iroq ekrani | To‘liq ekran | Banner | Banner |
| Qulf ekrani | Ha | Yo‘q | Yo‘q |
| CarPlay | Ha | Yo‘q | Yo‘q |
| Call Directory | Ha | Ha | Yo‘q |
| Recents tarixi | Ha | Ha | Ha |
Ko‘p beriladigan savollar
Ha, kiruvchi qo‘ng‘iroqlar uchun PushKit majburiy. Faqat PushKit uxlab yotgan yoki yopiq ilovaga VoIP bildirishnomasining darhol yetkazilishini kafolatlaydi, bu CallKit orqali qo‘ng‘iroqni o‘z vaqtida ko‘rsatish uchun juda muhimdir.
Ha, CallKit audio va videoni qo‘llab-quvvatlaydi. CXProvider konfiguratsiyasida supportsVideo = true, CXStartCallAction da esa isVideo = true ni o‘rnating. Tizim qo‘ng‘iroq interfeysida kamera belgisini to‘g‘ri ko‘rsatadi.
Hech qanday — CallKit simulyatorda ishlamaydi. Sinash uchun jismoniy iOS yoki iPadOS qurilmasidan foydalaning. macOS da mikrofonli haqiqiy Mac da sinashingiz mumkin.
Ha, har bir ilova o‘z CXProvider ini ro‘yxatdan o‘tkazadi. Tizim turli ilovalardan qo‘ng‘iroqlarni to‘g‘ri qayta ishlaydi va ularni Recents da alohida qo‘ng‘iroqlar sifatida ko‘rsatadi. Foydalanuvchi qo‘ng‘iroq qaysi ilovadan kelganini ko‘radi.
CallKit cheklangan vaqt ichida ilova audio sessiyani faollashtirmasa, avtomatik ravishda qo‘ng‘iroqni tugatadi. Taymer tizim haqiqiy audio oqimisiz qo‘ng‘iroq holatida qolmasligi uchun ishga tushadi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.