PushKit adalah framework Apple untuk pengiriman notifikasi push dengan jaminan pengiriman instan, terutama ditujukan untuk aplikasi VoIP. Berbeda dengan APNs standar (Apple Push Notification service) yang dapat tertunda atau dikelompokkan, PushKit menggunakan koneksi TCP tetap antara perangkat dan server Apple. Menurut Apple Developer Documentation, 2026, PushKit memastikan latensi pengiriman kurang dari 500 milidetik, yang sangat penting untuk aplikasi real-time — panggilan suara dan video.
Poin Utama
PushKit adalah framework Apple, diperkenalkan di iOS 8, yang menyediakan mekanisme pengiriman notifikasi push dengan prioritas terjamin melalui koneksi tetap dengan server APNs. Berbeda dengan notifikasi biasa yang melalui satu kanal APNs dan dapat tertunda, notifikasi PushKit menggunakan aliran khusus dengan prioritas lebih tinggi, memastikan pengiriman hampir secara real-time.
Secara teknis, PushKit bekerja melalui koneksi TCP tetap antara perangkat dan server push Apple. Ketika server mengirim notifikasi VoIP, koneksi langsung meneruskannya ke perangkat, yang membangunkan aplikasi dan memanggil delegasi PKPushRegistry. Aplikasi tidak perlu dalam keadaan aktif — PushKit dapat membangunkannya dari latar belakang, keadaan dihentikan, atau bahkan setelah perangkat di-restart.
Menurut penelitian Microsoft Research (2024) tentang latensi notifikasi push pada platform seluler, latensi median notifikasi PushKit adalah 120–350 ms, sedangkan notifikasi APNs standar menunjukkan median 1–5 detik. Perbedaan orde magnitudo ini dijelaskan oleh kanal TCP khusus dan pemrosesan prioritas di sisi Apple.
PushKit mendukung empat tipe: VoIP (untuk panggilan), Complication (untuk data di wajah jam watchOS), FileProvider (untuk sinkronisasi file) dan PushToTalk (untuk fungsi walkie-talkie). Mulai iOS 13, hanya tipe VoIP yang tetap tersedia secara luas untuk pengembang pihak ketiga. Complication dan FileProvider memiliki aplikasi khusus yang sempit dan terbatas pada ekosistem Apple sendiri.
| Tipe PushKit | Tujuan | Ketersediaan |
|---|---|---|
| VoIP | Indikasi panggilan suara dan video masuk | iOS 8+, App Store |
| Complication | Pembaruan data di wajah jam Apple Watch | watchOS 6+ |
| FileProvider | Sinyal tentang file baru di File Provider Extension | iOS 11+, terbatas |
| PushToTalk | Fungsi walkie-talkie di aplikasi perusahaan | iOS 16+, akses terbatas |
APNs (Apple Push Notification service) — layanan pengiriman notifikasi push universal yang bekerja melalui satu kanal untuk semua aplikasi. Apple dapat mem-buffer, mengelompokkan, atau bahkan membuang notifikasi APNs saat kelebihan beban kanal. PushKit, sebaliknya, menggunakan koneksi khusus untuk setiap tipe notifikasi, dan Apple menjamin pengiriman setiap VoIP-push tanpa buffering.
Perbedaan terlihat dalam skenario yang kritis terhadap waktu: panggilan masuk yang dikirim melalui APNs dapat datang dengan latensi 10–30 detik atau tidak datang sama sekali jika perangkat dalam mode hemat daya. PushKit mengirimkan notifikasi yang sama dalam 100–500 ms terlepas dari status perangkat, karena kanal TCP-nya dijaga tetap aktif oleh sistem secara prioritas.
| Parameter | PushKit | APNs |
|---|---|---|
| Tipe koneksi | TCP tetap (kanal khusus) | Kanal bersama dengan buffering |
| Latensi median | 120–350 ms | 1–5 detik |
| Membangunkan aplikasi | Selalu, dari status apa pun | Hanya jika aplikasi tidak dimatikan |
| Ukuran payload | Hingga 5 KB | Hingga 4 KB |
| Pengelompokan iOS | Tidak | Ya |
Arsitektur PushKit dibangun di sekitar PKPushRegistry — objek yang mendaftarkan aplikasi untuk menerima notifikasi tipe tertentu. Aplikasi membuat instance PKPushRegistry, menentukan tipe yang diinginkan (misalnya, PKPushTypeVoIP) dan menetapkan delegasi. Setelah pendaftaran, sistem secara otomatis menjaga koneksi dengan APNs dan mengirimkan notifikasi push melalui delegasi.
Setiap notifikasi diwakili oleh objek PKPushPayload, yang berisi kamus dictionaryPayload dengan data dari server. Ukuran payload dibatasi hingga 5 KB, cukup untuk mentransfer metadata panggilan: identifier pemanggil, tipe panggilan (audio/video), nama kontak, dan token sesi. Aliran media dikirim secara terpisah melalui WebRTC atau protokol real-time lainnya.
import PushKit
class PushKitManager: NSObject {
private let pushRegistry = PKPushRegistry(queue: .main)
func configure() {
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
}
}
PushKit memanggil metode delegasi saat menerima notifikasi. Pada saat ini, aplikasi harus mengekstrak data dari dictionaryPayload dan segera menampilkan panggilan melalui CallKit, jika tidak, sistem dapat mengakhiri tugas latar belakang. Apple merekomendasikan menyelesaikan pemrosesan dalam 30 detik, tetapi untuk panggilan VoIP sangat penting untuk menampilkan layar panggilan sebelum detik pertama berlalu.
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
)
}
}
Dengan dirilisnya iOS 13, Apple memberlakukan batasan ketat pada penggunaan PushKit. Pengembang secara massal menggunakan VoIP-push sebagai mekanisme tersembunyi untuk pembaruan aplikasi di latar belakang — pembangunan melalui PushKit memungkinkan memuat konten, menyinkronkan data, dan memperbarui antarmuka tanpa izin eksplisit pengguna. Apple menganggap ini sebagai pelanggaran konsep hemat energi dan membatasi PushKit hanya untuk indikasi panggilan masuk.
Sekarang setiap notifikasi PushKit harus segera mengarah pada menampilkan panggilan masuk melalui CallKit. Jika sistem mendeteksi bahwa PushKit digunakan untuk tujuan lain — misalnya, untuk sinkronisasi latar belakang atau pembaruan konten tanpa menampilkan panggilan — aplikasi dapat ditolak saat moderasi atau diputuskan dari layanan PushKit. Apple juga menghapus kemampuan menggunakan PushKit untuk pembaruan data latar belakang mulai iOS 13.
Integrasi PushKit lengkap mencakup pendaftaran, mendapatkan token push, dan memproses notifikasi masuk. PushKit secara independen meminta izin untuk mengirim notifikasi — panggilan tambahan UNUserNotificationCenter tidak diperlukan untuk PushKit itu sendiri, tetapi mungkin diperlukan untuk notifikasi lokal aplikasi. Setelah pendaftaran, sistem memanggil metode pushRegistry:didUpdatePushCredentials untuk mentransfer token push, yang harus dikirim ke server.
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)")
}
}
Sisi server mengirim notifikasi PushKit melalui APNs dengan push-type = voip dan header apns-push-type: voip. Berbeda dengan APNs biasa, VoIP-push menggunakan sertifikat sendiri dan tidak memerlukan konfigurasi topic. Payload harus berisi data minimal untuk identifikasi panggilan.
// Contoh payload push VoIP
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
Debugging PushKit lebih sulit daripada APNs standar, karena PushKit tidak bekerja di simulator iOS. Untuk diagnostik diperlukan iPhone atau iPad fisik. Tanda pertama dari kerja yang benar adalah pemanggilan pushRegistry:didUpdatePushCredentials saat startup dan munculnya token push dengan format tertentu (64 karakter hex untuk VoIP). Jika delegasi tidak dipanggil, periksa entitlements aplikasi Anda.
Masalah umum lainnya adalah PushKit tidak mengirimkan notifikasi setelah pembaruan aplikasi. Ini terjadi jika token push berubah, tetapi server terus menggunakan yang lama. Solusinya adalah mengirim token baru ke server saat startup aplikasi dan menghapus token yang tidak valid saat pemanggilan pushRegistry:didInvalidatePushTokenForType. Apple juga merekomendasikan mengimplementasikan mekanisme fallback melalui APNs biasa.
| Masalah | Penyebab | Solusi |
|---|---|---|
| didUpdatePushCredentials tidak dipanggil | Tidak ada entitlements atau tipe salah | Periksa Capabilities → Push Notifications + VoIP di Xcode |
| Push datang dengan latensi | Perangkat dalam mode Low Power Mode atau sinyal lemah | PushKit tidak dapat menghindari batasan perangkat keras |
| Notifikasi tidak datang setelah restart | Perubahan token push setelah instalasi ulang aplikasi | Minta token baru dan perbarui di server |
| App Store ditolak karena PushKit | PushKit tidak digunakan untuk panggilan | Pastikan setiap push mengarah ke reportNewIncomingCall |
Pertanyaan yang Sering Diajukan
Secara teknis ya, tetapi tidak berguna. Mulai iOS 13, satu-satunya aplikasi PushKit yang diizinkan adalah indikasi panggilan masuk, yang memerlukan CallKit untuk ditampilkan. Penggunaan PushKit tanpa CallKit akan menyebabkan penolakan aplikasi di App Store.
Ukuran maksimum payload untuk PushKit adalah 5 KB (5120 byte). Ini 1 KB lebih besar dari notifikasi APNs biasa, memungkinkan pengiriman lebih banyak metadata tentang panggilan.
Apple secara otomatis membatalkan token push saat aplikasi dihapus. Server akan menerima pemberitahuan pembatalan dan harus berhenti mengirim push ke token ini. Upaya mengirim push ke token yang tidak valid akan menyebabkan kesalahan APNs 410.
PushKit tersedia di macOS 10.14+ untuk aplikasi Mac yang dibuat dengan Mac Catalyst atau AppKit. Fungsionalitasnya sepenuhnya analog dengan versi iOS, termasuk dukungan untuk notifikasi VoIP.
Gunakan analitik Anda sendiri: lacak waktu antara pengiriman push dari server dan pemanggilan didReceiveIncomingPushWithPayload di klien. Waktu rata-rata di bawah 500 ms menunjukkan kerja PushKit yang benar.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga