Dynamic Island — interaktivní oblast v horní části iPhone 14 Pro a všech iPhone 15/16, která spojuje oznámení, aktivity na pozadí a systémové indikátory do jedné dynamické zóny. Na rozdíl od tradičního výřezu (notch) Dynamic Island mění tvar a velikost v závislosti na aktuálním kontextu. Podle údajů Apple (WWDC 2024) uživatelé interagují s Dynamic Island v průměru 12krát denně — prostřednictvím dotyků, dlouhých stisků a Live Activities s ActivityKit. Více o animacích v iOS si přečtěte v článku o Corner Radius.
Hlavní body
Dynamic Island — je interaktivní oblast založená na softwarově-hardwarovém řešení Apple, představená v září 2022 spolu s iPhone 14 Pro. Fyzicky se jedná o výřez ve tvaru pilulky obklopený OLED pixely, které dynamicky mění barvu a tvar. Apple používá kombinaci hardwarového oddílu pro kameru a Face ID s softwarovým renderováním černých oblastí kolem něj, čímž vytváří iluzi „živého" ostrůvku.
Hlavním cílem Dynamic Island je odstranit propast mezi systémovými oznámeními a aktivním obsahem. Místo toho, aby se oznámení objevovala uprostřed obrazovky (jako na Androidu) nebo jako bannery nahoře (jako na starších iOS), Dynamic Island je integruje přímo do hardwarové zóny. To snižuje rozptylování a vytváří pocit jednotného prostoru.
Podle údajů Apple (iOS 17 Adoption Statistics, 2024) je Dynamic Island k dispozici na 38% aktivních iPhone. Počínaje iPhone 15 (2023) všechny modely řady získaly Dynamic Island, včetně základních modelů. V iOS 18 Apple rozšířil API Live Activities a přidal podporu pro odpočítávací časovače a sportovní výsledky přímo na Dynamic Island.
Dynamic Island je k dispozici na 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. Na iPadu Dynamic Island chybí. Pro vývoj s Dynamic Island je vyžadován Xcode 14.1+ a iOS 16.1+.
Dynamic Island podporuje tři stavy zobrazení: kompaktní (compact), minimální (minimal) a rozšířený (expanded). Přechod mezi stavy je animován pomocí UIKit animací a Core Animation. Systém sám řídí prioritu aktivit: pokud se několik aplikací pokouší zobrazit obsah současně, iOS používá frontu založenou na čase spuštění poslední aktivity.
| Stav | Velikost | Obsah | Příklad |
|---|---|---|---|
| Compact | 49×18 pt | Ikona aplikace + systémová ikona | Časovač, hudba, hovor |
| Minimal | Až 66×18 pt | Ikona + krátký text | Navigační pokyny, kroky |
| Expanded | Až 364×160 pt | Plnohodnotný widget s obsahem | Sportovní skóre, status taxi |
Kompaktní stav — standardní zobrazení Dynamic Island, když je aktivní jeden úkol na pozadí. Zobrazuje se jako zaoblená pilulka s ikonou aplikace vlevo a systémovou ikonou vpravo. Ve výchozím nastavení všechny Live Activities startují v kompaktním stavu.
Minimální stav nastává, když jsou současně aktivní dva nebo více úkolů. Dynamic Island se „rozdělí" na dva samostatné prvky vlevo a vpravo od kamery. Minimální stav umožňuje zobrazit dva nezávislé zdroje informací, například čas příjezdu taxi a aktuální skladbu.
Rozšířený stav se aktivuje dlouhým stiskem na Dynamic Island. V tomto režimu se zobrazuje plnohodnotný widget s přizpůsobitelným obsahem: nadpisy, popisy, stavové pruhy, tlačítka. Rozšířený stav podporuje rolování a interaktivní prvky.
ActivityKit — Swift framework, představený v iOS 16.1, který umožňuje aplikacím publikovat Live Activities na Dynamic Island a Lock Screen. ActivityKit používá architekturu založenou na ActivityView a ActivityAttributes: první definuje typ obsahu, druhý — proměnná data. Framework pracuje ve spojení s WidgetKit, ale na rozdíl od widgetů se Live Activities mohou aktualizovat v reálném čase bez otevření aplikace.
import ActivityKit
import SwiftUI
// Definujeme atributy aktivity
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable, Hashable {
var driverName: String
var distanceToArrival: Double
var estimatedMinutes: Int
}
var orderNumber: String
}
// Spouštíme Live Activity
func startDeliveryActivity() {
let initialState = DeliveryAttributes.ContentState(
driverName: "Alexej",
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 se aktualizují přes ActivityView, který renderuje SwiftUI obsah pro Dynamic Island. Systém sám určuje, kterou šablonu použít (kompaktní, minimální nebo rozšířenou), v závislosti na velikosti Dynamic Island a počtu aktivit. Pro aktualizaci obsahu zavolejte activity.update(using: contentState). Pro ukončení — activity.end(dismissalPolicy: .immediate).
ActivityKit podporuje push aktualizace přes APNs (Apple Push Notification Service). Při startu Live Activity můžete požádat o pushToken a posílat aktualizace ze serveru bez nutnosti spouštět aplikaci na zařízení. Push aktualizace fungují přes activity.pushToken a Activity.pushToStartToken pro vzdálené spuštění Live Activity.
// Aktualizace Live Activity přes Push
func updateActivity(activity: Activity<DeliveryAttributes>) {
let updatedState = DeliveryAttributes.ContentState(
driverName: "Alexej",
distanceToArrival: 1.2,
estimatedMinutes: 4
)
let alertConfiguration = AlertConfiguration(
title: "Kurier je blízko",
body: "Alexej dorazí za 4 minuty",
sound: .default
)
await activity.update(
using: updatedState,
alertConfiguration: alertConfiguration
)
}
AlertConfiguration — volitelný parametr, který zobrazuje oznámení nad Dynamic Island při důležitých aktualizacích (například „Kurier dorazil"). Bez AlertConfiguration se obsah aktualizuje bez hlášení, což je vhodné pro stavové pruhy a časovače.
Notch (výřez) — hardwarová zóna iPhone X–13, která obsahuje přední kameru, senzor Face ID a reproduktor. Notch je statický: jeho velikost a tvar se nemění a oznámení se zobrazují pod ním jako standardní bannery. Dynamic Island naopak využívá pixely kolem výřezu k zobrazení obsahu, čímž dělá z hardwarového prvku součást rozhraní.
| Kritérium | Dynamic Island | Notch |
|---|---|---|
| Interaktivita | Podporuje dotyky, dlouhé stisky, přejetí | Není interaktivní |
| Adaptace obsahu | Mění tvar podle kontextu | Statický, obsah pod výřezem |
| Live Activities | Vestavěná podpora přes ActivityKit | Ne — pouze běžná oznámení |
| Multitasking | Dvě současné aktivity (vlevo a vpravo) | Pouze jedna aktivita |
| Dostupnost | iOS 16.1+, iPhone 14 Pro a novější | iOS 11+, iPhone X–13 |
Podle Apple Human Interface Guidelines (2025) by Dynamic Island neměl být používán pro reklamu nebo trvalé zobrazování statického obsahu. Live Activities jsou určeny pouze pro úkoly na pozadí s jasným životním cyklem: časovače, doručování, sport, hudba, navigace. Porušení těchto pravidel vede k zamítnutí aplikace v App Store Review.
Dynamic Island má striktní životní cyklus: aktivita začíná požadavkem přes Activity.request(), prochází stavy aktivní/pozastavená/aktualizovaná a končí voláním activity.end(). Systém může aktivitu násilně ukončit při nedostatku paměti (například při spuštění kamery). V tomto případě aplikace obdrží oznámení přes ActivityActivityState.finished.
Gesta Dynamic Island jsou zpracovávána SwiftUI obsahem uvnitř ActivityView. Standardní gesta: dotyk na kompaktní stav otevře aplikaci, dlouhý stisk otevře rozšířený stav, přejetí dolů zavře rozšířený stav. Vlastní gesta se přidávají pomocí SwiftUI modifikátorů (onTapGesture, onLongPressGesture) uvnitř zobrazení aktivity.
Když systém ukončí Live Activity (nebo uživatel přejetím odstraní), aplikace by měla zpracovat stav finished pro uvolnění zdrojů. Doporučuje se přihlásit se k odběru Activity.activityStateUpdates a po dokončení odstranit lokální reference na aktivitu.
import ActivityKit
func observeActivityState(activity: Activity<DeliveryAttributes>) {
Task {
for await state in activity.activityStateUpdates {
switch state {
case .active:
print("Activity aktivní na Dynamic Island")
case .dismissed:
print("Activity skryta uživatelem")
await activity.end(dismissalPolicy: .immediate)
case .finished:
print("Activity ukončena systémem")
cleanupResources()
@unknown default:
break
}
}
}
}
Doporučení Apple (WWDC 2024, Session 10146): nepoužívejte Dynamic Island pro zobrazování stavů, které nevyžadují pozornost uživatele. Každá Live Activity by měla mít jasný spouštěč startu a ukončení. Pro aktualizace na pozadí bez UI používejte Background Tasks, nikoli Live Activities.
Často kladené otázky
Dynamic Island je k dispozici na iPhone 14 Pro, 14 Pro Max a všech modelech iPhone 15 a iPhone 16 (včetně základních verzí). Pro vývoj je vyžadován iOS 16.1+ a Xcode 14.1. Na starších modelech (iPhone X–13) se používá statický výřez notch, který nepodporuje Live Activities.
Dynamic Island integruje oznámení do hardwarové zóny obrazovky, aniž by zakrýval obsah. Běžné oznámení se zobrazí jako banner nahoře a po několika sekundách zmizí. Live Activities na Dynamic Island mohou zůstat aktivní hodiny a aktualizovat se v reálném čase (stav doručení, časovač, hudba).
Použijte push aktualizace přes APNs. Při startu Live Activity zavolejte activity.pushToken a pošlete token na váš server. Server odešle update požadavek přes APNs s novým ContentState. Alternativa — lokální aktualizace přes activity.update(using:) z aplikace samotné.
iOS automaticky rozdělí Dynamic Island na dva segmenty, pokud jsou aktivní dvě Live Activities. Každá aktivita se zobrazí v minimálním stavu vlevo a vpravo od kamery. Při dlouhém stisku jednoho ze segmentů se otevře rozšířený stav pouze této aplikace.
Zkontrolujte: (1) aplikace má NSSupportsLiveActivities = YES v Info.plist, (2) ActivityAttributes a ContentState implementují Codable a Hashable, (3) verze iOS 16.1+, (4) zařízení podporuje Dynamic Island. Pro simulátor použijte iPhone 14 Pro nebo novější v Xcode.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také