CallKit — Apple freymvorkudur, VoIP tətbiqlərinə daxil olan və gedən zəngləri iOS telefonunun sistem interfeysində, o cümlədən bloklama ekranında göstərməyə imkan verir. Tərtibatçı standart idarəetmə elementləri — zəngi qəbul etmə, rədd etmə, saxlama — öz UI yaratmadan əldə edir. Apple Developer Documentation, 2026-ya görə, freymvork vahid sistem interfeysi vasitəsilə VoIP zənglərinin 98%-ə qədərini emal edir ki, bu da müxtəlif messencerlər və rabitə tətbiqləri arasında istifadəçi təcrübəsinin parçalanmasını aradan qaldırır.
Əsas məqamlar
CallKit — iOS 10-da təqdim edilmiş Apple freymvorkudur, VoIP tətbiqlərini sistem telefon tətbiqi ilə inteqrasiya etmək üçün proqram interfeysi təmin edir. CallKit-dən əvvəl hər bir VoIP tətbiqi daxil olan zəngi öz UI-sində göstərirdi — istifadəçi tətbiqdən bildiriş görürdü, lakin sistem üsulu ilə cavab verə bilmirdi. CallKit bu təcrübəni birləşdirir: daxil olan VoIP zəngi eyni idarəetmə elementləri ilə adi telefon zəngi kimi göstərilir.
CallKit-in əsas məqsədi istifadəçi təcrübəsinin parçalanmasını aradan qaldırmaqdır. Tətbiq CallKit istifadə etdikdə, zəng bloklama ekranında, zəng tarixçəsində və sistem Telefon tətbiqinin son zənglər siyahısında görünür. İstifadəçi tanış jestlərlə cavab verə, rədd edə və ya zəngi səsli poçta göndərə bilər — hansı tətbiqin zəngi emal etdiyini düşünmədən.
Apple WWDC 2023 Session “What’s new in CallKit” məlumatına görə, istifadəçilərin 85%-dən çoxu CallKit inteqrasiyası olan tətbiqləri öz UI-sindən istifadə edənlərə üstünlük verir. Səbəb — öyrənmə tələb etməyən sistem idarəetmə elementlərinin vahidliyi və proqnozlaşdırıla bilməsidir.
CallKit olmadan daxil olan VoIP zəngi standart push bildirişi vasitəsilə çatdırılır. İstifadəçi banner görür, ona toxunur, tətbiqin açılmasını gözləyir və yalnız bundan sonra zəng ekranını görür. CallKit PushKit ilə birlikdə bu yolu sıfıra endirir: zəng dərhal görünür, hətta tətbiq işə salınmayıbsa belə, sistem interfeysi millisaniyələr ərzində cavab verməyə hazırdır.
CallKit arxitekturası iki əsas sinif — CXProvider və CXCallController ətrafında qurulub, provider-klient nümunəsini reallaşdırır. Provider sistem tərəfindən zəngi idarə edir, klient istifadəçi və ya tətbiq adından hərəkətləri başladır. Bu bölgü, tətbiq müvəqqəti olaraq əlçatmaz olsa belə, sistem interfeysinin həmişə ardıcıl qalmasını təmin edir.
CXProvider — tətbiqi CallKit-də zəng təminatçısı kimi qeydiyyatdan keçirən mərkəzi obyekt. O, CXProviderConfiguration vasitəsilə konfiqurasiya olunur, burada tətbiq ikonu, dəstəklənən zəng növləri (audio, video) və eyni vaxtda qrupların maksimum sayı göstərilir. Provider sistemdən hərəkət sorğularını alır və onları CXProviderDelegate vasitəsilə tətbiqə ötürür.
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 — tətbiqin zənglər üzərində hərəkətlər tələb etdiyi müştəri obyekti: başlatma, bitirmə, saxlama, keçid. Sorğular CallKit-ə CXTransaction vasitəsilə ötürülür, tərkibində CXAction obyektləri massivi olur. CallKit hər bir hərəkəti yoxlayır və cari vəziyyətdə icazə verilirsə, onu yerinə yetirir.
let controller = CXCallController()
let startCallAction = CXStartCallAction(
callUUID: UUID(),
handle: CXHandle(type: .phoneNumber, value: "+15551234567")
)
startCallAction.isVideo = true
controller.request(CXTransaction(action: startCallAction))
Providerin delegatı CallKit-dən bütün hadisələri alır. Kritik metod — providerDidBegin, zəngin başladığını bildirir. provider:performAnswerCallAction-da tətbiq audio sessiyasını başlatmalıdır: AVAudioSession-u aktivləşdirməli və media ötürülməsinə başlamalıdır. Tətbiq məhdud vaxt ərzində audio sessiyasını aktivləşdirməsə, CallKit zəngi bitirəcək.
PushKit — daxil olan VoIP zənglərini CallKit-ə çatdırmaq üçün məcburi komponent. Adi push bildirişləri (APNs) proqnozlaşdırıla bilməyən gecikməyə malikdir və tətbiq fondadırsa, çatdırılmaya zəmanət vermir. PushKit real vaxtda zənglər üçün kritik olan VoIP bildirişlərinin dərhal çatdırılması üçün Apple serverləri ilə daimi TCP əlaqəsindən istifadə edir.
İş sxemi: server PushKit vasitəsilə VoIP bildirişi göndərir → tətbiq onu pushRegistry:didReceiveIncomingPushWithPayload-da qəbul edir → tətbiq dərhal CXProvider vasitəsilə daxil olan zəngi göstərir → CallKit sistem zəng ekranını nümayiş etdirir. Hər şey saniyənin kiçik hissəsində baş verir və istifadəçi zəngi serverə gəlişi ilə eyni anda görür.
iOS 13-dən başlayaraq Apple məhdudiyyət tətbiq etdi: VoIP bildirişləri yalnız daxil olan zəngləri göstərmək üçün istifadə edilməlidir. PushKit-in fon məlumat yükləmə və ya məzmun yeniləmə üçün istifadəsi qadağandır — belə tətbiqlər moderasiya zamanı rədd edilə bilər. Bu dəyişiklik VoIP ekosistemini daha proqnozlaşdırıla bilən etdi, çünki bütün PushKit bildirişləri indi zəmanətli şəkildə zənglərlə əlaqəlidir.
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 — tətbiqə sistemə identifikasiya (zəng edənin adının göstərilməsi) və bloklama üçün nömrə siyahıları təqdim etməyə imkan verən tətbiq genişlənməsidir. Genişlənmə əsas tətbiqdən asılı olmayaraq işləyir: sistem aktivləşdirmə zamanı genişlənmədən məlumatları yükləyir və bütün sonrakı əməliyyatlar tətbiqin iştirakı olmadan yerinə yetirilir ki, bu da resurslara qənaət edir və təhlükəsizliyi artırır.
Genişlənmə məlumatları idarə etmək üçün CXCallDirectoryManager-dən istifadə edir. Tətbiq əsas proses vasitəsilə genişlənmənin məlumat bazasına nömrələr əlavə edir və sonra sistem keşini yeniləmək üçün reloadExtension-i çağırır. Apple lazımsız sistem yükünün qarşısını almaq üçün məlumatları saatda bir dəfədən çox olmayaraq yeniləməyi tövsiyə edir.
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 metodu | Təyinat |
|---|---|
| reloadExtension | Sistem keşinin məcburi yenilənməsi |
| getEnabledStatus | Genişlənmənin istifadəçi tərəfindən aktivləşdirilib-yoxlanılmadığının yoxlanması |
| openSettings | Genişlənmə parametrləri ekranına keçid |
Tam CallKit inteqrasiyası üç komponentin konfiqurasiyasını tələb edir: provider konfiqurasiyası, PushKit vasitəsilə daxil olan zənglərin işlənməsi və audio sessiyasının idarə edilməsi. Aşağıda daxil olan VoIP zəngini emal edən, onu CallKit vasitəsilə göstərən və audio aktivləşdirən minimal işlək nümunə verilmişdir.
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 və iPadOS-da mövcuddur, lakin freymvorkun davranışı platformalar arasında fərqlənir. iOS-da CallKit tam həcmdə işləyir: sistem zəng ekranı, bloklama ekranı, CarPlay ilə inteqrasiya. iPadOS-da zəngin göstərilməsi tam ekran interfeysi deyil, sistem banneri şəklində baş verir. macOS-da CallKit macOS 10.14 Mojave-dən etibarən mövcuddur, lakin yalnız Catalyst ilə qurulmuş və ya birbaşa AppKit istifadə edən Mac tətbiqləri üçün.
Əsas məhdudiyyət — CallKit watchOS-da dəstəklənmir. Apple Watch tərtibatçıları saatda VoIP zənglərini sistem interfeysi vasitəsilə göstərə bilməzlər. Bunun əvəzinə watchOS tətbiqi WCSession vasitəsilə zəng barədə bildiriş alır və öz zəng ekranını həyata keçirməlidir. CallKit həmçinin simulyatorda işləmir — VoIP funksiyalarının test edilməsi yalnız fiziki cihazda mümkündür.
| Funksiya | iOS | iPadOS | macOS |
|---|---|---|---|
| Sistem zəng ekranı | Tam ekran | Banner | Banner |
| Bloklama ekranı | Bəli | Xeyr | Xeyr |
| CarPlay | Bəli | Xeyr | Xeyr |
| Call Directory | Bəli | Bəli | Xeyr |
| Recents tarixçəsi | Bəli | Bəli | Bəli |
Tez-tez verilən suallar
Bəli, daxil olan zənglər üçün PushKit məcburidir. Yalnız PushKit yuxuda olan və ya bağlı tətbiqə VoIP bildirişinin dərhal çatdırılmasını təmin edir ki, bu da CallKit vasitəsilə zəngin vaxtında göstərilməsi üçün kritikdir.
Bəli, CallKit audio və videonu dəstəkləyir. CXProvider konfiqurasiyasında supportsVideo = true, CXStartCallAction-da isə isVideo = true təyin edin. Sistem zəng interfeysində kamera ikonasını düzgün göstərəcək.
Heç bir şəkildə — CallKit simulyatorda işləmir. Test üçün fiziki iOS və ya iPadOS cihazından istifadə edin. macOS-da real mikrofona malik Mac-da test edə bilərsiniz.
Bəli, hər bir tətbiq öz CXProvider-ini qeydiyyatdan keçirir. Sistem müxtəlif tətbiqlərdən zəngləri düzgün emal edir və onları Recents-də ayrıca zənglər kimi göstərir. İstifadəçi zəngin hansı tətbiqdən gəldiyini görür.
CallKit məhdud vaxt ərzində tətbiq audio sessiyasını aktivləşdirməsə, avtomatik olaraq zəngi bitirəcək. Taymer sistemin real audio axını olmadan zəng vəziyyətində qalmaması üçün işə düşür.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun