CallKit: nedir, VoIP framework'ü ve sistem telefonu ile entegrasyon

Yazar: IT Sectr Yayınlanma: 2026-06-16 Okuma süresi: 9 dk

CallKit, VoIP uygulamalarının kilit ekranı da dahil olmak üzere iOS sistem telefon arayüzünde gelen ve giden aramaları görüntülemesine olanak tanıyan bir Apple framework'üdür. Geliştirici, kendi kullanıcı arayüzünü oluşturmak zorunda kalmadan standart kontrolleri (kabul etme, reddetme, aramayı bekletme) elde eder. Apple Developer Documentation, 2026'ya göre, framework, VoIP aramalarının %98'ine kadarını tek bir sistem arayüzü üzerinden işleyerek farklı mesajlaşma ve iletişim uygulamaları arasında kullanıcı deneyiminin parçalanmasını ortadan kaldırır.

Önemli Noktalar

  • CallKit — iOS, macOS ve iPadOS'ta sistem Telefon uygulamasına VoIP aramalarını entegre etmek için bir framework.
  • CXProvider — aramaları yönetmek için ana sınıf: başlatma, sonlandırma, bekletme ve aramalar arasında geçiş yapma.
  • CXCallController — giden aramalar yapmak ve mevcut aramalarda eylem talep etmek için bir istemci arayüzü.
  • Call Directory Extension — sistem düzeyinde gelen numaraları tanımlamak ve engellemek için bir uzantı.
  • PushKit — CallKit'in temel yardımcısı: anlık arama görüntüleme için gelen VoIP bildirimlerini gecikmesiz iletir.

CallKit Nedir ve Neden Gereklidir?

CallKit, iOS 10'da tanıtılan, VoIP uygulamalarını sistem Telefon uygulamasıyla entegre etmek için bir programlama arayüzü sağlayan bir Apple framework'üdür. CallKit'ten önce, her VoIP uygulaması gelen aramaları kendi kullanıcı arayüzünde görüntülüyordu — kullanıcı uygulamadan bir bildirim görüyor ancak sistemik bir şekilde yanıtlayamıyordu. CallKit bu deneyimi birleştirir: gelen bir VoIP araması, aynı kontrollerle normal bir telefon araması olarak görünür.

CallKit'in ana amacı, kullanıcı deneyiminin parçalanmasını ortadan kaldırmaktır. Bir uygulama CallKit kullandığında, arama kilit ekranında, arama geçmişinde ve sistem Telefon uygulamasının son aramalar listesinde görünür. Kullanıcı, hangi uygulamanın aramayı işlediğini düşünmeden tanıdık hareketlerle aramayı yanıtlayabilir, reddedebilir veya sesli mesaja gönderebilir.

Apple WWDC 2023 Oturumu “What’s new in CallKit”ye göre, kullanıcıların %85'inden fazlası, aramalar için kendi kullanıcı arayüzünü kullanan uygulamalar yerine CallKit entegrasyonlu uygulamaları tercih etmektedir. Bunun nedeni, öğrenme gerektirmeyen sistem kontrollerinin tutarlılığı ve öngörülebilirliğidir.

CallKit VoIP Kullanıcı Deneyimini Nasıl Değiştirir

CallKit olmadan, gelen bir VoIP araması standart bir push bildirimi aracılığıyla iletilir. Kullanıcı bir banner görür, ona dokunur, uygulamanın açılmasını bekler ve ancak o zaman arama ekranını görür. CallKit, PushKit ile birlikte bu yolu sıfıra indirir: uygulama çalışmıyor olsa bile arama anında görünür ve sistem arayüzü milisaniyeler içinde yanıt vermeye hazırdır.

  • Arama kilit ekranında görünür ve diğer uygulamaların üzerinde her zaman görünür
  • Standart eylemler desteklenir: yanıtla, reddet, hatırlat, mesajla yanıtla
  • CarPlay entegrasyonu — aramalar araç ekranında görünür
  • Son aramalar ve sistem arama geçmişine otomatik kayıt

CallKit Mimarisi: CXProvider ve CXCallController

CallKit mimarisi, sağlayıcı-istemci modelini uygulayan iki ana sınıf etrafında inşa edilmiştir — CXProvider ve CXCallController. Sağlayıcı, aramayı sistem tarafında yönetirken, istemci kullanıcı veya uygulama adına eylemler başlatır. Bu ayrım, uygulama geçici olarak kullanılamasa bile sistem arayüzünün her zaman tutarlı kalmasını sağlar.

CXProvider — Arama Sağlayıcısı

CXProvider, uygulamayı CallKit'te bir arama sağlayıcısı olarak kaydeden merkezi nesnedir. Uygulama simgesi, desteklenen arama türleri (ses, video) ve maksimum eşzamanlı grup sayısının belirtildiği CXProviderConfiguration aracılığıyla yapılandırılır. Sağlayıcı, sistemden eylem talepleri alır ve bunları CXProviderDelegate aracılığıyla uygulamaya iletir.

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 — Arama Yönetimi

CXCallController, uygulamanın aramalarda eylem talep ettiği istemci nesnesidir: başlatma, sonlandırma, bekletme, geçiş yapma. Talepler, CXAction nesnelerinden oluşan bir dizi içeren CXTransaction aracılığıyla CallKit'e gönderilir. CallKit her eylemi doğrular ve mevcut durumda izin veriliyorsa gerçekleştirir.

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

CXProviderDelegate — Olay İşleme

Sağlayıcı temsilcisi, CallKit'ten tüm olayları alır. Kritik yöntem, bir aramanın başladığını bildiren providerDidBegin'dir. provider:performAnswerCallAction'da uygulama bir ses oturumu başlatmalıdır: AVAudioSession'ı etkinleştirmeli ve medya iletimine başlamalıdır. Uygulama sınırlı bir süre içinde ses oturumunu etkinleştirmezse, CallKit aramayı sonlandıracaktır.

  • providerDidBegin — arama başladı, ses hazırlığı
  • provider:performAnswerCallAction — kullanıcı yanıtladı, AVAudioSession etkinleştirmesi gerekli
  • provider:performEndCallAction — arama sona erdi, medyayı durdur
  • provider:performSetMutedCallAction — mikrofonu aç/kapat

Gelen Aramalar için PushKit'in CallKit ile Entegrasyonu

PushKit, gelen VoIP aramalarını CallKit'e iletmek için zorunlu bir bileşendir. Standart push bildirimleri (APNs) öngörülemeyen gecikmeye sahiptir ve uygulama arka plandayken teslimatı garanti etmez. PushKit, gerçek zamanlı aramalar için kritik olan VoIP bildirimlerinin anında iletilmesi için Apple sunucularıyla kalıcı bir TCP bağlantısı kullanır.

İş akışı: sunucu PushKit aracılığıyla bir VoIP bildirimi gönderir → uygulama bunu pushRegistry:didReceiveIncomingPushWithPayload içinde alır → uygulama CXProvider aracılığıyla gelen aramayı hemen görüntüler → CallKit sistem arama ekranını gösterir. Her şey saniyenin kesirleri içinde gerçekleşir ve kullanıcı aramayı sunucuya geldiği anda görür.

iOS 13'ten itibaren Apple bir kısıtlama getirdi: VoIP bildirimleri yalnızca gelen aramaları belirtmek için kullanılmalıdır. PushKit'in arka plan veri yükleme veya içerik güncelleme için kullanılması yasaktır — bu tür uygulamalar inceleme sırasında reddedilebilir. Bu değişiklik, VoIP ekosistemini daha öngörülebilir hale getirdi çünkü tüm PushKit bildirimlerinin artık aramalarla ilgili olduğu garanti edilmektedir.

Gelen PushKit Bildiriminin İşlenmesi Örneği

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: Numaraları Engelleme ve Tanımlama

Call Directory Extension, uygulamanın sisteme tanımlama (arayanın adını gösterme) ve engelleme için numara listeleri sağlamasına olanak tanıyan bir uygulama uzantısıdır. Uzantı, ana uygulamadan bağımsız olarak çalışır: sistem etkinleştirme sırasında uzantıdan veri yükler ve sonraki tüm işlemler uygulama katılımı olmadan gerçekleştirilir, bu da kaynak tasarrufu sağlar ve güvenliği artırır.

Uzantı, verileri yönetmek için CXCallDirectoryManager kullanır. Uygulama ana süreç aracılığıyla uzantının veritabanına numaralar ekler ve ardından sistem önbelleğini güncellemek için reloadExtension'ı çağırır. Apple, sistemde gereksiz yükü önlemek için verilerin saatte bir defadan fazla güncellenmemesini önerir.

Call Directory Extension Uygulama Örneği

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 YöntemiAmaç
reloadExtensionSistem önbelleğinin zorunlu güncellenmesi
getEnabledStatusUzantının kullanıcı tarafından etkinleştirilip etkinleştirilmediğini kontrol etme
openSettingsUzantı ayarları ekranına gitme

Swift'te CallKit Entegrasyonu Örneği

Tam CallKit entegrasyonu üç bileşenin kurulumunu gerektirir: sağlayıcı yapılandırması, PushKit aracılığıyla gelen aramaların işlenmesi ve ses oturumu yönetimi. Aşağıda, gelen bir VoIP aramasını işleyen, CallKit aracılığıyla görüntüleyen ve sesi etkinleştiren minimum çalışan bir örnek verilmiştir.

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

Farklı Platformlarda CallKit Sınırlamaları ve Özellikleri

CallKit iOS, macOS ve iPadOS'ta mevcuttur, ancak framework'ün davranışı platformlar arasında farklılık gösterir. iOS'ta CallKit tam olarak çalışır: sistem arama ekranı, kilit ekranı, CarPlay entegrasyonu. iPadOS'ta arama, tam ekran arayüz yerine sistem banner'ı olarak görüntülenir. macOS'ta CallKit, macOS 10.14 Mojave'den itibaren kullanılabilir, ancak yalnızca Catalyst ile oluşturulmuş veya doğrudan AppKit kullanan Mac uygulamaları için.

Temel sınırlama — CallKit watchOS'ta desteklenmez. Apple Watch geliştiricileri, saatte sistem arayüzü aracılığıyla VoIP aramalarını görüntüleyemez. Bunun yerine, watchOS uygulaması WCSession aracılığıyla bir arama bildirimi alır ve kendi arama ekranını uygulamalıdır. Ayrıca, CallKit simülatörde çalışmaz — VoIP özelliklerinin test edilmesi yalnızca fiziksel bir cihazda mümkündür.

iOS, iPadOS ve macOS'ta CallKit Karşılaştırması

ÖzellikiOSiPadOSmacOS
Sistem Arama EkranıTam ekranBannerBanner
Kilit EkranıEvetHayırHayır
CarPlayEvetHayırHayır
Arama RehberiEvetEvetHayır
Son Aramalar GeçmişiEvetEvetEvet

Sıkça Sorulan Sorular

CallKit ile PushKit kullanmak zorunlu mudur?

Evet, gelen aramalar için PushKit zorunludur. Yalnızca PushKit, uyuyan veya kapalı bir uygulamaya VoIP bildirimlerinin anında iletilmesini garanti eder ve bu, CallKit aracılığıyla zamanında arama görüntüleme için kritiktir.

CallKit görüntülü aramalar için kullanılabilir mi?

Evet, CallKit ses ve videoyu destekler. CXProvider'ı yapılandırırken supportsVideo = true olarak ayarlayın ve CXStartCallAction'da isVideo = true olarak ayarlayın. Sistem, arama arayüzünde video kamera simgesini doğru şekilde görüntüleyecektir.

Fiziksel cihaz olmadan CallKit nasıl test edilir?

Hiçbir şekilde — CallKit simülatörde çalışmaz. Test için fiziksel bir iOS veya iPadOS cihazı kullanın. macOS'ta, mikrofonlu gerçek bir Mac'te test edebilirsiniz.

İki uygulama aynı anda CallKit kullanabilir mi?

Evet, her uygulama kendi CXProvider'ını kaydeder. Sistem, farklı uygulamalardan gelen aramaları doğru şekilde işler ve bunları Son Aramalar'da ayrı aramalar olarak görüntüler. Kullanıcı, aramanın hangi uygulamadan geldiğini görebilir.

Bir aramaya yanıt verdikten sonra AVAudioSession etkinleştirilmezse ne olur?

Uygulama sınırlı bir süre içinde ses oturumunu etkinleştirmezse, CallKit otomatik olarak aramayı sonlandırır. Zamanlayıcı, gerçek bir ses akışı olmadan sistemin arama durumunda kalmaması için tetiklenir.

Özet

  • CallKit — iOS 10'dan beri kullanılabilen, iOS, iPadOS ve macOS'ta sistem Telefon uygulamasına VoIP aramalarını entegre etmek için bir Apple framework'ü.
  • CXProvider ve CXCallController — CallKit mimarisinin ana sınıfları, arama yönetimi için sağlayıcı-istemci modelini uygular.
  • PushKit — kalıcı TCP bağlantısı üzerinden çalışan, gelen VoIP bildirimlerinin anında iletilmesi için CallKit'in temel yardımcısı.
  • Call Directory Extension, sistem düzeyinde numaraları engellemeye ve tanımlamaya olanak tanır, bu da spam önleme uygulamaları için kullanışlıdır.
  • CallKit watchOS'ta desteklenmez ve simülatörde çalışmaz — VoIP özelliklerinin test edilmesi fiziksel bir cihaz gerektirir.
  • CallKit'in davranışı platforma göre farklılık gösterir: iOS'ta — tam ekran arayüz, iPadOS ve macOS'ta — sistem banner'ı.
  • Bir aramaya yanıt verdikten sonra AVAudioSession'ı etkinleştirmek zorunludur — aksi takdirde CallKit zaman aşımına uğrayarak aramayı sonlandırır.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun