PushizoDocs
Kanallar

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',
});
```text

`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](https://developer.apple.com/contact/request/notifications-critical-alerts-entitlement/) 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:

```swift
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)
    }
}
```text

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