Pushizo Docs
Rehberler

iOS critical alert, interruption level ve ses

Bu rehber Pushizo'nun iOS bildirimlerinde desteklediği aps alanlarını, ios_interruption_level (time-sensitive / critical) kullanımını ve ses/hacim davranışını açıklar. Critical alert, Apple'ın yalnızca başvuruyla…

Bu rehber Pushizo'nun iOS bildirimlerinde desteklediği aps alanlarını, ios_interruption_level (time-sensitive / critical) kullanımını ve ses/hacim davranışını açıklar. Critical alert, Apple'ın yalnızca başvuruyla verdiği bir entitlement gerektirir; Pushizo payload'ı üretir, entitlement ve izin uygulama tarafında kalır.

1. Desteklenen iOS alanları

POST /v1/notifications (ve şablon/kampanya içeriği) alanlarının APNs karşılıkları (packages/providers/src/apns.ts buildApnsPayload):

Pushizo alanıAPNsNot
headings, contents, subtitleaps.alert.title, .body, .subtitleAlıcının diline göre çözülür.
ios_soundaps.sound (dize)Verilmezse default. Uygulama paketindeki .caf/.aiff/.wav dosya adı (≤ 30 sn).
ios_badge_type + ios_badge_countaps.badge (SetTo) ya da hs.badge_inc (Increase, NSE uygular)None rozete dokunmaz.
ios_categoryaps.categoryAksiyon düğmeleri (buttons) için SDK UNNotificationCategory kaydeder.
thread_idaps.thread-idGruplama; yoksa android_group kullanılır.
ios_interruption_levelaps.interruption-levelpassive, active, time-sensitive, critical (bkz. §2).
ios_relevance_scoreaps.relevance-score0–1; iOS 15+ özet sıralaması.
target_content_identifieraps.target-content-idSahne seçimi.
ios_attachments, big_picturehs.image → NSE indirirZengin medya için PushizoExtension.
mutable_contentaps.mutable-content: 1Görünür bildirimlerde her zaman 1 gönderilir (NSE: received kaydı, medya, rozet artırma).
content_availableaps.content-available: 1, apns-push-type: background, öncelik 5Sessiz push; alert/sound gönderilmez.
priorityapns-priority10 (varsayılan) anında, 5 güç tasarruflu.
ttlapns-expirationSaniye.
collapse_idapns-collapse-idEn fazla 64 karakter.
dataPayload kök düzeyinde özel anahtarlaraps ve hs dışındaki anahtarlar; event.notification.data ile okunur.

aps.sound her zaman dize olarak yazılır; { "critical": 1, "name": "…", "volume": … } sözlüğü üretilmez (bkz. §3).

2. Interruption level

DeğerDavranışGereksinim
passiveSes/titreşim yok, kilit ekranını uyandırmaz; bildirim listesine eklenir.—
active (varsayılan)Normal bildirim.—
time-sensitiveOdak (Focus) modlarını ve "Zamanlanmış özet"i aşar; ses çalar.Xcode → Signing & Capabilities → Time Sensitive Notifications yeteneği (com.apple.developer.usernotifications.time-sensitive). Kullanıcı Ayarlar'dan uygulama bazında kapatabilir.
criticalSessiz modu ve Rahatsız Etme'yi aşarak ses çalar, ekranı uyandırır.Apple'dan alınan Critical Alerts entitlement'ı (com.apple.developer.usernotifications.critical-alerts) ve kullanıcının critical alert iznini vermiş olması.

Gönderim:

await hs.notifications.create({
  target: { include_external_ids: ['user_42'] },
  headings: { tr: 'Güvenlik uyarısı' },
  contents: { tr: 'Hesabınıza yeni cihazdan giriş yapıldı' },
  ios_interruption_level: 'time-sensitive',
  ios_sound: 'alert.caf',
  thread_id: 'security',
});

ios_interruption_level: 'critical' değeri yalnızca entitlement'ı olan uygulamalara gönderilmelidir; entitlement yoksa APNs isteği reddetmez, ancak cihaz bildirimi normal (active) seviyede gösterir.

3. Critical alert kurulumu ve mevcut davranış

Apple tarafı

  1. Critical alert entitlement başvurusu yapın (sağlık, güvenlik, kamu güvenliği gibi kullanım alanları gerekir).
  2. Onay sonrası App ID'ye Critical Alerts yeteneğini ekleyin; .entitlements dosyasına com.apple.developer.usernotifications.critical-alerts = true.
  3. İzin isteminde .criticalAlert seçeneğini ekleyin. Pushizo iOS SDK'sının Pushizo.Notifications.requestPermission çağrısı [.alert, .badge, .sound] (+ provisionalAuthorization açıksa .provisional) ister; .criticalAlert istemez. Bu nedenle critical alert iznini uygulamanız ayrıca istemelidir:
import UserNotifications

func requestCriticalAlerts() {
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound, .criticalAlert]) { granted, _ in
        // Kullanıcı critical alert iznini ayrı bir anahtarla yönetir (Ayarlar → Bildirimler → uygulama → Kritik Uyarılar)
    }
}

Bu çağrı Pushizo SDK'sının izin takibiyle çelişmez: SDK etkin izni UNUserNotificationCenter.getNotificationSettings üzerinden okur ve abonelik push_capable bilgisini günceller; addPermissionObserver değişikliği bildirir.

Pushizo tarafı (mevcut davranış)

  • ios_interruption_level: "critical" → aps.interruption-level: "critical" yazılır.
  • ios_sound → aps.sound: "<dosya>" (dize). Apple'ın critical alert için tanımladığı aps.sound = { "critical": 1, "name": "…", "volume": 0.0–1.0 } sözlüğü ve dolayısıyla hacim ezmesi (volume) desteklenmez; ses cihaz ayarındaki hacimle çalar. Bu alanlar eklendiğinde MessageContent (packages/db/src/schema/delivery.ts) ve OpenAPI sözleşmesi genişletilecek, mevcut alanlar değişmeyecektir (ekleme kırıcı değildir).
  • Notification Service Extension (PushizoExtension) aps içeriğini mutableCopy ile korur; interruption-level ve sound değerleri NSE'den geçerken değişmez. NSE bir bildirimi critical seviyeye yükseltemez (bu yalnızca payload + entitlement ile mümkündür).
  • Critical ve time-sensitive seviyeler sessiz saatler ve frekans sınırından otomatik muaf değildir; işlemsel/kritik mesajlarda quiet_hours_exempt: true ve frequency_cap_exempt: true alanlarını birlikte gönderin.

4. Ses

  • ios_sound: uygulama paketindeki özel ses (alert.caf); default sistem sesi. Dosya bulunamazsa iOS varsayılan sesi çalar.
  • Sessiz push (content_available: true) ses göndermez.
  • Android'de karşılık android_sound (res/raw/<ad>), ya da Dashboard → Ayarlar → Android bildirim kategorileri içindeki kanal sesi (android_channel_id). Android 8+ sesi kanal belirler; mesaj başına ses yalnızca kanal yoksa uygulanır.
  • Web'de ses tarayıcı/işletim sistemi ayarıdır; mesaj alanı yoktur.

5. Doğrulama

  1. Test cihazında (gerçek cihaz; simülatörde APNs yoktur) uygulamayı sandbox ortamıyla çalıştırın, Dashboard → Kanallar → iOS Push ortamının eşleştiğini doğrulayın (BadDeviceToken ortam uyumsuzluğudur).
  2. Cihazı Rahatsız Etme'ye alın; time-sensitive mesaj gelmeli, active mesaj özette kalmalıdır.
  3. Critical alert entitlement'ı olan uygulamada cihazı sessize alıp ios_interruption_level: "critical" gönderin; ses çalmalıdır. Entitlement yoksa bildirim normal seviyede gelir, bu beklenen davranıştır.
  4. Mesaj İzleme'de sent → received → opened zaman çizelgesi; received kaydı NSE tarafından yapılır (PushizoExtension eklenmemişse yalnızca opened görünür).

Bu sayfada