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 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 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.
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, 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.
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, 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.
let controller = CXCallController()
let startCallAction = CXStartCallAction(
callUUID: UUID(),
handle: CXHandle(type: .phoneNumber, value: "+15551234567")
)
startCallAction.isVideo = true
controller.request(CXTransaction(action: startCallAction))
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.
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.
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, 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.
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öntemi | Amaç |
|---|---|
| reloadExtension | Sistem önbelleğinin zorunlu güncellenmesi |
| getEnabledStatus | Uzantının kullanıcı tarafından etkinleştirilip etkinleştirilmediğini kontrol etme |
| openSettings | Uzantı ayarları ekranına gitme |
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.
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 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.
| Özellik | iOS | iPadOS | macOS |
|---|---|---|---|
| Sistem Arama Ekranı | Tam ekran | Banner | Banner |
| Kilit Ekranı | Evet | Hayır | Hayır |
| CarPlay | Evet | Hayır | Hayır |
| Arama Rehberi | Evet | Evet | Hayır |
| Son Aramalar Geçmişi | Evet | Evet | Evet |
Sıkça Sorulan Sorular
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.
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.
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.
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.
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
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.
Ayrıca okuyun