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ı | APNs | Not |
|---|---|---|
headings, contents, subtitle | aps.alert.title, .body, .subtitle | Alıcının diline göre çözülür. |
ios_sound | aps.sound (dize) | Verilmezse default. Uygulama paketindeki .caf/.aiff/.wav dosya adı (≤ 30 sn). |
ios_badge_type + ios_badge_count | aps.badge (SetTo) ya da hs.badge_inc (Increase, NSE uygular) | None rozete dokunmaz. |
ios_category | aps.category | Aksiyon düğmeleri (buttons) için SDK UNNotificationCategory kaydeder. |
thread_id | aps.thread-id | Gruplama; yoksa android_group kullanılır. |
ios_interruption_level | aps.interruption-level | passive, active, time-sensitive, critical (bkz. §2). |
ios_relevance_score | aps.relevance-score | 0–1; iOS 15+ özet sıralaması. |
target_content_identifier | aps.target-content-id | Sahne seçimi. |
ios_attachments, big_picture | hs.image → NSE indirir | Zengin medya için PushizoExtension. |
mutable_content | aps.mutable-content: 1 | Görünür bildirimlerde her zaman 1 gönderilir (NSE: received kaydı, medya, rozet artırma). |
content_available | aps.content-available: 1, apns-push-type: background, öncelik 5 | Sessiz push; alert/sound gönderilmez. |
priority | apns-priority | 10 (varsayılan) anında, 5 güç tasarruflu. |
ttl | apns-expiration | Saniye. |
collapse_id | apns-collapse-id | En fazla 64 karakter. |
data | Payload kök düzeyinde özel anahtarlar | aps 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ğer | Davranış | Gereksinim |
|---|---|---|
passive | Ses/titreşim yok, kilit ekranını uyandırmaz; bildirim listesine eklenir. | — |
active (varsayılan) | Normal bildirim. | — |
time-sensitive | Odak (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. |
critical | Sessiz 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).iOS Safari (16.4+) web push ve PWA
iOS 16.4 ve sonrasında Safari, ana ekrana eklenmiş web uygulamalarına (PWA) standart Web Push ile bildirim gönderebilir. Pushizo Web SDK'sı bu akışı ek kod olmadan destekler; farklı olan, kullanıcının siteyi önce ana…
iOS Live Activities
Live Activities, kilit ekranında ve Dynamic Island'da canlı içerik gösterir: sipariş takibi, teslimat süresi, maç skoru, yolculuk durumu. Pushizo ile etkinliği sunucudan başlatır, günceller ve bitirirsiniz…