PushKit, standart APNs'yi atlayarak düşük gecikmeli VoIP bildirimleri sağlayan bir iOS framework'üdür. Apple Developer Documentation (2025)'a göre PushKit, arka planda bile 5 saniye içinde çağrı teslimatını garanti eder. VoIP bildirimleri, kullanıcıya banner göstermeye gerek kalmadan doğrudan işlenir ve bu framework'u iOS'ta mesajlaşma ve görüntülü görüşme uygulamaları için birincil araç haline getirir.
Temel Noktalar
PushKit, iOS 8'de tanıtılan Apple framework'üdür ve VoIP uygulamaları için düşük gecikmeli push bildirimleri sağlar. Standart APNs'den (Apple Push Notification service) farklı olarak PushKit, gelen bir çağrı alındığında uygulamanın arka planda uyanmasına izin verir ve kullanıcıya bildirim göstermez. Bu, sesli ve görüntülü görüşme uygulamaları için kritiktir — kullanıcı, uygulama kapalı olsa bile çağrıyı anında alır. Apple WWDC 2024'e göre PushKit, dünya genelinde her gün 2 milyardan fazla VoIP bildirimi işler.
Mekanizma, cihaz ile Apple push sunucusu arasında standart bildirim kanalını atlayan doğrudan bağlantı üzerine kuruludur. Uygulama sunucusu bir VoIP bildirimi gönderdiğinde, özel bir PushKit sunucusundan geçer ve maksimum öncelikle cihaza teslim edilir. Sistem, uygulamayı arka planda uyandırır ve pushRegistry:didReceiveIncomingPushWithPayload:forType: delegate yöntemini çağırır. Uygulama yükü (payload) alır, çağrıyı işler ve onay için completion handler'ı çağırır. Apple spesifikasyonuna göre gönderme ve işleme arasındaki tüm döngü 5 saniyeden fazla sürmez.
PushKit ve APNs arasındaki temel fark, teslimat mekanizması ve işleme yöntemindedir. APNs, banner, ses veya rozet göstererek standart bildirim kanalını kullanırken, PushKit verileri görsel bildirim olmadan doğrudan uygulamaya teslim eder. Aşağıda temel özelliklerin karşılaştırma tablosu bulunmaktadır.
| Özellik | PushKit | APNs |
|---|---|---|
| Teslimat Önceliği | Yüksek (anında teslimat) | Orta (gecikme olası) |
| Uygulama Uyandırma | Evet, arka planda | Yalnızca bildirime dokunulduğunda |
| Banner Gösterme | Hayır | Evet (isteğe bağlı) |
| Kullanım | VoIP, çağrılar, görüntülü görüşme | Tüm bildirim türleri |
| Yük (Payload) | Yalnızca JSON, medya yok | JSON + ekler |
PushKit ayrıca zengin medya eklerini desteklemez ve normal pazarlama bildirimleri için kullanılamaz. Apple, PushKit kullanımını sıkı bir şekilde kontrol eder — uygulamanın açık VoIP işlevselliğine sahip olması gerekir, aksi takdirde inceleme sırasında reddedilir. APNs, diğer tüm senaryolar için evrensel çözüm olmaya devam etmektedir.
PushKit'i kullanmak için uygulamanın PKPushRegistry aracılığıyla pushType .voIP ile kaydolması gerekir. Kayıt, ilk başlatmada bir kez yapılır ve ardından sistem benzersiz bir push tokeni oluşturur ve bunu delegate aracılığıyla iletir. Bu token, daha sonra VoIP bildirimleri göndermek için uygulama sunucusuna gönderilir. Aşağıda Swift'te PushKit kaydı ve token alma örneği verilmiştir.
import PushKit
let registry = PKPushRegistry(queue: DispatchQueue.main)
registry.delegate = self
registry.desiredPushTypes = [.voIP]
// MARK: - PKPushRegistryDelegate
func pushRegistry(
_ registry: PKPushRegistry,
didUpdate pushCredentials: PKPushCredentials,
for type: PKPushType
) {
let deviceToken = pushCredentials.token
.map { String.format("%02x", $0) }
.joined()
sendVoIPTokenToServer(deviceToken)
}
PKPushType.voIP ile desiredPushTypes çağrıldıktan sonra sistem, otomatik olarak VoIP bildirimleri alma izni ister. pushRegistry:didUpdatePushCredentials:forType: yönteminde uygulama, cihaz tokenini Data olarak alır ve bu, onaltılık bir dizeye dönüştürülerek sunucuya gönderilir. Token her cihaz için benzersizdir ve uygulama yeniden yüklendiğinde değişir — sunucu token güncellemelerini işlemelidir.
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping VoidBlock
) {
guard let caller = payload.dictionaryPayload["caller"] as? String else {
completion()
return
}
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: caller)
provider.reportNewIncomingCall(
with: UUID(),
update: update,
completion: { error in
if let error = error {
print("Call error: \(error)")
}
completion()
}
)
}
didReceiveIncomingPushWith yönteminde uygulama, çağrı verileriyle birlikte yükü alır. Arayan bilgisi çıkarıldıktan sonra, gelen çağrı ekranını görüntülemek için CallKit framework'ünden bir CXCallUpdate oluşturulur. İşlemden sonra completion handler'ı çağırmak önemlidir — aksi takdirde sistem, zaman aşımı nedeniyle uygulama sürecini zorla sonlandırabilir. Maksimum işlem süresi 30 saniyedir ve bundan sonra iOS bildirimi işlenmemiş olarak kabul eder.
PushKit, CallKit ile sıkı bir şekilde entegre edilmiştir — iOS'ta sistem çağrı arayüzünü görüntülemek için bir framework. Uygulama, PushKit aracılığıyla bir VoIP bildirimi aldığında, çağrıyı yönetmek için bir CXProvider ve CXCallController oluşturmalıdır. CallKit, uygulama küçültülmüş olsa bile kilit ekranında gelen çağrı ekranını otomatik olarak gösterir. Aşağıda bir CallKit sağlayıcısı kurulum örneği verilmiştir.
let config = CXProviderConfiguration(localizedName: "MyApp")
config.supportsVideo = true
config.maximumCallGroups = 1
config.maximumCallsPerCallGroup = 1
config.supportedHandleTypes = [.phoneNumber, .generic]
let provider = CXProvider(configuration: config)
provider.setDelegate(self, queue: nil)
CXProviderConfiguration, çağrı ekranının görünümünü ve davranışını tanımlar — uygulama adı, video desteği, eşzamanlı çağrı sayısı. VoIP uygulamaları için PushKit'in CallKit ile entegrasyonu zorunludur: bu olmadan sistem gelen çağrı ekranını göstermez ve kullanıcı çağrıyı kaçırır. Apple, PushKit kullanan tüm uygulamalar için CallKit kullanımını zorunlu kılar.
PushKit kullanımı, Apple tarafından belirlenen bir dizi sıkı kısıtlama ile birlikte gelir. Framework yalnızca VoIP işlevselliği için kullanılabilir — PushKit aracılığıyla pazarlama bildirimleri gönderme girişimleri uygulamanın engellenmesine yol açar. Yük boyutu 4 KB'yi aşmamalıdır ve yalnızca ekleri olmayan JSON verileri içerebilir. iOS 13'ten itibaren Apple, VoIP bildirimleri gönderme sıklığına bir sınırlama getirmiştir — cihaz başına dakikada en fazla bir bildirim. Sunucu bu sınırlamaya uymalıdır, aksi takdirde bildirimler sistem tarafından reddedilir. PushKit ayrıca iOS simülatöründe çalışmaz — test yalnızca fiziksel bir cihazda mümkündür.
Bir VoIP bildirimi yükü, özel çağrı verileriyle birlikte bir JSON sözlüğüdür. APNs'den farklı olarak PushKit, standart alert, badge ve sound alanlarını desteklemez — tüm veriler geliştirici tarafından tanımlanır. Tipik bir yapı, arayan tanımlayıcısını (caller), çağrı türünü (voice veya video), oda veya oturum tanımlayıcısını ve bir zaman damgasını içerir. 4 KB sınırı içinde yerden tasarruf etmek için her alanın boyutu minimum düzeyde olmalıdır. Apple, yükte yalnızca kilit ekranında gelen çağrı ekranını görüntülemek için gerekli verilerin bulunmasını ve kalan bilgilerin (avatar, mesaj geçmişi) kullanıcı yanıtladıktan sonra ayrı bir ağ isteğiyle yüklenmesini önerir. Minimum yük örneği: { "caller": "Anna", "caller_id": "+79161234567", "type": "audio", "room": "uuid-room-1234", "ts": 1718534400 }. Yükteki tüm anahtarlar kısa, net ve uygulama sürümleri arasında uyumluluk için sunucu tarafında belgelenmiş olmalıdır.
PushKit ile çalışırken, teslimat hatalarını ve bağlantı kaybını yönetmek gerekir. Cihaz çevrimdışıysa veya ağdan bağlantısı kesilmişse, VoIP bildirimi teslim edilmez — PushKit, yeniden deneme için bildirimleri 24 saate kadar saklayan APNs'nin aksine, depolama ve yeniden göndermeyi desteklemez. Sunucu, teslim edilmeyen bildirimleri bağımsız olarak izlemeli ve bağlantı yeniden kurulduğunda yeniden denemelidir. Bunun için push kit feedback service mekanizması kullanılır — başarısızlık nedeniyle birlikte teslim edilmeyen bildirimlerin bir listesini döndürür. VoIP bildirimi teslimat başarısının sunucu analitiği aracılığıyla izlenmesi ve başarılı teslimat oranı %95'in altına düştüğünde geliştiriciye bildirilmesi önerilir. PushKit sistemi, yalnızca cihazın aktif bir internet bağlantısı olduğunda teslimatı garanti eder — bağlantı yoksa bildirim kalıcı olarak kaybolur ve bu, garantili teslimatla güvenilir bir VoIP çağrı sistemi tasarlarken dikkate alınması kritik öneme sahiptir.
Sıkça Sorulan Sorular
PushKit, banner göstermeden gelen çağrıda uygulamanın arka planda uyanmasını sağlayan, düşük gecikmeli VoIP bildirimleri için bir Apple framework'üdür. Mesajlaşma ve görüntülü görüşme uygulamalarında kullanılır.
PushKit daha yüksek teslimat önceliğine sahiptir ve kullanıcıya bildirim göstermeden uygulamayı arka planda uyandırır. APNs, bildirimleri banner ile teslim eder ve kullanıcı etkileşimi olmadan bir çağrıyı işlemek için uygulamayı uyandıramaz.
Evet, Apple sistem gelen çağrı ekranını görüntülemek için PushKit'in CallKit ile entegrasyonunu gerektirir. CallKit olmadan uygulama, kilit ekranında gelen çağrıyı gösteremez ve bu da VoIP işlevselliğini işe yaramaz hale getirir.
Token, .voIP türüyle PKPushRegistry oluşturulduktan ve pushRegistry:didUpdatePushCredentials:forType: delegate yöntemi uygulandıktan sonra alınır. Token Data olarak iletilir ve sunucuya göndermek için onaltılık bir dizeye dönüştürülmelidir.
PushKit için maksimum yük boyutu 4 KB'dir. Veriler JSON formatında olmalıdır. Medya ekleri desteklenmez. iOS 13'ten itibaren cihaz başına dakikada en fazla bir VoIP bildirimi sınırı vardır.
Ö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