PushKit, garantili anında teslimat ile push bildirimleri göndermek için bir Apple çerçevesidir ve öncelikli olarak VoIP uygulamaları için tasarlanmıştır. Gecikebilen veya gruplanabilen standart APNs’nin (Apple Push Notification service) aksine PushKit, cihaz ile Apple sunucuları arasında kalıcı bir TCP bağlantısı kullanır. Apple Developer Documentation, 2026’ya göre PushKit, gerçek zamanlı uygulamalar — sesli ve görüntülü aramalar — için kritik olan 500 milisaniyeden daha az uçtan uca teslimat gecikmesi sağlar.
Önemli Noktalar
PushKit, iOS 8’de tanıtılan bir Apple çerçevesidir ve APNs sunucularına kalıcı bir bağlantı yoluyla garantili öncelikli push bildirimi teslimat mekanizması sağlar. Tek bir APNs kanalından geçen ve gecikebilen normal bildirimlerin aksine, PushKit bildirimleri daha yüksek öncelikli özel bir akış kullanarak neredeyse gerçek zamanlı teslimat sağlar.
Teknik olarak PushKit, cihaz ile Apple’ın push sunucuları arasında kalıcı bir TCP bağlantısı yoluyla çalışır. Bir sunucu VoIP bildirimi gönderdiğinde, bağlantı bunu anında cihaza iletir, cihaz uygulamayı uyandırır ve PKPushRegistry temsilcisini çağırır. Uygulamanın aktif durumda olması gerekmez — PushKit onu arka plandan, sonlandırılmış durumdan veya cihaz yeniden başlatıldıktan sonra bile uyandırabilir.
Microsoft Research (2024) tarafından mobil platformlarda push bildirimi gecikmesi üzerine yapılan araştırmaya göre, PushKit bildirimlerinin ortanca gecikmesi 120–350 ms iken, standart APNs bildirimlerinin ortancası 1–5 saniyedir. Bu büyüklük sırasındaki fark, özel TCP kanalı ve Apple tarafındaki öncelikli işlemeyle açıklanmaktadır.
PushKit dört tür destekler: VoIP (aramalar için), Complication (saat yüzü verileri için), FileProvider (dosya senkronizasyonu için) ve PushToTalk (telsiz işlevleri için). iOS 13’ten itibaren yalnızca VoIP türü üçüncü taraf geliştiriciler için yaygın olarak kullanılabilir durumdadır. Complication ve FileProvider’ın niş uygulamaları vardır ve Apple’ın kendi ekosistemleriyle sınırlıdır.
| PushKit Türü | Amaç | Kullanılabilirlik |
|---|---|---|
| VoIP | Gelen sesli ve görüntülü arama göstergesi | iOS 8+, App Store |
| Complication | Apple Watch yüzlerinde veri güncelleme | watchOS 6+ |
| FileProvider | File Provider Extension’da yeni dosyalar hakkında sinyal | iOS 11+, sınırlı |
| PushToTalk | Kurumsal uygulamalarda telsiz işlevi | iOS 16+, sınırlı erişim |
APNs (Apple Push Notification service), tüm uygulamalar için tek bir kanal üzerinden çalışan evrensel bir push bildirimi teslimat hizmetidir. Kanal tıkalı olduğunda Apple, APNs bildirimlerini arabelleğe alabilir, gruplayabilir veya hatta atabilir. Öte yandan PushKit, her bildirim türü için özel bir bağlantı kullanır ve Apple, her VoIP push’un arabelleğe alınmadan teslim edilmesini garanti eder.
Fark, zamana duyarlı senaryolarda belirginleşir: APNs aracılığıyla gönderilen bir gelen arama, 10–30 saniye gecikmeyle gelebilir veya cihaz güç tasarrufu modundaysa hiç gelmeyebilir. PushKit, TCP kanalı sistem tarafından öncelikli olarak aktif tutulduğu için cihaz durumundan bağımsız olarak aynı bildirimi 100–500 ms içinde gönderir.
| Parametre | PushKit | APNs |
|---|---|---|
| Bağlantı Türü | Kalıcı TCP (özel kanal) | Ara belleğe sahip paylaşımlı kanal |
| Ortanca Gecikme | 120–350 ms | 1–5 saniye |
| Uygulama Uyandırma | Her zaman, her durumdan | Yalnızca uygulama kapatılmamışsa |
| Payload Boyutu | 5 KB’a kadar | 4 KB’a kadar |
| iOS Gruplama | Hayır | Evet |
PushKit mimarisi PKPushRegistry etrafında inşa edilmiştir — bu nesne, uygulamayı belirli bir türde bildirim almak üzere kaydeder. Uygulama bir PKPushRegistry örneği oluşturur, istenen türü (örneğin PKPushTypeVoIP) belirtir ve bir temsilci atar. Kayıttan sonra sistem, APNs ile bağlantıyı otomatik olarak sürdürür ve push bildirimlerini temsilci aracılığıyla iletir.
Her bildirim, sunucu verilerini içeren bir dictionaryPayload’e sahip bir PKPushPayload nesnesiyle temsil edilir. Payload boyutu 5 KB ile sınırlıdır, bu da arama meta verilerini (çağıran tanımlayıcısı, arama türü (ses/görüntü), kişi adı ve oturum anahtarı) iletmek için yeterlidir. Medya akışının kendisi WebRTC veya başka bir gerçek zamanlı protokol aracılığıyla ayrı olarak iletilir.
import PushKit
class PushKitManager: NSObject {
private let pushRegistry = PKPushRegistry(queue: .main)
func configure() {
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
}
}
PushKit, bir bildirim aldığında temsilci yöntemini çağırır. Bu noktada uygulama, dictionaryPayload’den verileri çıkarmalı ve aramayı hemen CallKit aracılığıyla görüntülemelidir, aksi takdirde sistem arka plan görevini sonlandırabilir. Apple, işlemeyi 30 saniye içinde tamamlamayı önerir, ancak VoIP aramaları için ilk saniye içinde arama ekranını göstermek kritiktir.
extension PushKitManager: PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType
) {
guard let caller =
payload.dictionaryPayload["caller"] as? String
else { return }
CallKitManager.shared.reportIncomingCall(
uuid: UUID(),
handle: caller
)
}
}
iOS 13’ün piyasaya sürülmesiyle Apple, PushKit kullanımına katı kısıtlamalar getirdi. Geliştiriciler, VoIP push’u arka plan uygulama güncellemeleri için gizli bir mekanizma olarak yaygın şekilde kullanıyorlardı — PushKit aracılığıyla uyandırma, kullanıcının açık izni olmadan içerik yüklemeye, verileri senkronize etmeye ve arayüzü güncellemeye izin veriyordu. Apple bunu enerji tasarrufu kavramının ihlali olarak değerlendirdi ve PushKit’i yalnızca gelen arama göstergesiyle sınırlandırdı.
Artık her PushKit bildirimi, CallKit aracılığıyla hemen bir gelen arama görüntülemesine yol açmalıdır. Sistem, PushKit’in başka amaçlar için kullanıldığını tespit ederse — örneğin, arama göstermeden arka plan senkronizasyonu veya içerik güncellemeleri — uygulama inceleme sırasında reddedilebilir veya PushKit hizmetinden devre dışı bırakılabilir. Apple ayrıca iOS 13’ten itibaren arka plan veri güncellemeleri için PushKit kullanma yeteneğini de kaldırdı.
Tam PushKit entegrasyonu, kayıt, push anahtarı alma ve gelen bildirimleri işlemeyi içerir. PushKit otomatik olarak bildirim gönderme izni ister — PushKit’in kendisi için ek bir UNUserNotificationCenter çağrısı gerekmez, ancak uygulamanın yerel bildirimleri için gerekebilir. Kayıttan sonra sistem, sunucuya gönderilmesi gereken push anahtarını iletmek için pushRegistry:didUpdatePushCredentials’ı çağırır.
extension PushKitManager: PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didUpdate pushCredentials: PKPushCredentials,
for type: PKPushType
) {
let token = pushCredentials.token
.map { String(format: "%02x", $0) }
.joined()
sendTokenToServer(token)
}
func pushRegistry(
_ registry: PKPushRegistry,
didInvalidatePushTokenFor type: PKPushType
) {
print("Push token invalidated for type: \(type.rawValue)")
}
}
Sunucu tarafı, APNs aracılığıyla push-type = voip ve apns-push-type: voip başlığıyla bir PushKit bildirimi gönderir. Normal APNs’nin aksine, VoIP push kendi sertifikasını kullanır ve topic yapılandırması gerektirmez. Payload, arama tanımlaması için minimum veri içermelidir.
// VoIP push payload örneği
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
PushKit’te hata ayıklama, standart APNs’den daha karmaşıktır çünkü PushKit iOS simülatöründe çalışmaz. Tanı için fiziksel bir iPhone veya iPad gereklidir. Doğru çalışmanın ilk işareti, başlatmada pushRegistry:didUpdatePushCredentials çağrısı ve belirli bir biçimde (VoIP için 64 onaltılık karakter) bir push anahtarının görünmesidir. Temsilci çağrılmazsa, uygulamanın yetkilendirmelerini kontrol edin.
Bir diğer yaygın sorun, uygulama güncellemesinden sonra PushKit’in bildirim göndermemesidir. Bu, push anahtarı değiştiğinde ancak sunucu eskisini kullanmaya devam ettiğinde olur. Çözüm, uygulama başlatıldığında sunucuya yeni anahtarı göndermek ve pushRegistry:didInvalidatePushTokenForType çağrıldığında geçersiz anahtarları kaldırmaktır. Apple ayrıca normal APNs aracılığıyla bir yedek mekanizma uygulanmasını önerir.
| Sorun | Neden | Çözüm |
|---|---|---|
| didUpdatePushCredentials çağrılmıyor | Eksik yetkilendirmeler veya yanlış tür | Xcode’da Capabilities → Push Notifications + VoIP’yi kontrol edin |
| Push gecikmeli geliyor | Cihaz düşük güç modunda veya zayıf sinyal | PushKit donanım sınırlamalarını aşamaz |
| Yeniden başlatmadan sonra bildirim gelmiyor | Uygulama yeniden yüklendikten sonra push anahtarı değişti | Yeni anahtar isteyin ve sunucuda güncelleyin |
| PushKit nedeniyle App Store reddi | PushKit arama dışı amaçlarla kullanıldı | Her push’un reportNewIncomingCall ile sonuçlandığından emin olun |
Sıkça Sorulan Sorular
Teknik olarak evet, ancak anlamsız olurdu. iOS 13’ten itibaren PushKit’in izin verilen tek kullanımı, görüntüleme için CallKit gerektiren gelen arama göstergesidir. PushKit’i CallKit olmadan kullanmak, uygulamanın App Store’da reddedilmesine yol açar.
PushKit için maksimum payload boyutu 5 KB’dır (5120 bayt). Bu, normal APNs bildirimlerinden 1 KB daha fazladır ve daha fazla arama meta verisi iletilmesine olanak tanır.
Uygulama silindiğinde Apple otomatik olarak push anahtarını geçersiz kılar. Sunucu bir geçersiz kılma bildirimi alır ve bu anahtara push göndermeyi durdurmalıdır. Geçersiz bir anahtara push gönderme girişimi APNs hatası 410 ile sonuçlanır.
PushKit, Mac Catalyst veya AppKit kullanılarak oluşturulmuş Mac uygulamaları için macOS 10.14+ üzerinde kullanılabilir. İşlevsellik, VoIP bildirimi desteği dahil olmak üzere iOS sürümüyle tamamen aynıdır.
Kendi analitiğinizi kullanın: sunucudan push gönderme ile istemcide didReceiveIncomingPushWithPayload çağrısı arasındaki süreyi izleyin. 500 ms’den az ortalama süre, PushKit’in doğru çalıştığını gösterir.
Ö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