PushKit је iOS оквир за испоруку VoIP обавештења са ниским кашњењем, заобилазећи стандардни APNs. Према Apple Developer Documentation (2025), PushKit гарантује испоруку позива у року од 5 секунди чак и у позадини. VoIP обавештења се обрађују директно, без потребе да се кориснику прикаже банер, што овај оквир чини основним алатом за месинџере и апликације за видео позиве на iOS-у.
Главне тачке
PushKit је оквир компаније Apple, представљен у iOS 8, који обезбеђује испоруку пусх обавештења са ниским кашњењем за VoIP апликације. За разлику од стандардног APNs (Apple Push Notification service), PushKit омогућава апликацији да се пробуди у позадини при пријему долазног позива, без приказивања обавештења кориснику. Ово је критично за апликације за гласовну и видео комуникацију — корисник прима позив тренутно, чак и ако је апликација затворена. Према Apple WWDC 2024, PushKit обрађује преко 2 милијарде VoIP обавештења дневно широм света.
Механизам рада заснива се на директној вези између уређаја и Apple пусх сервера, заобилазећи стандардни канал обавештења. Када сервер апликације пошаље VoIP обавештење, оно пролази кроз наменски PushKit сервер и испоручује се на уређај са максималним приоритетом. Систем буди апликацију у позадини и позива метод делегата pushRegistry:didReceiveIncomingPushWithPayload:forType:. Апликација прима податке, обрађује позив и позива довршни руковалац ради потврде. Цео циклус од слања до обраде траје највише 5 секунди, што је потврђено Apple спецификацијом.
Основна разлика између PushKit и APNs лежи у механизму испоруке и обради. APNs користи стандардни канал обавештења са приказивањем банера, звука или значке, док PushKit испоручује податке директно у апликацију без визуелног обавештења. Испод је упоредна табела кључних карактеристика.
| Карактеристика | PushKit | APNs |
|---|---|---|
| Приоритет испоруке | Висок (тренутна испорука) | Средњи (могуће кашњење) |
| Буђење апликације | Да, у позадини | Само при клику на обавештење |
| Приказивање банера | Не | Да (опционално) |
| Употреба | VoIP, позиви, видео комуникација | Било које врсте обавештења |
| Подаци | Само JSON, без медија | JSON + прилози |
PushKit такође не подржава богате медијске прилоге и не може се користити за обична маркетиншка обавештења. Apple строго контролише употребу PushKit-а — апликација мора имати јасну VoIP функционалност, у супротном ће бити одбијена при прегледу. APNs остаје универзално решење за све остале сценарије.
Да би користила PushKit, апликација мора да се региструје преко PKPushRegistry са типом pushType .voIP. Регистрација се врши једном при првом покретању, након чега систем генерише јединствени пусх токен и прослеђује га преко делегата. Овај токен се шаље на сервер апликације за касније слање VoIP обавештења. Испод је пример регистрације PushKit-а и добијања токена у Swift-у.
import PushKit
let registry = PKPushRegistry(queue: DispatchQueue.main)
registry.delegate = self
registry.desiredPushTypes = [.voIP]
// MARK: - PKPushRegistryDelegate
func pushRegistry(
_ registry: PKPushRegistry,
didUpdate pushCredentials: PKPushCredentials,
for type: PKPushType
) {
let deviceToken = pushCredentials.token
.map { String.format("%02x", $0) }
.joined()
sendVoIPTokenToServer(deviceToken)
}
Након позивања desiredPushTypes са PKPushType.voIP, систем аутоматски тражи дозволу за примање VoIP обавештења. У методи pushRegistry:didUpdatePushCredentials:forType: апликација прима уређајски токен у облику Data, који се конвертује у хекс-низ и шаље на сервер. Токен је јединствен за сваки уређај и мења се при поновној инсталацији апликације — сервер мора да обрађује ажурирање токена.
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping VoidBlock
) {
guard let caller = payload.dictionaryPayload["caller"] as? String else {
completion()
return
}
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: caller)
provider.reportNewIncomingCall(
with: UUID(),
update: update,
completion: { error in
if let error = error {
print("Call error: \(error)")
}
completion()
}
)
}
У методи didReceiveIncomingPushWith апликација прима податке с информацијама о позиву. Након издвајања података о позиваоцу, креира се CXCallUpdate из CallKit оквира за приказ екрана долазног позива. Важно је позвати довршни руковалац након завршетка обраде — у супротном, систем може присилно прекинути процес апликације због истека времена. Максимално време обраде је 30 секунди, након чега iOS сматра обавештење необрађеним.
PushKit је уско интегрисан са CallKit — оквиром за приказ системског интерфејса позива на iOS-у. Када апликација прими VoIP обавештење преко PushKit-а, мора да креира CXProvider и CXCallController за управљање позивом. CallKit аутоматски приказује екран долазног позива на закључаном екрану, чак и ако је апликација сведена. Испод је пример подешавања CallKit провајдера.
let config = CXProviderConfiguration(localizedName: "MyApp")
config.supportsVideo = true
config.maximumCallGroups = 1
config.maximumCallsPerCallGroup = 1
config.supportedHandleTypes = [.phoneNumber, .generic]
let provider = CXProvider(configuration: config)
provider.setDelegate(self, queue: nil)
CXProviderConfiguration дефинише изглед и понашање екрана позива — назив апликације, подршку за видео, број истовремених позива. Интеграција PushKit-а са CallKit-ом је обавезна за VoIP апликације: без тога систем неће приказати екран долазног позива, а корисник ће пропустити позив. Apple захтева коришћење CallKit-а за све апликације које користе PushKit.
Коришћење PushKit-а намеће низ строгих ограничења које је поставио Apple. Оквир се може користити само за VoIP функционалност — сваки покушај слања маркетиншких обавештења преко PushKit-а довешће до блокирања апликације. Величина података не сме да прелази 4 KB и може садржати само JSON податке без прилога. Почевши од iOS 13, Apple је увео ограничење учесталости слања VoIP обавештења — не више од једног обавештења у минути по уређају. Сервер мора да поштује ово ограничење, у супротном обавештења ће бити одбијена од стране система. PushKit такође не ради на iOS симулатору — тестирање је могуће само на физичком уређају.
Подаци VoIP обавештења представљају JSON речник са прилагођеним подацима о позиву. За разлику од APNs, PushKit не подржава стандардна поља alert, badge и sound — све податке дефинише програмер. Типична структура укључује идентификатор позиваоца (caller), врсту позива (voice или video), идентификатор собе или сесије и временску ознаку. Величина сваког поља треба да буде минимална ради уштеде простора у лимиту од 4 KB. Apple препоручује да се у податке укључе само информације неопходне за приказ екрана долазног позива на закључаном екрану, а остале информације (аватар, историју порука) учитавају након што корисник одговори посебним мрежним захтевом. Пример минималних података: { „caller”: „Ana”, „caller_id”: „+79161234567”, „type”: „audio”, „room”: „uuid-room-1234”, „ts”: 1718534400 }. Сви кључеви у подацима треба да буду кратки, недвосмислени и документовани на серверској страни ради компатибилности између верзија апликације.
При раду са PushKit-ом потребно је предвидети обраду грешака испоруке и губитка везе. Ако је уређај ван мреже или искључен из мреже, VoIP обавештење неће бити испоручено — PushKit не подржава чување и поновно слање, за разлику од APNs-а који чува обавештење до 24 сата ради поновног покушаја. Сервер мора самостално да прати неиспоручена обавештења и понавља покушај по успостављању везе. У ту сврху користи се механизам push kit feedback service — он враћа листу неиспоручених обавештења са назнаком узрока грешке. Препоручује се подешавање праћења успешности испоруке VoIP обавештења путем серверске аналитике и обавештавање програмера када проценат успешних испорука падне испод 95%. PushKit систем гарантује испоруку само када постоји активна интернет веза на уређају — у њеном одсуству обавештење се неповратно губи, што је критично узети у обзир при пројектовању поузданог система VoIP позива са гарантованом испоруком.
Често постављана питања
PushKit је Apple оквир за испоруку VoIP обавештења са ниским кашњењем, који омогућава апликацији да се пробуди у позадини при долазном позиву без приказивања банера. Користи се у месинџерима и видео апликацијама.
PushKit има виши приоритет испоруке и буди апликацију у позадини, не приказујући обавештење кориснику. APNs испоручује обавештења са банером и не може да пробуди апликацију за обраду позива без интеракције корисника.
Да, Apple захтева интеграцију PushKit са CallKit-ом за приказ системског екрана долазног позива. Без CallKit-а, апликација неће моћи да прикаже кориснику долазни позив на закључаном екрану, што чини VoIP функционалност бескорисном.
Токен се добија након креирања PKPushRegistry са типом .voIP и имплементацијом делегата pushRegistry:didUpdatePushCredentials:forType:. Токен се преноси као Data и мора се конвертовати у хекс-низ за слање на сервер.
Максимална величина података за PushKit је 4 KB. Подаци морају бити у JSON формату. Медијски прилози нису подржани. Од iOS 13 важи ограничење — не више од једног VoIP обавештења у минути по уређају.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође