Notification Payload — је JSON структура коју сервер шаље путем APNS-а на iOS уређај, одређујући садржај push обавештења и понашање при његовом пријему. Пейлоуд укључује обавезне и опционалне кључеве који управљају текстом, звуком, badge-ом, медијским прилозима и обрадом у позадини. Према Apple Developer Documentation, 2026, максимална величина пейлоуда износи 4096 бајтова за обична обавештења и 5120 бајтова за VoIP push, што намеће строга ограничења на количину података који се преносе.
Главно
Notification Payload (пейлоуд обавештења) — је JSON објекат који сервер шаље APNS-у (Apple Push Notification Service) ради доставе на iOS уређај. Пейлоуд садржи све податке потребне систему за приказ обавештења: наслов, текст, звук, badge и метаподатке за обраду у позадини. Структура пейлоуда је строго регулисана од стране Apple-а и укључује обавезне кључеве за правилну обраду од стране система.
Када сервер шаље push обавештење путем HTTP/2 API APNS-а, захтев садржи заглавља ауторизације и JSON тело — пейлоуд. APNS проверава валидност пейлоуда: ако је JSON неисправан или премашује ограничење величине, Apple сервер враћа грешку 400 Bad Request. Након валидације, APNS доставља пейлоуд на уређај, где га iOS систем парсира и одређује како да обради обавештење — прикаже банер, покрене позадински задатак или репродукује звук.
Формат APNS пейлоуда је еволуирао од једноставног текстуалног пейлоуда у iOS 2 до вишекомпонентне JSON структуре у модерним верзијама. iOS 10 је донела подршку за медијске прилоге путем mutable-content, iOS 12 је додала груписање обавештења путем thread-id, а iOS 15 је увео supports-live-activities за Live Activities. Данас пейлоуд може садржати до 15 различитих кључева у зависности од потребног понашања обавештења.
Корени објекат пейлоуда садржи речник aps и опционална прилагођена поља на горњем нивоу. Речник aps је једини обавезни елемент, али унутар њега могу постојати различите комбинације кључева у зависности од типа обавештења: alert, badge, sound, content-available, mutable-content, interruption-level и други.
| aps кључ | Тип | Намена |
|---|---|---|
| alert | String или Dictionary | Текст обавештења или објекат са title, subtitle, body, локализацијом |
| badge | Number | Број на икони апликације; 0 уклања badge |
| sound | String | Име звучне датотеке или default за системски звук |
| content-available | Number (1) | Заставица активације у позадини; 1 = silent push |
| mutable-content | Number (1) | Заставица активације Service Extension за измену садржаја |
| category | String | Идентификатор категорије за дугмад и Content Extension |
| thread-id | String | Идентификатор групе за груписање обавештења |
| interruption-level | String | Ниво прекида: passive, active, time-sensitive, critical |
| relevance-score | Number (0–1) | Приоритет обавештења за систем паметног рангирања |
alert кључ може бити једноставан стринг (који постаје тело обавештења) или речник са пољима title, subtitle, body. Речник формат омогућава постављање наслова и поднаслова одвојено од главног текста. За локализована обавештења користе се кључеви title-loc-key, title-loc-args, loc-key, loc-args, који упућују на Localizable.strings апликације. Ово омогућава слање пейлоуда без текста на одређеном језику — апликација замењује превод.
Почевши од iOS 15, Apple је додао механизам Focus Mode, који захтева од програмера да наведе ниво прекида обавештења. interruption-level прихвата вредности: passive (без звука, без буђења екрана), active (стандардно понашање), time-sensitive (пробија фокус, захтева special entitlement) и critical (медицинске/хитне ситуације). Кључ relevance-score (0–1) помаже Focus систему да рангира обавештења у оквиру једне категорије.
Кључ thread-id обједињује обавештења у групе у Notification Center-у. Сва обавештења са истим thread-id приказују се као једна група коју корисник може да прошири. Ово је посебно корисно за апликације за размену порука, где се поруке од једног контакта групишу заједно, или за апликације које шаљу много обавештења истог типа.
Прилагођена поља — су сви кључеви ван речника aps које програмер додаје за пренос додатних података на уређај. Сервер их укључује у корени JSON објекат пейлоуда, а апликација их прима путем userInfo у UNNotificationContent. Прилагођена поља не би требало да дуплирају имена кључева из aps-а да би се избегли конфликти при парсирању.
Главно ограничење — укупна величина пейлоуда не сме да прелази 4096 бајтова. Прилагођена поља се такмиче за ово ограничење са обавезним aps кључевима, зато је важно минимизирати величину пренетих података. Користите кратке називе кључева (нпр. „uid“ уместо „user-id“), избегавајте велике JSON структуре и преносите само идентификаторе, не пуне објекте података.
Прилагођена поља долазе са сервера и не треба им веровати без провере. Увек валидирајте типове и вредности прилагођених поља при парсирању: проверавајте присуство кључа путем optional binding, конвертујте у очекивани тип помоћу as? String/Int/Dictionary и обрадите случај недостатка вредности. Никада не користите force unwrap (!) за податке из пейлоуда — сервер може послати неисправне податке и апликација ће crash-овати.
{
"aps": {
"alert": {
"title": "Нова порука",
"body": "Здраво! Како си?"
},
"badge": 5,
"sound": "default",
"category": "message",
"thread-id": "chat_4521",
"mutable-content": 1
},
"sender-id": "user_789",
"chat-id": "chat_4521",
"message-type": "text",
"image-url": "https://cdn.example.com/img.jpg"
}
Користите јединствени стил именовања прилагођених поља у свим пейлоудима пројекта. kebab-case (message-type) или camelCase (messageType) — оба приступа су прихватљива, али је важно држати се једног у оквиру пројекта. Избегавајте дуга имена: „uid“ уместо „user-identifier“, „img“ уместо „profile-image-url“. Сваки знак у имену кључа је бајт из лимита 4096.
Различити сценарији push обавештења захтевају различите комбинације кључева у пейлоуду. Размотримо неколико типичних примера: једноставно текстуално обавештење, обавештење са локализацијом, Silent Push и Rich Notification са медијским прилогом.
Основни пейлоуд са текстом и звуком — минимална конфигурација за приказ обавештења кориснику. Alert као стринг даје кратку поруку, sound default репродукује стандардни системски звук. Badge је опционалан и поставља бројач на иконици. category и thread-id се додају за груписање и интерактивност.
{
"aps": {
"alert": "Подсетник: састанак за 15 минута",
"badge": 3,
"sound": "default"
}
}
За слање на уређаје са различитим језицима користите кључеве локализације уместо чврсто задатог текста. title-loc-key упућује на кључ у Localizable.strings апликације, а title-loc-args замењује аргументе. Ово омогућава слање једног пейлоуда на све уређаје, а апликација сама приказује текст на одговарајућем језику.
{
"aps": {
"alert": {
"title-loc-key": "NEW_MESSAGE_TITLE",
"title-loc-args": ["Ана"],
"loc-key": "NEW_MESSAGE_BODY",
"loc-args": ["Здраво!"]
},
"sound": "message.caf"
}
}
За позадинску синхронизацију без приказа обавештења користи се content-available: 1 и одсуство alert-а. Прилагођена поља указују на тип операције и податке за обраду. Систем активира апликацију у позадини, позива didReceiveRemoteNotification са fetchCompletionHandler, и апликација извршава синхронизацију.
{
"aps": {
"content-available": 1
},
"sync-type": "invalidate-cache",
"timestamp": "2026-07-03T12:00:00Z"
}
За приказ медијског прилога потребан је mutable-content: 1 за активацију Service Extension-а и URL слике у прилагођеном пољу. mutable-content: 1 сигнализира систему да покрене UNNotificationServiceExtension, који ће преузети слику са URL-а и додати је као UNNotificationAttachment. category указује на регистровану категорију за приказ дугмади за радње.
{
"aps": {
"alert": {
"title": "Нови производ",
"body": "Погледајте нову колекцију"
},
"category": "product",
"mutable-content": 1
},
"media-url": "https://cdn.example.com/product.jpg"
}
UNNotificationContent.userInfo садржи пун речник примљеног пейлоуда након обраде од стране система. Апликација приступа пейлоуду у делегату UNUserNotificationCenter-а при пријему обавештења (у предњем плану), при клику на обавештење, као и у Service Extension-у и Content Extension-у. Исправно парсирање је обавезно за издвајање прилагођених података и одређивање даљих радњи.
Када корисник кликне на обавештење, систем позива метод didReceive response у UNUserNotificationCenterDelegate-у. У response.notification.request.content.userInfo се налази пун пейлоуд. Програмер издваја прилагођена поља, одређује тип радње (нпр. отварање ћаскања, прелазак на производ) и позива одговарајућу навигацију у апликацији.
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
let userInfo = response.notification
.request.content.userInfo
guard let chatId = userInfo["chat-id"] as? String
else {
completionHandler()
return
}
let messageType = userInfo["message-type"]
as? String ?? "text"
NavigationRouter.shared.navigate(
to: .chat(chatId: chatId,
messageType: messageType))
completionHandler()
}
Service Extension прима пейлоуд пре приказа обавештења и може га модификовати. Валидација пейлоуда — први корак у didReceive: проверите присуство обавезних прилагођених поља, исправност URL-а за прилоге и тип података. Ако је пейлоуд неважећи, одмах позовите completion handler са оригиналним садржајем, не губећи време на бескорисну обраду.
За отклањање грешака push обавештења на продукцији користите структурирано логовање пейлоуда. OSLog омогућава логовање пейлоуда са категоријом „notifications“ и debug нивоом. На серверској страни пратите APNS одговоре: успешан одговор садржи apns-id за подударање са послатим пейлоудом, а грешка 400 указује на неисправан JSON или прекорачење величине.
Често постављана питања
Максимална величина пейлоуда — 4096 бајтова за обична push обавештења и 5120 бајтова за VoIP push (PushKit). При прекорачењу, APNS враћа грешку 400 Bad Request. Величина се рачуна у бајтовима, не у знаковима — узмите у обзир UTF-8 кодирање.
Користите кључеве loc-key, title-loc-key, loc-args и title-loc-args унутар alert-а. Апликација замењује превод из свог Localizable.strings на основу језика уређаја. Ово омогућава слање једног пейлоуда на све уређаје без обзира на њихов језик.
content-available активира апликацију у позадини за обраду података (silent push) без приказа обавештења. mutable-content активира Service Extension за измену садржаја пре приказа. Оба кључа могу се користити заједно за позадинску обраду и накнадну измену обавештења.
Користите APNS Sandbox за тестирање и проверавајте HTTP одговор Apple сервера: 200 OK значи успешно слање. За валидацију структуре користите JSON шеме у CI/CD пајплајну. У Xcode-у шаљите тестна обавештења преко симулатора командом xcrun simctl push.
apns-id — јединствени идентификатор push обавештења у APNS систему који се враћа у одговору на успешно слање. Користи се за праћење доставе путем Logs API-ја и за отклањање грешака. Сервер треба да сачува apns-id за свако послато обавештење.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође