Notification Payload, sunucunun APNS aracılığıyla bir iOS cihazına gönderdiği, push bildiriminin içeriğini ve alındığındaki davranışı tanımlayan JSON yapısıdır. Payload, metin, ses, rozet, medya ekleri ve arka plan işlemesini kontrol eden zorunlu ve isteğe bağlı anahtarlar içerir. Apple Developer Documentation, 2026’ya göre, normal bildirimler için maksimum payload boyutu 4096 bayt, VoIP push için 5120 bayt olup, aktarılan veri miktarına katı sınırlamalar getirir.
Önemli Noktalar
Notification Payload, sunucunun APNS’ye (Apple Push Notification Service) bir iOS cihazına teslim edilmek üzere gönderdiği JSON nesnesidir. Payload, sistemin bildirimi görüntülemek için ihtiyaç duyduğu tüm verileri içerir: başlık, metin, ses, rozet ve arka plan işleme için meta veriler. Payload yapısı Apple tarafından sıkı bir şekilde düzenlenir ve sistem tarafından doğru işlenmesi için zorunlu anahtarlar içerir.
Sunucu, APNS HTTP/2 API aracılığıyla bir push bildirimi gönderdiğinde, istek yetkilendirme başlıkları ve bir JSON gövdesi — payload içerir. APNS, payload’ı doğrular: JSON geçersizse veya boyut sınırını aşarsa, Apple sunucusu 400 Bad Request hatası döndürür. Doğrulamadan sonra APNS, payload’ı cihaza teslim eder, iOS bunu ayrıştırır ve bildirimin nasıl işleneceğini belirler — bir banner gösterme, arka plan görevi çalıştırma veya ses çalma.
APNS payload formatı, iOS 2’deki basit metin payload’ından modern sürümlerde çok bileşenli JSON yapısına evrilmiştir. iOS 10, mutable-content aracılığıyla medya ekleri desteğini getirdi, iOS 12 thread-id ile bildirim gruplamayı ekledi ve iOS 15, Live Activities için supports-live-activities’i tanıttı. Günümüzde bir payload, istenen bildirim davranışına bağlı olarak 15 farklı anahtar içerebilir.
Kök nesne, bir aps sözlüğü ve üst düzeyde isteğe bağlı özel alanlar içerir. aps sözlüğü tek zorunlu öğedir, ancak içinde bildirim türüne bağlı olarak çeşitli anahtar kombinasyonları bulunabilir: alert, badge, sound, content-available, mutable-content, interruption-level ve diğerleri.
| aps Anahtarı | Tür | Amaç |
|---|---|---|
| alert | String veya Dictionary | Bildirim metni veya title, subtitle, body ve yerelleştirme içeren nesne |
| badge | Number | Uygulama simgesindeki sayı; 0 rozeti kaldırır |
| sound | String | Ses dosyası adı veya sistem sesi için default |
| content-available | Number (1) | Arka plan etkinleştirme bayrağı; 1 = sessiz push |
| mutable-content | Number (1) | İçerik değişikliği için Service Extension’ı etkinleştirme bayrağı |
| category | String | Düğmeler ve Content Extension için kategori tanımlayıcısı |
| thread-id | String | Bildirim gruplama için grup tanımlayıcısı |
| interruption-level | String | Kesinti düzeyi: passive, active, time-sensitive, critical |
| relevance-score | Number (0–1) | Akıllı sıralama sistemi için bildirim önceliği |
alert anahtarı, basit bir dize (bildirim gövdesi haline gelir) veya title, subtitle ve body alanlarına sahip bir sözlük olabilir. Sözlük formatı, başlık ve alt başlığı ana metinden ayrı olarak ayarlamaya olanak tanır. Yerelleştirilmiş bildirimler için, uygulamanın Localizable.strings dosyasına başvuran title-loc-key, title-loc-args, loc-key ve loc-args anahtarları kullanılır. Bu, belirli bir dilde metin olmadan payload göndermeye olanak tanır — uygulama çeviriyi değiştirir.
iOS 15’ten itibaren Apple, geliştiricinin bildirimin kesinti düzeyini belirtmesini gerektiren Focus Mode mekanizmasını tanıttı. interruption-level şu değerleri alır: passive (ses yok, ekran uyandırma yok), active (standart davranış), time-sensitive (Focus’u deler, özel yetki gerektirir) ve critical (tıbbi/acil durumlar). relevance-score (0–1) anahtarı, Focus sisteminin aynı kategorideki bildirimleri sıralamasına yardımcı olur.
thread-id anahtarı, Bildirim Merkezi’nde bildirimleri gruplar. Aynı thread-id’ye sahip tüm bildirimler, kullanıcının genişletebileceği tek bir grup olarak görüntülenir. Bu, özellikle bir kişiden gelen mesajların bir arada gruplandığı mesajlaşma uygulamaları veya aynı türden birçok bildirim gönderen uygulamalar için kullanışlıdır.
Özel alanlar, geliştiricinin cihaza ek veri iletmek için aps sözlüğünün dışına eklediği anahtarlardır. Sunucu bunları payload’ın kök JSON nesnesine dahil eder ve uygulama bunları UNNotificationContent içindeki userInfo aracılığıyla alır. Özel alanlar, ayrıştırma sırasında çakışmaları önlemek için aps anahtar adlarını kopyalamamalıdır.
Ana sınırlama, toplam payload boyutunun 4096 baytı aşmaması gerektiğidir. Özel alanlar bu sınır için zorunlu aps anahtarlarıyla rekabet eder, bu nedenle iletilen verinin boyutunu en aza indirmek önemlidir. Kısa anahtar adları kullanın (örneğin, “uid” yerine “user-id” yerine), büyük JSON yapılarından kaçının ve tam veri nesneleri yerine yalnızca tanımlayıcıları iletin.
Özel alanlar sunucudan gelir ve doğrulama yapılmadan güvenilmemelidir. Ayrıştırma sırasında her zaman özel alanların türlerini ve değerlerini doğrulayın: isteğe bağlı bağlama ile anahtar varlığını kontrol edin, as? String/Int/Dictionary ile beklenen türe dönüştürün ve değer yokluğu durumunu ele alın. Payload’dan gelen veriler için asla force unwrap (!) kullanmayın — sunucu geçersiz veri gönderebilir ve uygulama çökebilir.
{
"aps": {
"alert": {
"title": "Yeni mesaj",
"body": "Merhaba! Nasılsın?"
},
"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"
}
Projedeki tüm payload’larda özel alanlar için tutarlı bir adlandırma stili kullanın. kebab-case (message-type) veya camelCase (messageType) — her iki yaklaşım da kabul edilebilir, ancak proje içinde tutarlılık önemlidir. Uzun adlardan kaçının: “uid” yerine “user-identifier” yerine, “img” yerine “profile-image-url” yerine. Anahtar adındaki her karakter, 4096 sınırının bir baytını tüketir.
Farklı senaryolardaki push bildirimleri, payload’da farklı anahtar kombinasyonları gerektirir. Birkaç tipik örneği inceleyelim: basit metin bildirimi, yerelleştirilmiş bildirim, Sessiz Push ve medya ekiyle Zengin Bildirim.
Metin ve ses içeren temel bir payload — kullanıcıya bir bildirim görüntülemek için minimum yapılandırma. Dize olarak Alert kısa bir mesaj sağlar, sound default varsayılan sistem sesini çalar. Badge isteğe bağlıdır ve uygulama simgesindeki sayacı ayarlar. category ve thread-id gruplama ve etkileşim için eklenir.
{
"aps": {
"alert": "Hatırlatıcı: 15 dakika içinde toplantı",
"badge": 3,
"sound": "default"
}
}
Farklı dillerdeki cihazlara bildirim göndermek için, sabit kodlanmış metin yerine yerelleştirme anahtarlarını kullanın. title-loc-key, uygulamanın Localizable.strings dosyasındaki bir anahtara başvurur ve title-loc-args argümanları sağlar. Bu, tüm cihazlara tek bir payload göndermeye olanak tanır ve uygulama metni uygun dilde görüntüler.
{
"aps": {
"alert": {
"title-loc-key": "NEW_MESSAGE_TITLE",
"title-loc-args": ["Anna"],
"loc-key": "NEW_MESSAGE_BODY",
"loc-args": ["Merhaba!"]
},
"sound": "message.caf"
}
}
Bildirim göstermeden arka plan senkronizasyonu için, alert olmadan content-available: 1 kullanın. Özel alanlar, işlem türünü ve işlenecek verileri belirtir. Sistem, uygulamayı arka planda etkinleştirir, fetchCompletionHandler ile didReceiveRemoteNotification’ı çağırır ve uygulama senkronizasyonu gerçekleştirir.
{
"aps": {
"content-available": 1
},
"sync-type": "invalidate-cache",
"timestamp": "2026-07-03T12:00:00Z"
}
Bir medya eki görüntülemek için, Service Extension’ı etkinleştirmek üzere mutable-content: 1 ve özel bir alanda bir görsel URL’si gereklidir. mutable-content: 1, sisteme UNNotificationServiceExtension’ı başlatması için sinyal gönderir, URL’den görseli indirir ve UNNotificationAttachment olarak ekler. category anahtarı, eylem düğmelerini görüntülemek için kayıtlı bir kategori belirtir.
{
"aps": {
"alert": {
"title": "Yeni ürün",
"body": "Yeni koleksiyona göz atın"
},
"category": "product",
"mutable-content": 1
},
"media-url": "https://cdn.example.com/product.jpg"
}
UNNotificationContent.userInfo, sistem işlemesinden sonra alınan payload’ın tam sözlüğünü içerir. Uygulama, bir bildirim alındığında (ön planda), bir bildirime dokunulduğunda ve ayrıca Service Extension ve Content Extension’da UNUserNotificationCenter temsilcisinde payload’a erişir. Özel verileri çıkarmak ve sonraki eylemleri belirlemek için doğru ayrıştırma şarttır.
Kullanıcı bir bildirime dokunduğunda, sistem UNUserNotificationCenterDelegate’te didReceive response yöntemini çağırır. response.notification.request.content.userInfo tam payload’ı içerir. Geliştirici özel alanları çıkarır, eylem türünü belirler (örneğin, bir sohbet açma, bir ürüne gitme) ve uygulamada ilgili navigasyonu tetikler.
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, bildirim görüntülenmeden önce payload’ı alır ve değiştirebilir. Payload doğrulaması, didReceive’daki ilk adımdır: zorunlu özel alanları kontrol edin, ek URL’sini doğrulayın ve veri türlerini kontrol edin. Payload geçersizse, gereksiz işleme zaman harcamamak için hemen orijinal içerikle completion handler’ı çağırın.
Üretimde push bildirimlerinde hata ayıklamak için, yapılandırılmış payload günlükleme kullanın. OSLog, debug düzeyinde “notifications” kategorisiyle payload’ı günlüklemeye olanak tanır. Sunucu tarafında APNS yanıtlarını izleyin: başarılı bir yanıt, gönderilen payload ile eşleştirme için apns-id içerirken, 400 hatası geçersiz JSON veya boyut aşımını belirtir.
Sıkça Sorulan Sorular
Maksimum payload boyutu, normal push bildirimleri için 4096 bayt ve VoIP push (PushKit) için 5120 bayttır. Bu sınır aşıldığında APNS 400 Bad Request hatası döndürür. Boyut, karakter değil bayt cinsinden hesaplanır — UTF-8 kodlamasını göz önünde bulundurun.
alert içinde loc-key, title-loc-key, loc-args ve title-loc-args anahtarlarını kullanın. Uygulama, cihaz diline bağlı olarak Localizable.strings dosyasından çeviriyi değiştirir. Bu, dillerinden bağımsız olarak tüm cihazlara tek bir payload göndermeye olanak tanır.
content-available, bildirim göstermeden veri işleme (sessiz push) için uygulamayı arka planda etkinleştirir. mutable-content, görüntülemeden önce içeriği değiştirmek için Service Extension’ı etkinleştirir. Her iki anahtar, arka plan işleme ve ardından bildirim değişikliği için birlikte kullanılabilir.
Test için APNS Sandbox’ı kullanın ve Apple sunucusunun HTTP yanıtını kontrol edin: 200 OK başarılı teslimat anlamına gelir. Yapı doğrulaması için CI/CD hattınızda JSON şeması kullanın. Xcode’da, xcrun simctl push ile simülatör üzerinden test bildirimleri gönderin.
apns-id, APNS sisteminde benzersiz bir push bildirimi tanımlayıcısıdır ve başarılı teslimatta yanıt içinde döndürülür. Logs API aracılığıyla teslimatı izlemek ve hata ayıklamak için kullanılır. Sunucu, gönderilen her bildirim için apns-id’yi saklamalıdır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun