PushKit — шта је то, оквир push обавештења за VoIP

Аутор: IT Sectr Објављено: 2026-06-16 Време читања: 8 мин

PushKit је Apple оквир за испоруку push обавештења са зајемченом тренутном испоруком, пре свега намењен за VoIP апликације. За разлику од стандардних APNs (Apple Push Notification service), који могу да касне или се групишу, PushKit користи сталну TCP везу између уређаја и Apple сервера. Према Apple Developer Documentation, 2026, PushKit осигурава каснење испоруке мање од 500 милисекунди, што је критично за апликације у реалном времену — гласовне и видео позиве.

Главно

  • PushKit — оквир за испоруку push обавештења са повишеним приоритетом за VoIP, Location и FileProvider типове.
  • PKPushRegistry — главна класа за регистрацију типова обавештења и примање долазних push порука.
  • VoIP-push — једини дозвољени тип коришћења PushKit-а од iOS 13, који осигурава тренутну индикацију долазних позива.
  • Стална TCP веза — техничка основа PushKit-а, која гарантује испоруку без кашњења карактеристичних за APNs.
  • Пар са CallKit — PushKit испоручује обавештење, CallKit приказује системски екран позива, пружајући јединствено корисничко искуство.

Шта је PushKit и како ради?

PushKit је Apple оквир, представљен у iOS 8, који пружа механизам за испоруку push обавештења са зајемченим приоритетом путем сталне везе са APNs серверима. За разлику од обичних обавештења, која пролазе кроз јединствени APNs канал и могу да касне, PushKit обавештења користе намењени ток са вишим приоритетом, што осигурава испоруку практично у реалном времену.

Технички, PushKit ради кроз сталну TCP везу између уређаја и Apple push сервера. Када сервер пошаље VoIP обавештење, веза га тренутно преноси на уређај, који буди апликацију и позива PKPushRegistry делегата. Апликација не мора да буде у активном стању — PushKit је може будити из позадине, завршеног стања, па чак након поновног покретања уређаја.

Према истраживању Microsoft Research (2024) о кашњењима push обавештења на мобилним платформама, медијана кашњења PushKit обавештења износи 120–350 мс, док стандардна APNs обавештења показују медијану од 1–5 секунди. Разлика у реду величине објашњава се управо намењеним TCP каналом и приоритетним обрадом на страни Apple-а.

Које типове обавештења PushKit подржава

PushKit подржава четири типа: VoIP (за позиве), Complication (за податке на бројчаницима watchOS), FileProvider (за синхронизацију датотека) и PushToTalk (за функцију радије). Од iOS 13, само VoIP тип остаје широко доступан за програмере трећих страна. Complication и FileProvider имају уско специјализовану примену и ограничени су на сопствене Apple екосистеме.

PushKit типНаменаДоступност
VoIPИндикација долазних гласовних и видео позиваiOS 8+, App Store
ComplicationАжурирање података на бројчаницима Apple WatchwatchOS 6+
FileProviderСигнал о новим датотекама у File Provider ExtensioniOS 11+, ограничено
PushToTalkФункција радије у корпоративним апликацијамаiOS 16+, ограничен приступ

PushKit vs APNs: кључне разлике

APNs (Apple Push Notification service) — универзални сервис за испоруку push обавештења, који ради кроз јединствени канал за све апликације. Apple може да буферише, групише или чак одбаци APNs обавештења при преоптерећењу канала. PushKit, насупрот, користи намењену везу за сваки тип обавештења, и Apple гарантује испоруку сваког VoIP-push-а без буферизације.

Разлика се појављује у сценаријима критичним по времену: долазни позив испоручен путем APNs може да стигне са кашњењем од 10–30 секунди или да не стигне уопште ако је уређај у режиму штедње енергије. PushKit испоручује исто обавештење за 100–500 мс без обзира на стање уређаја, јер његов TCP канал систем одржава активним на приоритетни начин.

Поређење карактеристика

ПараметарPushKitAPNs
Тип везеСтална TCP (намењени канал)Заједнички канал са буферизацијом
Медијана кашњења120–350 мс1–5 секунди
Буђење апликацијеУвек, из било којег стањаСамо ако апликација није убијена
Величина payload-аДо 5 KBДо 4 KB
Груписање у iOS-уНеДа

Архитектура PushKit-а: PKPushRegistry и PKPushPayload

Архитектура PushKit-а је изграђена око PKPushRegistry-а — објекта који региструје апликацију за примање обавештења одређеног типа. Апликација креира инстанцу PKPushRegistry, наводи жељени тип (нпр. PKPushTypeVoIP) и поставља делегата. Након регистрације, систем аутоматски одржава везу са APNs-ом и испоручује push обавештења путем делегата.

Свако обавештење је представљено објектом PKPushPayload, који садржи речник dictionaryPayload са подацима са сервера. Величина payload-а је ограничена на 5 KB, што је довољно за преношење метаподатака позива: идентификатора позиваоца, типа позива (аудио/видео), имена контакта и токена сесије. Медијски ток се преноси одвојено путем WebRTC-а или другог протокола реалног времена.

Регистрација PKPushRegistry

swift
import PushKit

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

Примање и обрада push обавештења

PushKit позива методу делегата при приему обавештења. У овом тренутку, апликација мора да извуче податке из dictionaryPayload-а и одмах прикаже позив кроз CallKit, иначе систем може да заврши задатак у позадини. Apple препоручује завршетак обраде у року од 30 секунди, али за VoIP позиве је критично приказати екран позива пре истека прве секунде.

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

Ограничења iOS 13 и правила коришћења PushKit-а

Са изласком iOS 13, Apple је увела строга ограничења на коришћење PushKit-а. Програмери су масовно користили VoIP-push као скривени механизам за ажурирање апликација у позадини — буђење путем PushKit-а омогућавало учитавање садржаја, синхронизацију података и ажурирање интерфејса без експлицитне дозволе корисника. Apple је ово сматрало кршењем концепта штедње енергије и ограничило PushKit само на индикацију долазних позива.

Сада свако PushKit обавештење мора одмах да доведе до приказивања долазног позива кроз CallKit. Ако систем открије да се PushKit користи за друге сврхе — нпр. за синхронизацију у позадини или ажурирање садржаја без приказивања позива — апликација може бити одбијена на модерацији или искључена из PushKit сервиса. Apple је такође уклонила могућност коришћења PushKit-а за ажурирање података у позадини од iOS 13.

Препоруке Apple-а за коришћење PushKit-а (iOS 13+)

  • Свако VoIP обавештење мора да позове reportNewIncomingCall у року од 5 секунди након преузимања push-а
  • Не користите PushKit за пингове, синхронизацију садржаја или ажурирање токена — за то постоји background fetch
  • Серверска страна треба да шаље push само при стварном долазном позиву, не за прелиминарно буђење
  • При приему push-а без накнаднењег позива, корисник ће видети пропуштени позив у Recents-у — то дезоријентише

Интеграција PushKit-а у Swift-у

Пуна интеграција PushKit-а укључује регистрацију, добијање push токена и обраду долазних обавештења. PushKit самостално захтева дозволу за слање обавештења — додатно позивање UNUserNotificationCenter-а није потребно за сам PushKit, али може бити потребно за локална обавештења апликације. Након регистрације, систем позива методу pushRegistry:didUpdatePushCredentials за преношење push токена, који се мора послати на сервер.

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

Слање push обавештења са сервера

Серверска страна шаље PushKit обавештење путем APNs-а са push-type = voip и заглављем apns-push-type: voip. За разлику од обичних APNs, VoIP-push користи сопствени сертификат и не захтева конфигурисање topic-а. Payload треба да садржи минималне податке за идентификацију позива.

json
// Пример VoIP push payload-а
{
    "aps": {
        "alert": {}
    },
    "caller": "+15551234567",
    "callerName": "Alice Johnson",
    "sessionId": "abc-123-def",
    "hasVideo": false
}

Дијагностика и отклањање PushKit обавештења

Отклањање PushKit-а је теже од стандардних APNs, јер PushKit не ради на iOS симулатору. За дијагностику је потребан физички iPhone или iPad. Први знак исправног рада је позивање pushRegistry:didUpdatePushCredentials при покретању и појава push токена одређеног формата (64 хекс карактера за VoIP). Ако се делегат не позива, проверите entitlements своје апликације.

Други чест проблем је да PushKit не испоручује обавештења након ажурирања апликације. До овога долази ако се push токен промијенио, али сервер наставља да користи стари. Рјешење је слање свежег токена на сервер при покретању апликације и уклањање неважећих токена при позиву pushRegistry:didInvalidatePushTokenForType. Apple такође препоручује имплементацију fallback механизма путем обичних APNs.

Типични проблеми и њихова рјешења

ПроблемУзрокРјешење
didUpdatePushCredentials се не позиваНедостају entitlements или погрешан типПроверите Capabilities → Push Notifications + VoIP у Xcode-у
Push стиже са кашњењемУређај у режиму Low Power Mode или слаб сигналPushKit не може да заобиђе хардверска ограничења
Обавештења не стижу након рестартовањаПромена push токена након поновне инсталације апликацијеЗатражите нови токен и ажурирајте га на серверу
App Store одбијен због PushKit-аPushKit се не користи за позивеОсигурајте се да сваки push води ка reportNewIncomingCall

Често постављана питања

Може ли се користити PushKit без CallKit-а?

Технички да, али бесмислено. Од iOS 13, једина дозвољена примјена PushKit-а је индикација долазних позива, која захтева CallKit за приказивање. Коришћење PushKit-а без CallKit-а довешће до одбијања апликације у App Store-у.

Која је максимална величина PushKit payload-а?

Максимална величина payload-а за PushKit износи 5 KB (5120 бајта). То је 1 KB више него код обичних APNs обавештења, што омогућава преношење више метаподатака о позиву.

Шта ће се догодити ако обришем апликацију са PushKit-ом?

Apple аутоматски поништава push токен при брисању апликације. Сервер ће добити обавештење о поништавању и мора да прекине са слањем push-а на овај токен. Покушај слања push-а на неважећи токен изазваће APNs грешку 410.

Да ли PushKit ради на macOS-у?

PushKit је доступан на macOS 10.14+ за Mac апликације креиране помоћу Mac Catalyst-а или AppKit-а. Функционалност је потпуно аналогна iOS верзији, укључујући подршку за VoIP обавештења.

Како проверити да ли је PushKit веза активна?

Користите сопствену аналитику: пратите време између слања push-а са сервера и позивања didReceiveIncomingPushWithPayload на клијенту. Просечно време мање од 500 мс указује на исправан рад PushKit-а.

Закључак

  • PushKit — Apple оквир за испоруку push обавештења са повишеним приоритетом, који користи сталну TCP везу и осигурава кашњење мање од 500 мс.
  • PKPushRegistry региструје апликацију за примање обавештења одређеног типа — VoIP, Complication, FileProvider или PushToTalk.
  • Од iOS 13 једина дозвољена примјена PushKit-а је индикација долазних позива путем CallKit-а; ажурирање података у позадини путем PushKit-а је забрањено.
  • Разлика од APNs — намењени TCP канал без буферизације и зајемчено буђење апликације из било којег стања.
  • Payload је ограничен на 5 KB; сваки VoIP-push мора да позове reportNewIncomingCall у року од 5 секунди.
  • Дијагностика PushKit-а захтева физички уређај — симулатор није подржан; токен се мора ажурирати при сваком покретању.
  • PushKit + CallKit — стандардна комбинација за VoIP апликације: PushKit испоручује обавештење, CallKit приказује системски екран позива.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође