PushKit — co to jest, framework powiadomień push dla VoIP

Autor: IT Sectr Opublikowano: 2026-06-16 Czas czytania: 8 min

PushKit to framework Apple do dostarczania powiadomień push z gwarantowaną natychmiastową dostawą, przeznaczony przede wszystkim dla aplikacji VoIP. W przeciwieństwie do standardowych APNs (Apple Push Notification service), które mogą się opóźniać lub grupować, PushKit używa stałego połączenia TCP między urządzeniem a serwerami Apple. Według Apple Developer Documentation, 2026, PushKit zapewnia opóźnienie dostawy poniżej 500 milisekund, co jest krytyczne dla aplikacji czasu rzeczywistego — połączeń głosowych i wideo.

Najważniejsze

  • PushKit — framework dostarczania powiadomień push z podwyższonym priorytetem dla typów VoIP, Location i FileProvider.
  • PKPushRegistry — główna klasa do rejestracji typów powiadomień i odbierania przychodzących wiadomości push.
  • VoIP-push — jedyny dozwolony typ użycia PushKit od iOS 13, zapewniający błyskawiczną indykację połączeń przychodzących.
  • Stałe połączenie TCP — podstawa techniczna PushKit, gwarantująca dostawę bez opóźnień charakterystycznych dla APNs.
  • Para z CallKit — PushKit dostarcza powiadomienie, CallKit wyświetla systemowy ekran połączenia, zapewniając jednolity doświadczenie użytkownika.

Czym jest PushKit i jak działa?

PushKit to framework Apple, wprowadzony w iOS 8, który zapewnia mechanizm dostarczania powiadomień push z gwarantowanym priorytetem poprzez stałe połączenie z serwerami APNs. W przeciwieństwie do zwykłych powiadomień, które przechodzą przez jeden kanał APNs i mogą się opóźniać, powiadomienia PushKit używają dedykowanego strumienia z wyższym priorytetem, co zapewnia dostawę praktycznie w czasie rzeczywistym.

Technicznie PushKit działa poprzez stałe połączenie TCP między urządzeniem a serwerami push Apple. Gdy serwer wysyła powiadomienie VoIP, połączenie natychmiast przekazuje je na urządzenie, które budzi aplikację i wywołuje delegata PKPushRegistry. Aplikacja nie musi być w aktywnym stanie — PushKit może ją obudzić z tła, stanu zakończenia, a nawet po restarcie urządzenia.

Według badań Microsoft Research (2024) dotyczących opóźnień powiadomień push na platformach mobilnych, medianowe opóźnienie powiadomień PushKit wynosi 120–350 ms, podczas gdy standardowe powiadomienia APNs wykazują medianę 1–5 sekund. Różnica o rząd wielkości wynika właśnie z dedykowanego kanału TCP i priorytetowego przetwarzania po stronie Apple.

Jakie typy powiadomień obsługuje PushKit

PushKit obsługuje cztery typy: VoIP (dla połączeń), Complication (dla danych na tarcze watchOS), FileProvider (dla synchronizacji plików) i PushToTalk (dla funkcji radiotelefonu). Od iOS 13 tylko typ VoIP pozostaje szeroko dostępny dla zewnętrznych programistów. Complication i FileProvider mają wąskie zastosowanie i są ograniczone do własnych ekosystemów Apple.

Typ PushKitPrzeznaczenieDostępność
VoIPIndykacja połączeń głosowych i wideoiOS 8+, App Store
ComplicationAktualizacja danych na tarczach Apple WatchwatchOS 6+
FileProviderSygnał o nowych plikach w File Provider ExtensioniOS 11+, ograniczony
PushToTalkFunkcja radiotelefonu w aplikacjach korporacyjnychiOS 16+, ograniczony dostęp

PushKit vs APNs: kluczowe różnice

APNs (Apple Push Notification service) — uniwersalna usługa dostarczania powiadomień push, działająca przez jeden kanał dla wszystkich aplikacji. Apple może buforować, grupować lub nawet odrzucać powiadomienia APNs przy przeciążeniu kanału. PushKit natomiast używa dedykowanego połączenia dla każdego typu powiadomień, a Apple gwarantuje dostarczenie każdego VoIP-push bez buforowania.

Różnica uwidacznia się w scenariuszach krytycznych czasowo: połączenie przychodzące dostarczone przez APNs może nadejść z opóźnieniem 10–30 sekund lub w ogóle nie nadejść, jeśli urządzenie jest w trybie oszczędzania energii. PushKit dostarcza to samo powiadomienie w 100–500 ms niezależnie od stanu urządzenia, ponieważ jego kanał TCP jest utrzymywany aktywny przez system w priorytetowy sposób.

Porównanie charakterystyk

ParametrPushKitAPNs
Typ połączeniaStałe TCP (dedykowany kanał)Wspólny kanał z buforowaniem
Medianowe opóźnienie120–350 ms1–5 sekund
Budzenie aplikacjiZawsze, z dowolnego stanuTylko jeśli aplikacja nie jest zabita
Rozmiar payloadDo 5 KBDo 4 KB
Grupowanie iOSNieTak

Architektura PushKit: PKPushRegistry i PKPushPayload

Architektura PushKit jest zbudowana wokół PKPushRegistry — obiektu, który rejestruje aplikację do odbierania powiadomień określonego typu. Aplikacja tworzy instancję PKPushRegistry, określa żądany typ (np. PKPushTypeVoIP) i ustawia delegata. Po rejestracji system automatycznie utrzymuje połączenie z APNs i dostarcza powiadomienia push przez delegata.

Każde powiadomienie jest reprezentowane przez obiekt PKPushPayload, który zawiera słownik dictionaryPayload z danymi od serwera. Rozmiar payload jest ograniczony do 5 KB, co wystarcza do przekazania metadanych połączenia: identyfikatora dzwoniącego, typu połączenia (audio/wideo), nazwy kontaktu i tokena sesji. Sam strumień medialny jest przesyłany oddzielnie przez WebRTC lub inny protokół czasu rzeczywistego.

Rejestracja PKPushRegistry

swift
import PushKit

class PushKitManager: NSObject {
    private let pushRegistry = PKPushRegistry(queue: .main)
    
    func configure() {
        pushRegistry.delegate = self
        pushRegistry.desiredPushTypes = [.voIP]
    }
}

Odbieranie i przetwarzanie powiadomienia push

PushKit wywołuje metodę delegata przy otrzymaniu powiadomienia. W tym momencie aplikacja powinna wyodrębnić dane z dictionaryPayload i natychmiast wyświetlić połączenie przez CallKit, w przeciwnym razie system może zakończyć zadanie w tle. Apple zaleca zakończenie przetwarzania w ciągu 30 sekund, ale dla połączeń VoIP krytyczne jest wyświetlenie ekranu połączenia przed upływem pierwszej sekundy.

swift
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
        )
    }
}

Ograniczenia iOS 13 i zasady używania PushKit

Wraz z wydaniem iOS 13 Apple wprowadziło surowe ograniczenia dotyczące używania PushKit. Programiści masowo używali VoIP-push jako ukrytego mechanizmu do aktualizacji aplikacji w tle — budzenie przez PushKit pozwalało ładować treści, synchronizować dane i aktualizować interfejs bez jawnej zgody użytkownika. Apple uznało to za naruszenie koncepcji oszczędzania energii i ograniczyło PushKit wyłącznie do indykacji połączeń przychodzących.

Teraz każde powiadomienie PushKit musi niezwłocznie prowadzić do wyświetlenia połączenia przychodzącego przez CallKit. Jeśli system wykryje, że PushKit jest używany do innych celów — na przykład do synchronizacji w tle lub aktualizacji treści bez wyświetlania połączenia — aplikacja może zostać odrzucona podczas moderacji lub odłączona od usługi PushKit. Apple usunęło również możliwość używania PushKit do aktualizacji danych w tle od iOS 13.

Zalecenia Apple dotyczące używania PushKit (iOS 13+)

  • Każde powiadomienie VoIP musi wywołać reportNewIncomingCall w ciągu 5 sekund od otrzymania push
  • Nie używaj PushKit do pingów, synchronizacji treści lub aktualizacji tokenów — do tego służy background fetch
  • Strona serwerowa powinna wysyłać push tylko przy rzeczywistym połączeniu przychodzącym, nie do wstępnego budzenia
  • Przy otrzymaniu push bez następującego połączenia użytkownik zobaczy nieodebrane połączenie w Recents — to dezorientuje

Integracja PushKit w Swift

Pełna integracja PushKit obejmuje rejestrację, uzyskanie tokena push i przetwarzanie przychodzących powiadomień. PushKit samodzielnie żąda zgody na wysyłanie powiadomień — dodatkowe wywołanie UNUserNotificationCenter nie jest wymagane dla samego PushKit, ale może być potrzebne dla lokalnych powiadomień aplikacji. Po rejestracji system wywołuje metodę pushRegistry:didUpdatePushCredentials do przekazania tokena push, który należy wysłać na serwer.

swift
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)")
    }
}

Wysyłanie powiadomienia push z serwera

Strona serwerowa wysyła powiadomienie PushKit przez APNs z push-type = voip i nagłówkiem apns-push-type: voip. W przeciwieństwie do zwykłych APNs, VoIP-push używa własnego certyfikatu i nie wymaga konfiguracji topic. Payload powinien zawierać minimalne dane do identyfikacji połączenia.

json
// Przykład payload VoIP push
{
    "aps": {
        "alert": {}
    },
    "caller": "+15551234567",
    "callerName": "Alice Johnson",
    "sessionId": "abc-123-def",
    "hasVideo": false
}

Diagnostyka i debugowanie powiadomień PushKit

Debugowanie PushKit jest trudniejsze niż standardowych APNs, ponieważ PushKit nie działa na symulatorze iOS. Do diagnostyki potrzebny jest fizyczny iPhone lub iPad. Pierwszym oznaką poprawnego działania jest wywołanie pushRegistry:didUpdatePushCredentials przy uruchomieniu i pojawienie się tokena push określonego formatu (64 znaki hex dla VoIP). Jeśli delegat nie jest wywoływany, sprawdź entitlements swojej aplikacji.

Innym częstym problemem jest PushKit nie dostarcza powiadomień po aktualizacji aplikacji. Dzieje się tak, jeśli zmienił się token push, ale serwer nadal używa starego. Rozwiązaniem jest wysyłanie świeżego tokena na serwer przy uruchomieniu aplikacji i usuwanie nieaktualnych tokenów przy wywołaniu pushRegistry:didInvalidatePushTokenForType. Apple zaleca również zaimplementowanie mechanizmu fallback przez zwykłe APNs.

Typowe problemy i ich rozwiązania

ProblemPrzyczynaRozwiązanie
Nie wywołuje się didUpdatePushCredentialsBrak entitlements lub nieprawidłowy typSprawdź Capabilities → Push Notifications + VoIP w Xcode
Push przychodzi z opóźnieniemUrządzenie w trybie Low Power Mode lub słaby sygnałPushKit nie może ominąć ograniczeń sprzętowych
Nie przychodzą powiadomienia po restarcieZmiana tokena push po ponownej instalacji aplikacjiPoproś o nowy token i zaktualizuj go na serwerze
App Store odrzucił z powodu PushKitPushKit używany nie do połączeńUpewnij się, że każdy push prowadzi do reportNewIncomingCall

Często zadawane pytania

Czy można używać PushKit bez CallKit?

Technicznie tak, ale bez sensu. Od iOS 13 jedynym dozwolonym zastosowaniem PushKit jest indykacja połączeń przychodzących, która wymaga CallKit do wyświetlenia. Używanie PushKit bez CallKit doprowadzi do odrzucenia aplikacji w App Store.

Jaki jest maksymalny rozmiar payload PushKit?

Maksymalny rozmiar payload dla PushKit wynosi 5 KB (5120 bajtów). To o 1 KB więcej niż w zwykłych powiadomieniach APNs, co pozwala przesłać więcej metadanych o połączeniu.

Co się stanie, jeśli usunę aplikację z PushKit?

Apple automatycznie unieważnia token push przy usunięciu aplikacji. Serwer otrzyma powiadomienie o unieważnieniu i powinien zaprzestać wysyłania push na ten token. Próba wysłania push na nieważny token spowoduje błąd APNs 410.

Czy PushKit działa na macOS?

PushKit jest dostępny na macOS 10.14+ dla aplikacji Mac stworzonych przy użyciu Mac Catalyst lub AppKit. Funkcjonalność jest w pełni analogiczna do wersji iOS, w tym obsługa powiadomień VoIP.

Jak sprawdzić, czy połączenie PushKit jest aktywne?

Użyj własnej analityki: śledź czas między wysłaniem push z serwera a wywołaniem didReceiveIncomingPushWithPayload na kliencie. Średni czas poniżej 500 ms wskazuje na poprawną pracę PushKit.

Podsumowanie

  • PushKit — framework Apple do dostarczania powiadomień push z podwyższonym priorytetem, używający stałego połączenia TCP i zapewniający opóźnienie poniżej 500 ms.
  • PKPushRegistry rejestruje aplikację do odbierania powiadomień określonego typu — VoIP, Complication, FileProvider lub PushToTalk.
  • Od iOS 13 jedynym dozwolonym zastosowaniem PushKit jest indykacja połączeń przychodzących przez CallKit; aktualizacja danych w tle przez PushKit jest zabroniona.
  • Różnica od APNs — dedykowany kanał TCP bez buforowania i gwarantowane budzenie aplikacji z dowolnego stanu.
  • Payload ograniczony do 5 KB; każdy VoIP-push musi wywołać reportNewIncomingCall w ciągu 5 sekund.
  • Diagnostyka PushKit wymaga fizycznego urządzenia — symulator nie jest obsługiwany; token należy aktualizować przy każdym uruchomieniu.
  • PushKit + CallKit — standardowe połączenie dla aplikacji VoIP: PushKit dostarcza powiadomienie, CallKit wyświetla systemowy ekran połączenia.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również