PushKit је Apple оквир за испоруку push обавештења са зајемченом тренутном испоруком, пре свега намењен за VoIP апликације. За разлику од стандардних APNs (Apple Push Notification service), који могу да касне или се групишу, PushKit користи сталну TCP везу између уређаја и Apple сервера. Према Apple Developer Documentation, 2026, PushKit осигурава каснење испоруке мање од 500 милисекунди, што је критично за апликације у реалном времену — гласовне и видео позиве.
Главно
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 подржава четири типа: VoIP (за позиве), Complication (за податке на бројчаницима watchOS), FileProvider (за синхронизацију датотека) и PushToTalk (за функцију радије). Од iOS 13, само VoIP тип остаје широко доступан за програмере трећих страна. Complication и FileProvider имају уско специјализовану примену и ограничени су на сопствене Apple екосистеме.
| PushKit тип | Намена | Доступност |
|---|---|---|
| VoIP | Индикација долазних гласовних и видео позива | iOS 8+, App Store |
| Complication | Ажурирање података на бројчаницима Apple Watch | watchOS 6+ |
| FileProvider | Сигнал о новим датотекама у File Provider Extension | iOS 11+, ограничено |
| PushToTalk | Функција радије у корпоративним апликацијама | iOS 16+, ограничен приступ |
APNs (Apple Push Notification service) — универзални сервис за испоруку push обавештења, који ради кроз јединствени канал за све апликације. Apple може да буферише, групише или чак одбаци APNs обавештења при преоптерећењу канала. PushKit, насупрот, користи намењену везу за сваки тип обавештења, и Apple гарантује испоруку сваког VoIP-push-а без буферизације.
Разлика се појављује у сценаријима критичним по времену: долазни позив испоручен путем APNs може да стигне са кашњењем од 10–30 секунди или да не стигне уопште ако је уређај у режиму штедње енергије. PushKit испоручује исто обавештење за 100–500 мс без обзира на стање уређаја, јер његов TCP канал систем одржава активним на приоритетни начин.
| Параметар | PushKit | APNs |
|---|---|---|
| Тип везе | Стална TCP (намењени канал) | Заједнички канал са буферизацијом |
| Медијана кашњења | 120–350 мс | 1–5 секунди |
| Буђење апликације | Увек, из било којег стања | Само ако апликација није убијена |
| Величина payload-а | До 5 KB | До 4 KB |
| Груписање у iOS-у | Не | Да |
Архитектура PushKit-а је изграђена око PKPushRegistry-а — објекта који региструје апликацију за примање обавештења одређеног типа. Апликација креира инстанцу PKPushRegistry, наводи жељени тип (нпр. PKPushTypeVoIP) и поставља делегата. Након регистрације, систем аутоматски одржава везу са APNs-ом и испоручује push обавештења путем делегата.
Свако обавештење је представљено објектом PKPushPayload, који садржи речник dictionaryPayload са подацима са сервера. Величина payload-а је ограничена на 5 KB, што је довољно за преношење метаподатака позива: идентификатора позиваоца, типа позива (аудио/видео), имена контакта и токена сесије. Медијски ток се преноси одвојено путем WebRTC-а или другог протокола реалног времена.
import PushKit
class PushKitManager: NSObject {
private let pushRegistry = PKPushRegistry(queue: .main)
func configure() {
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [.voIP]
}
}
PushKit позива методу делегата при приему обавештења. У овом тренутку, апликација мора да извуче податке из dictionaryPayload-а и одмах прикаже позив кроз CallKit, иначе систем може да заврши задатак у позадини. Apple препоручује завршетак обраде у року од 30 секунди, али за VoIP позиве је критично приказати екран позива пре истека прве секунде.
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, Apple је увела строга ограничења на коришћење PushKit-а. Програмери су масовно користили VoIP-push као скривени механизам за ажурирање апликација у позадини — буђење путем PushKit-а омогућавало учитавање садржаја, синхронизацију података и ажурирање интерфејса без експлицитне дозволе корисника. Apple је ово сматрало кршењем концепта штедње енергије и ограничило PushKit само на индикацију долазних позива.
Сада свако PushKit обавештење мора одмах да доведе до приказивања долазног позива кроз CallKit. Ако систем открије да се PushKit користи за друге сврхе — нпр. за синхронизацију у позадини или ажурирање садржаја без приказивања позива — апликација може бити одбијена на модерацији или искључена из PushKit сервиса. Apple је такође уклонила могућност коришћења PushKit-а за ажурирање података у позадини од iOS 13.
Пуна интеграција PushKit-а укључује регистрацију, добијање push токена и обраду долазних обавештења. PushKit самостално захтева дозволу за слање обавештења — додатно позивање UNUserNotificationCenter-а није потребно за сам PushKit, али може бити потребно за локална обавештења апликације. Након регистрације, систем позива методу pushRegistry:didUpdatePushCredentials за преношење push токена, који се мора послати на сервер.
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)")
}
}
Серверска страна шаље PushKit обавештење путем APNs-а са push-type = voip и заглављем apns-push-type: voip. За разлику од обичних APNs, VoIP-push користи сопствени сертификат и не захтева конфигурисање topic-а. Payload треба да садржи минималне податке за идентификацију позива.
// Пример VoIP push payload-а
{
"aps": {
"alert": {}
},
"caller": "+15551234567",
"callerName": "Alice Johnson",
"sessionId": "abc-123-def",
"hasVideo": false
}
Отклањање 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 |
Често постављана питања
Технички да, али бесмислено. Од iOS 13, једина дозвољена примјена PushKit-а је индикација долазних позива, која захтева CallKit за приказивање. Коришћење PushKit-а без CallKit-а довешће до одбијања апликације у App Store-у.
Максимална величина payload-а за PushKit износи 5 KB (5120 бајта). То је 1 KB више него код обичних APNs обавештења, што омогућава преношење више метаподатака о позиву.
Apple аутоматски поништава push токен при брисању апликације. Сервер ће добити обавештење о поништавању и мора да прекине са слањем push-а на овај токен. Покушај слања push-а на неважећи токен изазваће APNs грешку 410.
PushKit је доступан на macOS 10.14+ за Mac апликације креиране помоћу Mac Catalyst-а или AppKit-а. Функционалност је потпуно аналогна iOS верзији, укључујући подршку за VoIP обавештења.
Користите сопствену аналитику: пратите време између слања push-а са сервера и позивања didReceiveIncomingPushWithPayload на клијенту. Просечно време мање од 500 мс указује на исправан рад PushKit-а.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође