Dynamic Island, iPhone 14 Pro ve tüm iPhone 15/16'nın üst kısmında bildirimleri, arka plan etkinliklerini ve sistem göstergelerini tek bir dinamik bölgede birleştiren etkileşimli bir alandır. Geleneksel çentikten (notch) farklı olarak Dynamic Island, mevcut bağlama göre şeklini ve boyutunu değiştirir. Apple'a (WWDC 2024) göre kullanıcılar, Dynamic Island ile günde ortalama 12 kez etkileşime girer — dokunma, uzun basma ve ActivityKit ile Live Activities aracılığıyla. iOS'taki animasyonlar hakkında daha fazla bilgi için Corner Radius makalesine bakın.
Önemli Noktalar
Dynamic Island, Apple'ın yazılım-donanım çözümüne dayanan etkileşimli bir alandır ve Eylül 2022'de iPhone 14 Pro ile birlikte tanıtılmıştır. Fiziksel olarak, dinamik olarak renk ve şekil değiştiren OLED piksellerle çevrili hap şeklinde bir kesiktir. Apple, kamera ve Face ID için donanım kesiği ile etrafındaki siyah alanların yazılım oluşturmasının bir kombinasyonunu kullanarak «canlı» bir ada yanılsaması yaratır.
Dynamic Island'ın temel amacı, sistem bildirimleri ile aktif içerik arasındaki boşluğu kapatmaktır. Bildirimlerin ekranın ortasında (Android'de olduğu gibi) veya üstten banner olarak (eski iOS'ta olduğu gibi) görünmesi yerine, Dynamic Island bunları doğrudan donanım bölgesine entegre eder. Bu, dikkat dağılmasını azaltır ve birleşik bir alan hissi yaratır.
Apple verilerine (iOS 17 Benimseme İstatistikleri, 2024) göre Dynamic Island, aktif iPhone'ların %38'inde mevcuttur. iPhone 15'ten (2023) itibaren, temel modeller de dahil olmak üzere serideki tüm modeller Dynamic Island'ı almıştır. iOS 18'de Apple, Live Activities API'sini genişleterek doğrudan Dynamic Island'da geri sayım sayaçları ve spor sonuçları desteği eklemiştir.
Dynamic Island, iPhone 14 Pro, iPhone 14 Pro Max, iPhone 15, iPhone 15 Plus, iPhone 15 Pro, iPhone 15 Pro Max, iPhone 16, iPhone 16 Plus, iPhone 16 Pro, iPhone 16 Pro Max'te mevcuttur. iPad'de Dynamic Island mevcut değildir. Dynamic Island için geliştirme, Xcode 14.1+ ve iOS 16.1+ gerektirir.
Dynamic Island üç görüntüleme durumunu destekler: kompakt, minimal ve genişletilmiş. Durumlar arasındaki geçişler, UIKit animasyonları ve Core Animation kullanılarak canlandırılır. Sistem, etkinlik önceliğini kendisi yönetir: birden fazla uygulama aynı anda içerik görüntülemeye çalışırsa, iOS son etkinliğin başlangıç zamanına dayalı bir kuyruk kullanır.
| Durum | Boyut | İçerik | Örnek |
|---|---|---|---|
| Kompakt | 49×18 pt | Uygulama simgesi + sistem simgesi | Sayaç, müzik, arama |
| Minimal | 66×18 pt'ye kadar | Simge + kısa metin | Navigasyon yönleri, adımlar |
| Genişletilmiş | 364×160 pt'ye kadar | İçerikli tam widget | Spor skoru, taksi durumu |
Kompakt durum, bir arka plan görevi etkin olduğunda Dynamic Island'ın standart görünümüdür. Solda uygulama simgesi ve sağda sistem simgesi olan yuvarlak bir hap olarak görünür. Varsayılan olarak, tüm Live Activities kompakt durumda başlar.
Minimal durum, iki veya daha fazla görev aynı anda etkin olduğunda ortaya çıkar. Dynamic Island, kameranın solunda ve sağında iki ayrı öğeye «bölünür». Minimal durum, taksi varış süresi ve mevcut parça gibi iki bağımsız bilgi kaynağının görüntülenmesine olanak tanır.
Genişletilmiş durum, Dynamic Island'a uzun basılarak etkinleştirilir. Bu modda, özelleştirilebilir içerik (başlıklar, açıklamalar, ilerleme çubukları, düğmeler) içeren tam bir widget görüntülenir. Genişletilmiş durum, kaydırma ve etkileşimli öğeleri destekler.
ActivityKit, iOS 16.1'de tanıtılan ve uygulamaların Dynamic Island ve Kilit Ekranında Live Activities yayınlamasına olanak tanıyan bir Swift çerçevesidir. ActivityKit, ActivityView ve ActivityAttributes tabanlı bir mimari kullanır: ilki içerik türünü tanımlar, ikincisi değiştirilebilir verileri tanımlar. Çerçeve, WidgetKit ile birlikte çalışır, ancak widget'ların aksine Live Activities, uygulamayı açmadan gerçek zamanlı olarak güncellenebilir.
import ActivityKit
import SwiftUI
// Etkinlik niteliklerini tanımla
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable, Hashable {
var driverName: String
var distanceToArrival: Double
var estimatedMinutes: Int
}
var orderNumber: String
}
// Live Activity'yi başlat
func startDeliveryActivity() {
let initialState = DeliveryAttributes.ContentState(
driverName: "Aleksey",
distanceToArrival: 3.5,
estimatedMinutes: 12
)
let attributes = DeliveryAttributes(orderNumber: "ORD-2024-8912")
let activity = try? Activity.request(
attributes: attributes,
contentState: initialState,
pushType: .token
)
}
Live Activities, Dynamic Island için SwiftUI içeriğini oluşturan ActivityView aracılığıyla güncellenir. Sistem, Dynamic Island'ın boyutuna ve etkinlik sayısına bağlı olarak hangi şablonu kullanacağını (kompakt, minimal veya genişletilmiş) kendisi belirler. İçeriği güncellemek için activity.update(using: contentState) çağrısını yapın. Sonlandırmak için — activity.end(dismissalPolicy: .immediate).
ActivityKit, APNs (Apple Push Notification Service) aracılığıyla push güncellemelerini destekler. Bir Live Activity başlatırken, bir pushToken talep edebilir ve cihazda uygulamayı başlatmadan sunucudan güncellemeler gönderebilirsiniz. Push güncellemeleri, activity.pushToken ve uzaktan Live Activity başlatma için Activity.pushToStartToken aracılığıyla çalışır.
// Live Activity'yi Push ile güncelle
func updateActivity(activity: Activity<DeliveryAttributes>) {
let updatedState = DeliveryAttributes.ContentState(
driverName: "Aleksey",
distanceToArrival: 1.2,
estimatedMinutes: 4
)
let alertConfiguration = AlertConfiguration(
title: "Kurye yakında",
body: "Aleksey 4 dakika içinde varacak",
sound: .default
)
await activity.update(
using: updatedState,
alertConfiguration: alertConfiguration
)
}
AlertConfiguration, önemli güncellemelerde (örneğin, «Kurye geldi») Dynamic Island üzerinde bir bildirim gösteren isteğe bağlı bir parametredir. AlertConfiguration olmadan içerik sessizce güncellenir, bu da ilerleme çubukları ve sayaçlar için uygundur.
Çentik (Notch), ön kamera, Face ID sensörü ve hoparlörü içeren iPhone X–13'ün donanım kesiğidir. Çentik statiktir: boyutu ve şekli değişmez ve bildirimler altında standart banner olarak görüntülenir. Dynamic Island ise, kesiğin etrafındaki pikselleri içerik görüntülemek için kullanarak donanım öğesini arayüzün bir parçası haline getirir.
| Kriter | Dynamic Island | Çentik (Notch) |
|---|---|---|
| Etkileşim | Dokunma, uzun basma, kaydırmayı destekler | Etkileşimli değil |
| İçerik uyarlaması | Bağlama göre şekil değiştirir | Statik, içerik çentiğin altında |
| Live Activities | ActivityKit ile yerleşik destek | Hayır — yalnızca standart bildirimler |
| Çoklu görev | İki eşzamanlı etkinlik (sol ve sağ) | Yalnızca bir etkinlik |
| Kullanılabilirlik | iOS 16.1+, iPhone 14 Pro ve daha yenisi | iOS 11+, iPhone X–13 |
Apple Human Interface Guidelines'a (2025) göre Dynamic Island, reklam veya statik içeriğin kalıcı olarak görüntülenmesi için kullanılmamalıdır. Live Activities yalnızca net bir yaşam döngüsüne sahip arka plan görevleri için tasarlanmıştır: zamanlayıcılar, teslimat, spor, müzik, navigasyon. Bu kuralların ihlali, App Store incelemesinde uygulamanın reddedilmesine yol açar.
Dynamic Island katı bir yaşam döngüsüne sahiptir: bir etkinlik Activity.request() ile bir istekle başlar, aktif/duraklatılmış/güncellenmiş durumlarından geçer ve activity.end() çağrısıyla sona erer. Sistem, bellek yetersiz olduğunda (örneğin, kamera başlatıldığında) etkinliği zorla sonlandırabilir. Bu durumda uygulama, ActivityActivityState.finished aracılığıyla bir bildirim alır.
Hareketler Dynamic Island'da ActivityView içindeki SwiftUI içeriği tarafından işlenir. Standart hareketler: kompakt duruma dokunmak uygulamayı açar, uzun basmak genişletilmiş durumu açar, aşağı kaydırmak genişletilmiş durumu kapatır. Özel hareketler, etkinlik görünümü içinde SwiftUI değiştiricileri (onTapGesture, onLongPressGesture) aracılığıyla eklenir.
Sistem bir Live Activity'yi sonlandırdığında (veya kullanıcı kaydırarak kaldırdığında), uygulama kaynakları serbest bırakmak için finished durumunu işlemelidir. Activity.activityStateUpdates abone olunması ve tamamlandıktan sonra etkinliğe yerel referansların kaldırılması önerilir.
import ActivityKit
func observeActivityState(activity: Activity<DeliveryAttributes>) {
Task {
for await state in activity.activityStateUpdates {
switch state {
case .active:
print("Etkinlik Dynamic Island'da aktif")
case .dismissed:
print("Etkinlik kullanıcı tarafından gizlendi")
await activity.end(dismissalPolicy: .immediate)
case .finished:
print("Etkinlik sistem tarafından sonlandırıldı")
cleanupResources()
@unknown default:
break
}
}
}
}
Apple Tavsiyesi (WWDC 2024, Oturum 10146): Kullanıcının dikkatini gerektirmeyen durumları görüntülemek için Dynamic Island'ı kullanmayın. Her Live Activity'nin net bir başlangıç ve bitiş tetikleyicisi olmalıdır. Kullanıcı arayüzü olmayan arka plan güncellemeleri için Live Activities yerine Background Tasks kullanın.
Sıkça Sorulan Sorular
Dynamic Island, iPhone 14 Pro, 14 Pro Max ve tüm iPhone 15 ve iPhone 16 modellerinde (temel sürümler dahil) mevcuttur. Geliştirme için iOS 16.1+ ve Xcode 14.1 gereklidir. Daha eski modellerde (iPhone X–13), Live Activities'i desteklemeyen statik bir çentik kullanılır.
Dynamic Island, bildirimi içeriği kapatmadan ekranın donanım bölgesine entegre eder. Normal bir bildirim üstte bir banner olarak görünür ve birkaç saniye sonra kaybolur. Dynamic Island'daki Live Activities saatlerce aktif kalabilir ve gerçek zamanlı olarak güncellenebilir (teslimat durumu, sayaç, müzik).
APNs aracılığıyla push güncellemeleri kullanın. Bir Live Activity başlatırken activity.pushToken çağrısını yapın ve token'ı sunucunuza gönderin. Sunucu, yeni ContentState ile APNs aracılığıyla bir güncelleme isteği gönderir. Alternatif olarak, uygulamanın içinden activity.update(using:) ile yerel güncellemeler yapılabilir.
İki Live Activity etkin olduğunda iOS, Dynamic Island'ı otomatik olarak iki bölüme ayırır. Her etkinlik, kameranın solunda ve sağında minimal durumda görüntülenir. Bölümlerden birine uzun basmak, yalnızca o uygulama için genişletilmiş durumu açar.
Kontrol edin: (1) uygulamanın Info.plist'te NSSupportsLiveActivities = YES var mı, (2) ActivityAttributes ve ContentState, Codable ve Hashable'ı uyguluyor mu, (3) iOS sürümü 16.1+ mı, (4) cihaz Dynamic Island'ı destekliyor mu. Simülatör için Xcode'da iPhone 14 Pro veya daha yenisini kullanın.
Ö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