Notification Payload — vad är det, JSON-struktur och tolkning

Författare: IT Sectr Publicerad: 2026-03-20 Lästid: 10 min

Notification Payload — är den JSON-struktur som servern skickar via APNS till en iOS-enhet, som bestämmer innehållet i push-meddelandet och beteendet vid mottagning. Payloaden innehåller obligatoriska och valfria nycklar som styr text, ljud, badge, media-bilagor och bakgrundsbearbetning. Enligt Apple Developer Documentation, 2026 är den maximala payload-storleken 4096 byte för vanliga meddelanden och 5120 byte för VoIP-push, vilket innebär strikta begränsningar för mängden data som överförs.

Huvudpunkter

  • aps-struktur — obligatorisk ordbok med nycklarna alert, badge, sound och content-available, som bestämmer meddelandets visuella och ljudmässiga beteende.
  • Storleksbegränsning — maximal payload-storlek 4096 byte för APNS och 5120 byte för VoIP-push, allt större avvisas av Apples server.
  • Anpassade fält — alla ytterligare data överförs på samma nivå som aps och är tillgängliga i userInfo efter mottagning av meddelandet.
  • Lokalisering av alert — nycklarna title-loc-key, loc-key och loc-args gör det möjligt att visa lokaliserad text utan att skicka olika payloads för varje språk.
  • Request-identifier — anpassad identifierare i APNS-svaret för att spåra leveransstatus och callbacks från Apples server.

Vad är Notification Payload

Notification Payload (meddelandets payload) — är ett JSON-objekt som servern skickar till APNS (Apple Push Notification Service) för leverans till en iOS-enhet. Payloaden innehåller all data som systemet behöver för att visa meddelandet: titel, text, ljud, badge och metadata för bakgrundsbearbetning. Payload-strukturen är strikt reglerad av Apple och innehåller obligatoriska nycklar för korrekt bearbetning av systemet.

Payloadens roll vid push-leverans

När servern skickar ett push-meddelande via HTTP/2 API APNS, innehåller begäran auktoriseringshuvuden och en JSON-kropp — payloaden. APNS kontrollerar payloadens giltighet: om JSON är felaktig eller överskrider storleksgränsen returnerar Apples server ett 400 Bad Request-fel. Efter validering levererar APNS payloaden till enheten, där iOS-systemet tolkar den och bestämmer hur meddelandet ska bearbetas — visa en banner, starta en bakgrundsuppgift eller spela upp ett ljud.

Evolution av payload-formatet

APNS-payload-formatet har utvecklats från en enkel text-payload i iOS 2 till en flerkomponents JSON-struktur i moderna versioner. iOS 10 introducerade stöd för media-bilagor via mutable-content, iOS 12 lade till gruppering av meddelanden via thread-id, och iOS 15 introducerade supports-live-activities för Live Activities. Idag kan payloaden innehålla upp till 15 olika nycklar beroende på meddelandets önskade beteende.

Struktur för APNS-payload: obligatoriska och valfria nycklar

Rotobjektet för payloaden innehåller aps-ordboken och valfria anpassade fält på den översta nivån. aps-ordboken är det enda obligatoriska elementet, men inuti den kan det finnas olika kombinationer av nycklar beroende på meddelandetyp: alert, badge, sound, content-available, mutable-content, interruption-level och andra.

aps-nyckelTypSyfte
alertString eller DictionaryMeddelandetext eller objekt med title, subtitle, body, lokalisering
badgeNumberNummer på app-ikonen; 0 tar bort badge
soundStringNamn på ljudfil eller default för systemljud
content-availableNumber (1)Flagg för bakgrundsaktivering; 1 = silent push
mutable-contentNumber (1)Flagg för aktivering av Service Extension för att ändra innehåll
categoryStringKategori-identifierare för knappar och Content Extension
thread-idStringGrupp-identifierare för gruppering av meddelanden
interruption-levelStringAvbrottsnivå: passive, active, time-sensitive, critical
relevance-scoreNumber (0–1)Prioritet för meddelandet för det smarta rankningssystemet

Alert-nyckeln: sträng- och ordboksformat

Alert-nyckeln kan vara en enkel sträng (som blir meddelandets brödtext) eller en ordbok med fälten title, subtitle, body. Ordboksformatet gör det möjligt att ange titel och undertitel separat från huvudtexten. För lokaliserade meddelanden används nycklarna title-loc-key, title-loc-args, loc-key, loc-args som refererar till applikationens Localizable.strings. Detta gör det möjligt att skicka en payload utan text på ett specifikt språk — applikationen lägger till översättningen.

Hantering av avbrott: interruption-level och relevance-score

Från och med iOS 15 lade Apple till Focus Mode-mekanismen som kräver att utvecklaren anger meddelandets avbrottsnivå. interruption-level accepterar värdena: passive (utan ljud, utan att väcka skärmen), active (standardbeteende), time-sensitive (genomtränger fokus, kräver special entitlement) och critical (medicinska/nödsituationer). relevance-score (0–1) hjälper Focus-systemet att rangordna meddelanden inom en kategori.

Gruppering av meddelanden via thread-id

thread-id-nyckeln sammanfogar meddelanden i grupper i Notification Center. Alla meddelanden med samma thread-id visas som en grupp som användaren kan expandera. Detta är särskilt användbart för meddelandeappar, där meddelanden från en kontakt grupperas tillsammans, eller för appar som skickar många meddelanden av samma typ.

Anpassade fält och dataöverföring

Anpassade fält — är alla nycklar utanför aps-ordboken som utvecklaren lägger till för att överföra ytterligare data till enheten. Servern inkluderar dem i payloadens rot-JSON-objekt, och applikationen tar emot dem via userInfo i UNNotificationContent. Anpassade fält bör inte duplicera nyckelnamn från aps för att undvika konflikter vid tolkning.

Begränsningar för anpassad data

Huvudbegränsningen — den totala payload-storleken får inte överstiga 4096 byte. Anpassade fält konkurrerar om denna gräns med de obligatoriska aps-nycklarna, så det är viktigt att minimera mängden överförd data. Använd korta nyckelnamn (t.ex. uid istället för user-id), undvik stora JSON-strukturer och skicka endast identifierare, inte fullständiga dataobjekt.

Säkerhet och validering av anpassade fält

Anpassade fält kommer från servern och bör inte litas på utan kontroll. Validera alltid typer och värden för anpassade fält vid tolkning: kontrollera nyckelns närvaro via optional binding, konvertera till förväntad typ med as? String/Int/Dictionary och hantera fallet med saknat värde. Använd aldrig force unwrap (!) för data från payloaden — servern kan skicka felaktig data och applikationen kommer att krascha.

json
{
    "aps": {
        "alert": {
            "title": "Nytt meddelande",
            "body": "Hej! Hur mår du?"
        },
        "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"
}

Rekommendationer för namngivning av anpassade fält

Använd en enhetlig namngivningsstil för anpassade fält i alla projektets payloads. kebab-case (message-type) eller camelCase (messageType) — båda metoderna är acceptabla, men det är viktigt att hålla sig till en inom projektet. Undvik långa namn: uid istället för user-identifier, img istället för profile-image-url. Varje tecken i nyckelnamnet är en byte från gränsen på 4096.

Exempel på payloads för olika meddelandetyper

Olika scenarier för push-meddelanden kräver olika kombinationer av nycklar i payloaden. Låt oss titta på några typiska exempel: ett enkelt textmeddelande, ett meddelande med lokalisering, Silent Push och Rich Notification med media-bilaga.

Enkelt textmeddelande

Grundläggande payload med text och ljud — minimal konfiguration för att visa ett meddelande för användaren. Alert som sträng ger ett kort meddelande, sound default spelar upp standard systemljud. Badge är valfritt och sätter en räknare på ikonen. category och thread-id läggs till för gruppering och interaktivitet.

json
{
    "aps": {
        "alert": "Påminnelse: möte om 15 minuter",
        "badge": 3,
        "sound": "default"
    }
}

Meddelande med lokalisering

För sändning till enheter med olika språk, använd lokaliseringsnycklar istället för fast text. title-loc-key refererar till en nyckel i applikationens Localizable.strings, och title-loc-args ersätter argumenten. Detta gör det möjligt att skicka en payload till alla enheter, och applikationen visar texten på rätt språk.

json
{
    "aps": {
        "alert": {
            "title-loc-key": "NEW_MESSAGE_TITLE",
            "title-loc-args": ["Anna"],
            "loc-key": "NEW_MESSAGE_BODY",
            "loc-args": ["Hej!"]
        },
        "sound": "message.caf"
    }
}

Silent Push med bakgrundssynkronisering

För bakgrundssynkronisering utan att visa meddelandet används content-available: 1 och frånvaro av alert. Anpassade fält anger operationstyp och data för bearbetning. Systemet aktiverar applikationen i bakgrunden, anropar didReceiveRemoteNotification med fetchCompletionHandler, och applikationen utför synkroniseringen.

json
{
    "aps": {
        "content-available": 1
    },
    "sync-type": "invalidate-cache",
    "timestamp": "2026-07-03T12:00:00Z"
}

Rich Notification med bild

För att visa en media-bilaga krävs mutable-content: 1 för att aktivera Service Extension och bildens URL i ett anpassat fält. mutable-content: 1 signalerar systemet att starta UNNotificationServiceExtension, som laddar ner bilden från URL:en och lägger till den som UNNotificationAttachment. category pekar på en registrerad kategori för att visa åtgärdsknappar.

json
{
    "aps": {
        "alert": {
            "title": "Ny produkt",
            "body": "Se den nya kollektionen"
        },
        "category": "product",
        "mutable-content": 1
    },
    "media-url": "https://cdn.example.com/product.jpg"
}

Bearbetning och tolkning av payload i applikationen

UNNotificationContent.userInfo innehåller den fullständiga ordboken för den mottagna payloaden efter bearbetning av systemet. Applikationen får åtkomst till payloaden i UNUserNotificationCenter-delegaten vid mottagning av meddelandet (i förgrunden), vid tryck på meddelandet, samt i Service Extension och Content Extension. Korrekt tolkning är obligatorisk för att extrahera anpassad data och bestämma fortsatta åtgärder.

Tolkning i AppDelegate vid tryck på meddelande

När användaren trycker på ett meddelande anropar systemet metoden didReceive response i UNUserNotificationCenterDelegate. I response.notification.request.content.userInfo finns den fullständiga payloaden. Utvecklaren extraherar anpassade fält, bestämmer åtgärdstyp (t.ex. öppna chatten, gå till produkt) och anropar motsvarande navigering i applikationen.

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

Validering av payload i Service Extension

Service Extension tar emot payloaden innan meddelandet visas och kan ändra den. Validering av payload — första steget i didReceive: kontrollera förekomsten av obligatoriska anpassade fält, korrektheten av URL:en för bilagor och datatypen. Om payloaden är ogiltig, anropa omedelbart completion handler med originalinnehållet, slösa inte tid på meningslös bearbetning.

Loggning och övervakning av payloads

För felsökning av push-meddelanden i produktion, använd strukturerad loggning av payloads. OSLog gör det möjligt att logga payloaden med kategorin notifications och debug-nivå. På serversidan, spåra APNS-svar: ett lyckat svar innehåller apns-id för matchning med den skickade payloaden, och ett 400-fel indikerar ogiltig JSON eller storleksöverskridning.

Vanliga frågor

Vilken är den maximala storleken för en APNS-payload?

Den maximala payload-storleken — 4096 byte för vanliga push-meddelanden och 5120 byte för VoIP-push (PushKit). Vid överskridning returnerar APNS ett 400 Bad Request-fel. Storleken beräknas i byte, inte i tecken — ta hänsyn till UTF-8-kodning.

Hur skickar jag ett lokaliserat meddelande på flera språk?

Använd nycklarna loc-key, title-loc-key, loc-args och title-loc-args inuti alert. Applikationen lägger till översättningen från sin Localizable.strings baserat på enhetens språk. Detta gör det möjligt att skicka en payload till alla enheter oavsett deras språk.

Vad är skillnaden mellan content-available och mutable-content?

content-available aktiverar applikationen i bakgrunden för databearbetning (silent push) utan att visa meddelandet. mutable-content aktiverar Service Extension för att ändra innehållet innan det visas. Båda nycklarna kan användas tillsammans för bakgrundsbearbetning och efterföljande ändring av meddelandet.

Hur kontrollerar jag att servern har skickat en korrekt payload?

Använd APNS Sandbox för testning och kontrollera Apples servers HTTP-svar: 200 OK betyder lyckad sändning. För strukturvalidering, använd JSON-scheman i CI/CD-pipelinen. I Xcode, skicka testmeddelanden via simulatorn med kommandot xcrun simctl push.

Vad är apns-id i Apples servers svar?

apns-id — en unik identifierare för push-meddelandet i APNS-systemet som returneras i svaret på en lyckad sändning. Används för att spåra leverans via Logs API och för felsökning. Servern bör spara apns-id för varje skickat meddelande.

Sammanfattning

  • Notification Payload — JSON-struktur för push-meddelande med obligatorisk aps-ordbok, som bestämmer text, ljud, badge och bakgrundsbearbetning.
  • Storleksbegränsning — 4096 byte för APNS, 5120 byte för VoIP; överskridning returnerar 400 Bad Request från Apples server.
  • aps-ordboken innehåller nycklarna alert, badge, sound, content-available, mutable-content, category, thread-id, interruption-level och relevance-score.
  • Anpassade fält överförs utanför aps och extraheras via userInfo; validera alltid typer och värden vid tolkning.
  • Lokalisering realiseras via loc-key och title-loc-key, som refererar till applikationens Localizable.strings för att lägga till översättning.
  • interruption-level hanterar meddelandets beteende i Focus-läge: passive, active, time-sensitive eller critical.
  • Notification Payload — grunden för hela push-meddelandesystemet, vars korrekthet avgör leverans, visning och bearbetning av varje meddelande på enheten.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också