PushKit este un framework Apple pentru livrarea notificărilor push cu livrare garantată instantanee, destinat în primul rând aplicațiilor VoIP. Spre deosebire de APNs standard (Apple Push Notification service), care pot întârzia sau fi grupate, PushKit utilizează o conexiune TCP permanentă între dispozitiv și serverele Apple. Conform Apple Developer Documentation, 2026, PushKit asigură o întârziere de livrare sub 500 de milisecunde, ceea ce este critic pentru aplicațiile în timp real — apelurile vocale și video.
Principalele
PushKit este un framework Apple, introdus în iOS 8, care oferă un mecanism de livrare a notificărilor push cu prioritate garantată printr-o conexiune permanentă cu serverele APNs. Spre deosebire de notificările obișnuite, care trec printr-un canal APNs unic și se pot întârzia, notificările PushKit utilizează un flux dedicat cu prioritate mai mare, asigurând livrarea practic în timp real.
Tehnic, PushKit funcționează printr-o conexiune TCP permanentă între dispozitiv și serverele de push Apple. Când serverul trimite o notificare VoIP, conexiunea o transmite instantaneu dispozitivului, care trezește aplicația și apelează delegatul PKPushRegistry. Aplicația nu trebuie să fie în stare activă — PushKit o poate trezi din fundal, din starea terminată sau chiar după repornirea dispozitivului.
Conform cercetării Microsoft Research (2024) privind întârzierile notificărilor push pe platformele mobile, întârzierea mediană a notificărilor PushKit este de 120–350 ms, în timp ce notificările APNs standard au o mediană de 1–5 secunde. Diferența de un ordin de mărime se explică tocmai prin canalul TCP dedicat și procesarea prioritară de partea Apple.
PushKit suportă patru tipuri: VoIP (pentru apeluri), Complication (pentru date pe fețele watchOS), FileProvider (pentru sincronizarea fișierelor) și PushToTalk (pentru funcția de stație). îcepând cu iOS 13, doar tipul VoIP rămâne larg disponibil pentru dezvoltatorii terți. Complication și FileProvider au aplicații specializate înguste și sunt limitate la ecosistemele proprii Apple.
| Tip PushKit | Destinație | Disponibilitate |
|---|---|---|
| VoIP | Indicarea apelurilor vocale și video primite | iOS 8+, App Store |
| Complication | Actualizarea datelor pe fețele Apple Watch | watchOS 6+ |
| FileProvider | Semnale despre fișiere noi în File Provider Extension | iOS 11+, limitat |
| PushToTalk | Funcție de stație în aplicații corporative | iOS 16+, acces limitat |
APNs (Apple Push Notification service) — un serviciu universal de livrare a notificărilor push, care funcționează printr-un canal unic pentru toate aplicațiile. Apple poate bufferiza, grupa sau chiar elimina notificările APNs la suprasolicitarea canalului. PushKit, în schimb, folosește o conexiune dedicată pentru fiecare tip de notificare, iar Apple garantează livrarea fiecărui VoIP-push fără bufferizare.
Diferența se manifestă în scenariile critice ca timp: un apel primit livrat prin APNs poate veni cu o întârziere de 10–30 de secunde sau poate să nu vină deloc dacă dispozitivul este în modul de economisire a energiei. PushKit livrează aceeași notificare în 100–500 ms, indiferent de starea dispozitivului, deoarece canalul său TCP este menținut activ de sistem în mod prioritar.
| Parametru | PushKit | APNs |
|---|---|---|
| Tip conexiune | TCP permanentă (canal dedicat) | Canal comun cu bufferizare |
| Întârziere mediană | 120–350 ms | 1–5 secunde |
| Trezie aplicația | Întotdeauna, din orice stare | Doar dacă aplicația nu este oprită |
| Dimensiune payload | Până la 5 KB | Până la 4 KB |
| Grupare iOS | Nu | Da |
Arhitectura PushKit este construită în jurul PKPushRegistry — un obiect care înregistrează aplicația pentru primirea notificărilor de un anumit tip. Aplicația creează o instanță PKPushRegistry, specifică tipul dorit (de exemplu, PKPushTypeVoIP) și atribuie un delegat. După înregistrare, sistemul menține automat conexiunea cu APNs și livrează notificările push prin delegat.
Fiecare notificare este reprezentată de un obiect PKPushPayload, care conține un dicționar dictionaryPayload cu date de la server. Dimensiunea payload este limitată la 5 KB, suficient pentru transmiterea metadatelor apelului: identificatorul apelantului, tipul apelului (audio/video), numele contactului și tokenul sesiunii. Fluxul media este transmis separat prin WebRTC sau un alt protocol în timp real.
import PushKit
class PushKitManager: NSObject {
private let pushRegistry = PKPushRegistry(queue: .main)
func configure() {
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
}
}
PushKit apelează metoda delegatului la primirea notificării. În acest moment, aplicația trebuie să extragă datele din dictionaryPayload și să afișeze imediat apelul prin CallKit, altfel sistemul poate finaliza sarcina de fundal. Apple recomandă finalizarea procesării în 30 de secunde, dar pentru apelurile VoIP este critic să afișeze ecranul de apel înainte de expirarea primei secunde.
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
)
}
}
Odată cu lansarea iOS 13, Apple a introdus restricții stricte privind utilizarea PushKit. Dezvoltatorii foloseau în masă VoIP-push ca mecanism ascuns pentru actualizarea aplicațiilor în fundal — trezirea prin PushKit permitea încărcarea conținutului, sincronizarea datelor și actualizarea interfeței fără permisiunea explicită a utilizatorului. Apple a considerat aceasta o încălcare a conceptului de economisire a energiei și a limitat PushKit doar la indicarea apelurilor primite.
Acum, fiecare notificare PushKit trebuie să conducă imediat la afișarea unui apel primit prin CallKit. Dacă sistemul detectează că PushKit este utilizat în alte scopuri — de exemplu, pentru sincronizare în fundal sau actualizare de conțnut fără afișarea unui apel — aplicația poate fi respinsă la moderare sau deconectată de la serviciul PushKit. Apple a eliminat, de asemenea, posibilitatea de a utiliza PushKit pentru actualizarea datelor în fundal începând cu iOS 13.
Integrarea completă a PushKit include înregistrarea, obținerea tokenului push și procesarea notificărilor primite. PushKit solicită independent permisiunea de a trimite notificări — un apel suplimentar UNUserNotificationCenter nu este necesar pentru PushKit în sine, dar poate fi necesar pentru notificările locale ale aplicației. După înregistrare, sistemul apelează metoda pushRegistry:didUpdatePushCredentials pentru a transmite tokenul push, care trebuie trimis pe 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)")
}
}
Partea de server trimite notificarea PushKit prin APNs cu push-type = voip și antetul apns-push-type: voip. Spre deosebire de APNs obișnuite, VoIP-push utilizează propriul certificat și nu necesită configurarea topicului. Payload trebuie să conțină datele minime pentru identificarea apelului.
// Exemplu payload push VoIP
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
Depanarea PushKit este mai dificilă decât a APNs standard, deoarece PushKit nu funcționează pe simulatorul iOS. Pentru diagnosticare este necesar un iPhone sau iPad fizic. Primul semn al funcționării corecte este apelarea pushRegistry:didUpdatePushCredentials la pornire și apariția unui token push cu un format specific (64 de caractere hex pentru VoIP). Dacă delegatul nu este apelat, verificați entitlements-urile aplicației dumneavoastră.
O altă problemă frecventă este că PushKit nu livrează notificări după actualizarea aplicației. Acest lucru se întâmplă dacă tokenul push s-a schimbat, dar serverul continuă sĄ folosească cel vechi. Soluția este trimiterea unui token proaspăt pe server la pornirea aplicației și eliminarea tokenurilor invalide la apelarea pushRegistry:didInvalidatePushTokenForType. Apple recomandă, de asemenea, implementarea unui mecanism de fallback prin APNs obișnuite.
| Problemă | Cauză | Soluție |
|---|---|---|
| didUpdatePushCredentials nu este apelat | Lipsesc entitlements sau tip incorect | Verificați Capabilities → Push Notifications + VoIP în Xcode |
| Push vine cu întârziere | Dispozitiv în modul Low Power Mode sau semnal slab | PushKit nu poate ocoli limitările hardware |
| Notificările nu vin după repornire | Schimbarea tokenului push după reinstalarea aplicației | Solicitați un token nou și actualizați-l pe server |
| App Store respins din cauza PushKit | PushKit folosit în alte scopuri decât apelurile | Asigurați-vă că fiecare push duce la reportNewIncomingCall |
Întrebări frecvente
Tehnic da, dar fără sens. Începând cu iOS 13, singura aplicare permisă a PushKit este indicarea apelurilor primite, care necesită CallKit pentru afișare. Utilizarea PushKit fără CallKit va duce la respingerea aplicației în App Store.
Dimensiunea maximă a payload-ului pentru PushKit este de 5 KB (5120 de octeți). Este cu 1 KB mai mult decât notificările obișnuite APNs, ceea ce permite transmiterea mai multor metadate despre apel.
Apple anulează automat tokenul push la ștergerea aplicației. Serverul va primi o notificare de invalidare și trebuie să înceteze trimiterea de push pe acest token. Încercarea de a trimite push pe un token invalid va cauza o eroare APNs 410.
PushKit este disponibil pe macOS 10.14+ pentru aplicații Mac create cu Mac Catalyst sau AppKit. Funcționalitatea este complet analogă versiunii iOS, inclusiv suportul pentru notificări VoIP.
Utilizați-vă propria analitică: urmăriți timpul între trimiterea push de pe server și apelarea didReceiveIncomingPushWithPayload pe client. Un timp mediu sub 500 ms indică o funcționare corectă a PushKit.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și