Notification Payload — ay ang JSON structure na ipinapadala ng server sa pamamagitan ng APNS sa isang iOS device, na tumutukoy sa nilalaman ng push notification at ang pag-uugali kapag natanggap ito. Ang payload ay naglalaman ng mandatory at opsyonal na mga key na kumokontrol sa text, tunog, badge, media attachments at background processing. Ayon sa Apple Developer Documentation, 2026, ang maximum na laki ng payload ay 4096 bytes para sa ordinaryong notification at 5120 bytes para sa VoIP push, na nagpapataw ng mahigpit na limitasyon sa dami ng ipinadalang data.
Mga pangunahing punto
Notification Payload (payload ng notification) — ay isang JSON object na ipinapadala ng server sa APNS (Apple Push Notification Service) para sa paghahatid sa isang iOS device. Ang payload ay naglalaman ng lahat ng data na kailangan ng system para ipakita ang notification: pamagat, text, tunog, badge at metadata para sa background processing. Ang structure ng payload ay mahigpit na kinokontrol ng Apple at may kasamang mandatory key para sa tamang pagproseso ng system.
Kapag nagpadala ang server ng push notification sa pamamagitan ng HTTP/2 API ng APNS, ang request ay naglalaman ng authorization headers at JSON body — ang payload. Sinusuri ng APNS ang validity ng payload: kung ang JSON ay hindi wasto o lumampas sa limitasyon ng laki, ang Apple server ay nagbabalik ng error na 400 Bad Request. Pagkatapos ng validation, inihahatid ng APNS ang payload sa device, kung saan ito ay ini-parse ng iOS system at tinutukoy kung paano poproseso ang notification — magpakita ng banner, magsimula ng background task, o magpatugtog ng tunog.
Ang APNS payload format ay nag-evolve mula sa simpleng text payload sa iOS 2 patungo sa multi-component na JSON structure sa modernong bersyon. iOS 10 ay nagdala ng suporta para sa media attachments sa pamamagitan ng mutable-content, iOS 12 ay nagdagdag ng pagpapangkat ng notification sa pamamagitan ng thread-id, at iOS 15 ay nagpakilala ng supports-live-activities para sa Live Activities. Ngayon, ang payload ay maaaring maglaman ng hanggang 15 iba't ibang key depende sa nais na pag-uugali ng notification.
Ang root object ng payload ay naglalaman ng aps dictionary at opsyonal na custom field sa itaas na antas. Ang aps dictionary ay ang tanging mandatoryong elemento, ngunit sa loob nito ay maaaring may iba't ibang kombinasyon ng key depende sa uri ng notification: alert, badge, sound, content-available, mutable-content, interruption-level at iba pa.
| Aps key | Uri | Layunin |
|---|---|---|
| alert | String o Dictionary | Text ng notification o object na may title, subtitle, body, lokalisasyon |
| badge | Number | Numero sa icon ng app; 0 tinatanggal ang badge |
| sound | String | Pangalan ng audio file o default para sa system sound |
| content-available | Number (1) | Flag para sa background activation; 1 = silent push |
| mutable-content | Number (1) | Flag para sa activation ng Service Extension para sa pagbabago ng content |
| category | String | Identifier ng kategorya para sa mga button at Content Extension |
| thread-id | String | Identifier ng grupo para sa pagpapangkat ng notification |
| interruption-level | String | Antas ng pagkaantala: passive, active, time-sensitive, critical |
| relevance-score | Number (0–1) | Priyoridad ng notification para sa smart ranking system |
Ang alert key ay maaaring isang simpleng string (na nagiging body ng notification) o isang dictionary na may mga field na title, subtitle, body. Ang dictionary format ay nagpapahintulot sa pagtatakda ng pamagat at sub-title nang hiwalay sa pangunahing text. Para sa lokalisadong notification, ginagamit ang mga key na title-loc-key, title-loc-args, loc-key, loc-args na tumutukoy sa Localizable.strings ng app. Ito ay nagpapahintulot sa pagpapadala ng payload nang walang text sa isang partikular na wika — ang app ang naglalagay ng pagsasalin.
Simula sa iOS 15, idinagdag ng Apple ang Focus Mode mechanism na nangangailangan ng developer na tukuyin ang antas ng pagkaantala ng notification. interruption-level ay tumatanggap ng mga halaga: passive (walang tunog, walang paggising ng screen), active (standard na pag-uugali), time-sensitive (tumagos sa focus, nangangailangan ng special entitlement) at critical (medikal/emergency na sitwasyon). Ang key na relevance-score (0–1) ay tumutulong sa Focus system na mag-ranking ng notification sa loob ng isang kategorya.
Ang thread-id key ay pinagsasama ang mga notification sa mga grupo sa Notification Center. Lahat ng notification na may parehong thread-id ay ipinapakita bilang isang grupo na maaaring palawakin ng user. Ito ay lalong kapaki-pakinabang para sa messaging apps, kung saan ang mga mensahe mula sa isang contact ay pinagsama-sama, o para sa mga app na nagpapadala ng maraming notification ng parehong uri.
Custom na field — ay anumang key sa labas ng aps dictionary na idinadagdag ng developer para sa pagpapadala ng karagdagang data sa device. Isinasama ng server ang mga ito sa root JSON object ng payload, at natatanggap ng app ang mga ito sa pamamagitan ng userInfo sa UNNotificationContent. Ang custom na field ay hindi dapat dumoble sa mga pangalan ng key mula sa aps upang maiwasan ang conflict sa pag-parse.
Ang pangunahing limitasyon — ang kabuuang laki ng payload ay hindi dapat lumampas sa 4096 bytes. Ang custom na field ay nakikipagkumpitensya para sa limitasyong ito sa mandatoryong aps key, kaya mahalagang bawasan ang laki ng ipinadalang data. Gumamit ng maiikling pangalan ng key (hal. uid sa halip na user-id), iwasan ang malalaking JSON structure at magpadala lamang ng identifier, hindi kumpletong data object.
Ang custom na field ay nagmumula sa server at hindi dapat pagkatiwalaan nang walang pagsusuri. Palaging i-validate ang mga uri at halaga ng custom na field sa pag-parse: suriin ang pagkakaroon ng key sa pamamagitan ng optional binding, i-convert sa inaasahang uri gamit ang as? String/Int/Dictionary at pangasiwaan ang kaso ng nawawalang halaga. Huwag kailanman gumamit ng force unwrap (!) para sa data mula sa payload — ang server ay maaaring magpadala ng maling data at ang app ay magca-crash.
{
"aps": {
"alert": {
"title": "Bagong mensahe",
"body": "Kamusta! Kumusta ka?"
},
"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"
}
Gumamit ng pare-parehong istilo ng pagpapangalan para sa custom na field sa lahat ng payload ng proyekto. kebab-case (message-type) o camelCase (messageType) — parehong approach ay katanggap-tanggap, ngunit mahalagang sundin ang isa sa loob ng proyekto. Iwasan ang mahabang pangalan: uid sa halip na user-identifier, img sa halip na profile-image-url. Bawat character sa pangalan ng key ay isang byte mula sa limitasyong 4096.
Iba't ibang senaryo ng push notification ay nangangailangan ng iba't ibang kombinasyon ng key sa payload. Tingnan natin ang ilang tipikal na halimbawa: simpleng text notification, notification na may lokalisasyon, Silent Push at Rich Notification na may media attachment.
Basic payload na may text at tunog — minimal na configuration para ipakita ang notification sa user. Alert bilang string ay nagbibigay ng maikling mensahe, sound default ay nagpapatugtog ng standard system sound. Ang badge ay opsyonal at nagtatakda ng counter sa icon. Ang category at thread-id ay idinadagdag para sa pagpapangkat at interaktibidad.
{
"aps": {
"alert": "Paalala: meeting sa 15 minuto",
"badge": 3,
"sound": "default"
}
}
Para sa pagpapadala sa mga device na may iba't ibang wika, gumamit ng lokalisasyon key sa halip na nakapirming text. title-loc-key ay tumutukoy sa isang key sa Localizable.strings ng app, at ang title-loc-args ay nagpapalit ng mga argumento. Ito ay nagpapahintulot sa pagpapadala ng isang payload sa lahat ng device, at ang app mismo ang nagpapakita ng text sa tamang wika.
{
"aps": {
"alert": {
"title-loc-key": "NEW_MESSAGE_TITLE",
"title-loc-args": ["Anna"],
"loc-key": "NEW_MESSAGE_BODY",
"loc-args": ["Kamusta!"]
},
"sound": "message.caf"
}
}
Para sa background synchronization nang hindi nagpapakita ng notification, ginagamit ang content-available: 1 at kawalan ng alert. Ang custom na field ay nagpapahiwatig ng uri ng operasyon at data para sa pagproseso. Ina-activate ng system ang app sa background, tinatawag ang didReceiveRemoteNotification na may fetchCompletionHandler, at ginagawa ng app ang synchronization.
{
"aps": {
"content-available": 1
},
"sync-type": "invalidate-cache",
"timestamp": "2026-07-03T12:00:00Z"
}
Para sa pagpapakita ng media attachment, kailangan ang mutable-content: 1 para i-activate ang Service Extension at URL ng larawan sa custom na field. mutable-content: 1 ay nag-signal sa system na simulan ang UNNotificationServiceExtension, na magda-download ng larawan mula sa URL at idadagdag ito bilang UNNotificationAttachment. Ang category ay tumutukoy sa rehistradong kategorya para sa pagpapakita ng action buttons.
{
"aps": {
"alert": {
"title": "Bagong produkto",
"body": "Tingnan ang bagong koleksyon"
},
"category": "product",
"mutable-content": 1
},
"media-url": "https://cdn.example.com/product.jpg"
}
UNNotificationContent.userInfo ay naglalaman ng kumpletong diksyunaryo ng natanggap na payload pagkatapos ng pagproseso ng system. Ang app ay may access sa payload sa UNUserNotificationCenter delegate kapag nakatanggap ng notification (sa foreground), kapag nag-tap sa notification, at gayundin sa Service Extension at Content Extension. Ang tamang pag-parse ay mandatory para sa pag-extract ng custom na data at pagtukoy ng mga susunod na aksyon.
Kapag nag-tap ang user sa notification, tinatawag ng system ang didReceive response method sa UNUserNotificationCenterDelegate. Sa response.notification.request.content.userInfo ay matatagpuan ang kumpletong payload. Kinukuha ng developer ang custom na field, tinutukoy ang uri ng aksyon (hal. buksan ang chat, pumunta sa produkto) at tinatawag ang kaukulang navigation sa app.
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()
}
Ang Service Extension ay tumatanggap ng payload bago ipakita ang notification at maaari itong baguhin. Validation ng payload — unang hakbang sa didReceive: suriin ang pagkakaroon ng mandatoryong custom na field, kawastuhan ng URL para sa attachment at uri ng data. Kung hindi wasto ang payload, agad na tawagan ang completion handler na may orihinal na content, huwag mag-aksaya ng oras sa walang kwentang pagproseso.
Para sa debugging ng push notification sa produksyon, gumamit ng structured logging ng payload. OSLog ay nagpapahintulot sa pag-log ng payload na may kategoryang notifications at debug level. Sa server side, subaybayan ang APNS response: ang matagumpay na response ay naglalaman ng apns-id para sa pagtutugma sa ipinadalang payload, at ang error na 400 ay nagpapahiwatig ng hindi wastong JSON o labis na laki.
Mga madalas itanong
Ang maximum na laki ng payload — 4096 bytes para sa ordinaryong push notification at 5120 bytes para sa VoIP push (PushKit). Kapag lumampas, ang APNS ay nagbabalik ng error na 400 Bad Request. Ang laki ay kinakalkula sa bytes, hindi sa character — isaalang-alang ang UTF-8 encoding.
Gamitin ang mga key na loc-key, title-loc-key, loc-args at title-loc-args sa loob ng alert. Pinapalitan ng app ang pagsasalin mula sa sarili nitong Localizable.strings batay sa wika ng device. Ito ay nagpapahintulot sa pagpapadala ng isang payload sa lahat ng device anuman ang kanilang wika.
content-available ay nag-a-activate ng app sa background para sa pagproseso ng data (silent push) nang hindi nagpapakita ng notification. mutable-content ay nag-a-activate ng Service Extension para sa pagbabago ng content bago ipakita. Ang parehong key ay maaaring gamitin nang magkasama para sa background processing at kasunod na pagbabago ng notification.
Gamitin ang APNS Sandbox para sa pagsubok at suriin ang HTTP response ng Apple server: 200 OK ay nangangahulugang matagumpay na pagpapadala. Para sa validation ng structure, gumamit ng JSON schema sa CI/CD pipeline. Sa Xcode, magpadala ng test notification sa pamamagitan ng simulator gamit ang command na xcrun simctl push.
apns-id — isang natatanging identifier ng push notification sa APNS system na ibinabalik sa response ng matagumpay na pagpapadala. Ginagamit para sa pagsubaybay ng paghahatid sa pamamagitan ng Logs API at para sa debugging. Dapat i-save ng server ang apns-id para sa bawat ipinadalang notification.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din