İçerik
Bir bildirimin içeriği dil → metin haritası artı _default işaretçisidir:
{
"en": {
"title": "Weekend flash sale ⚡",
"body": "{{firstName|there}}, 30% off everything until Sunday night.",
"image": "https://cdn.acme.example/push/weekend.jpg",
"url": "acme://sale/weekend",
"actions": [
{ "id": "shop", "title": "Shop now" },
{ "id": "later", "title": "Remind me later", "url": "acme://remind?sale=weekend" }
]
},
"tr": { "title": "Hafta sonu indirimi ⚡", "body": "…", "url": "acme://sale/weekend" },
"_default": "en"
}
Dil çözümleme
Her abone için worker sırayla seçer:
- tam
language(en-GB), - tabanı (
en), _default.
_default, haritada var olan bir dili adlandırmalıdır. Anahtarlar BCP 47 benzeridir (tr, en, en-GB).
Alanlar
| Alan | Sınırlar | Notlar |
|---|---|---|
title | 1–200 karakter | Zorunlu. Yer tutucu serbest. |
body | 1–1000 karakter | Zorunlu. Yer tutucu serbest. |
image | URL | HTTPS. Android büyük görsel, web image, iOS NSE ile ek. iOS kilit ekranı önizlemesinde görünmez. |
url | ≤ 2048 | Dokununca açılan derin bağlantı ya da URL. Yer tutucu serbest. |
actions | ≤ 3, benzersiz id ^[a-z0-9_-]{1,32}$, başlık ≤ 40 | Butonlar. url o buton için bildiriminkini geçersiz kılar. |
Sihirbazdaki taslaklar, otomatik kayıt metin kaybetmesin diye daha gevşek bir şemayla tutulur (boş alanlara izin); yukarıdaki katı kurallar gönderim anında geçerlidir.
Görünüm
presentation altındaki dilden bağımsız seçenekler:
| Alan | iOS | Android | Web |
|---|---|---|---|
sound | aps.sound ("default" ya da uygulama paketindeki dosya); "none" → anahtar yok = sessiz | data.sound → SDK'nın kanalı/setSilent | "none" için silent: true |
badge | aps.badge | setNumber | badgeCount (Badging API) |
threadId | aps.thread-id (Bildirim Merkezi'nde gruplar) | bildirim grup anahtarı | — |
icon | — | görsel yoksa büyük simge | bildirim icon |
interruptionLevel | aps.interruption-level: passive, active (varsayılan), time-sensitive, critical | — | — |
relevanceScore | aps.relevance-score, 0–1, bildirim özetindeki sırayı belirler | — | — |
channelId | — | SDK'nın post edeceği Android kanalı | — |
Bir platformun gösteremediği, o platformun transport'u tarafından yok sayılır.
Kesinti düzeyi push'un Odak modunu (time-sensitive, uygulamada Time Sensitive Notifications yeteneği gerekir) ya da sessiz modu (critical, Apple'dan entitlement gerekir) aşmasını sağlar. Sunucu değeri geçirir, entitlement'ı denetlemez; yoksa iOS active'e düşürür. passive ses ve banner olmadan listeye düşer.
Android kanalları panelde bir kez tanımlanır ve push ilk kez bir kanalı adlandırdığında SDK onu cihazda yaratır; yeni bir kanal için uygulama sürümü gerekmez. Cihazda olmayan ve push'un tarif etmediği kanal SDK'nın varsayılan kanalına düşer.
Sessiz push
Kampanya, bildirim ya da şablonda silent: true bir arka plan push'u gönderir: hiçbir şey çizilmez, uygulama kısa süreliğine uyandırılır ve data'yı alır.
| Platform | Ne gider | SDK ne yapar |
|---|---|---|
| iOS | apns-push-type: background, öncelik 5, aps: { "content-available": 1 } — alert, ses ya da mutable-content yok (Apple bunlardan birini taşıyan arka plan push'unu atar) | didReceiveBackground(userInfo:) delivered bildirir ve onReceive'i message.silent == true ile çağırır |
| Android | her zamanki veri mesajı, silent: "1" ile | hiçbir şey çizmez, onReceive'i çağırır |
| Web | fan-out'ta atlanır — tarayıcı bir şey göstermeden push alamaz | — |
Sessiz kampanyada content gerekmez; data mesajın tamamıdır (sihirbazdaki Veri kartı). iOS uygulamaya yaklaşık 30 saniye verir ve çok gönderen uygulamaları kısar — saatte birkaç adet güvenlidir, dakikada birkaç adet değildir. Sessiz kampanyada A/B testi yoktur.
Data yükü
data, dokunulmadan taşınan ve onOpen handler'ınıza message.data olarak ulaşan düz string → string haritasıdır (en çok 64 karakterlik anahtar, 1024 karakterlik değer). Yönlendirme için kullanın (screen, id'ler). Düzdür çünkü FCM data'da başka bir şeye izin vermez.
Platform çizim özeti
| Özellik | iOS | Android | Chrome/Edge | Firefox | Safari (mac/iOS) |
|---|---|---|---|---|---|
| Başlık / gövde | ✅ | ✅ | ✅ | ✅ | ✅ |
| Görsel | ✅ (NSE) | ✅ | ✅ | ✅ | ❌ |
| Butonlar | ✅ ≤4 (NSE) | ✅ ≤3 | ✅ ≤2 | ✅ | ❌ |
| Ses | ✅ | ✅ | sistem | sistem | sistem |
| Rozet | ✅ | ✅ | ✅ PWA | ❌ | ✅ PWA |
| Grup / thread | ✅ | ✅ | tag ile | tag ile | ❌ |
Sessiz ses (sound: "none") | ✅ | ✅ | ✅ | ✅ | ❌ |
Arka plan (silent: true) | ✅ | ✅ | atlanır | atlanır | atlanır |
| Kesinti düzeyi | ✅ iOS 15+ | — | — | — | — |
| Kanallar | — | ✅ Android 8+ | — | — | — |
Boyut
Web push yükleri şifrelenir ve push servisleri tarafından 4 KB ile sınırlanır (kullanılan kayıt boyutuyla 3 993 bayt düz metin). APNs 4 KB, FCM 4 KB data izin verir. Sihirbazın bayt ölçeri en büyük dili gösterir. data'yı küçük tutun; daha çok eklemeniz gerekiyorsa id gönderip açılınca çekin.
Emoji ve Unicode
Uçtan uca UTF-8. Başlık ve gövdede emoji tüm platformlarda sorunsuz; sayımlar bayt değil karakterdir.