Dynamic Island — interaktywny obszar w górnej części iPhone 14 Pro i nowszych, łączący sprzętowe wycięcie kamery z programowymi powiadomieniami w jeden element interfejsu. Dynamic Island dostosowuje kształt i rozmiar do typu treści: połączenie, timer, muzyka, Live Activity, podłączenie AirPods. Deweloperzy wchodzą w interakcję przez Dynamic Island API oparte na ActivityKit i WidgetKit. Więcej na Dynamic Island HIG.
Najważniejsze
Dynamic Island — element interfejsu iPhone 14 Pro, 15 Pro i nowszych, który wykorzystuje obszar wokół przedniego aparatu i czujników Face ID do wyświetlania powiadomień i Live Activity. W przeciwieństwie do starego wycięcia notch, które było statycznym czarnym elementem, Dynamic Island dynamicznie zmienia kształt i rozmiar: rozszerza się, aby wyświetlić timer, kurczy się dla ikony podłączonych AirPods, zamienia się w prostokąt dla wyników sportowych.
Realizacja techniczna Dynamic Island opiera się na sprzętowym wycięciu (pill-shaped cutout) ekranu OLED i programowym przetwarzaniu pikseli wokół niego. System zwiększa częstotliwość odświeżania pikseli do 120 Hz w obszarze Island i wykorzystuje wygładzanie do płynnego przejścia między treścią a czarnym obszarem kamery. Deweloper nie programuje Island bezpośrednio — tworzy treść przez ActivityKit, a system umieszcza ją wokół wycięcia automatycznie.
Percepcja użytkownika Dynamic Island zamienia sprzętową wadę w funkcjonalny element. Według badań Apple, użytkownicy postrzegają Island jako naturalną część ekranu już po kilku dniach użytkowania. Podświetlenie i animacje przyciągają uwagę — na przykład nadejście powiadomienia przesuwa Island i pokazuje treść z efektem rozszerzenia przy 120 klatkach na sekundę.
Dynamic Island obsługuje trzy tryby wyświetlania treści, które system wybiera automatycznie na podstawie typu i liczby aktywności. Deweloper określa UI dla każdego trybu w WidgetBundle, ale nie zarządza tym, który tryb jest aktywny w danym momencie. System może również wyświetlać dwie aktywności jednocześnie: jedna po lewej stronie wycięcia, druga po prawej.
| Tryb | Rozmiar | Treść | Przykład |
|---|---|---|---|
| Kompaktowy | ~50pt szerokość | Ikona + krótki tekst | Timer: ikona zegara + «05:00» |
| Minimalny | ~22pt okrągły | Tylko ikona aplikacji | Powiadomienie o zrzucie ekranu |
| Rozszerzony | ~300pt x 80pt | Niestandardowy SwiftUI View | Wynik sportowy z logo |
Przejście między trybami odbywa się z systemową animacją o czasie trwania 0.4–0.6 sekundy z krzywą ease-in-out. Przy pojawieniu się nowej Activity Island rozszerza się z kompaktowego do rozszerzonego trybu. Po zakończeniu — kurczy się z powrotem. Użytkownik może wymusić zwinięcie rozszerzonego trybu przesunięciem w lewo — Island przechodzi w tryb kompaktowy lub minimalny. System również zwija rozszerzony tryb po 5 sekundach braku aktywności, jeśli nie oczekuje się aktualizacji.
Dwie aktywności — jeśli dwie aplikacje mają aktywne Live Activity, Dynamic Island pokazuje je z dwóch stron wycięcia. Lewa strona — pierwsza uruchomiona Activity, prawa — druga. Jeśli aktywność jest jedna, zajmuje lewą stronę, prawa pozostaje pusta. Po naciśnięciu dowolnej strony Island rozszerza się i pokazuje treść tej Activity. System sam decyduje, która Activity ma priorytet w przypadku konfliktu.
Treść Dynamic Island jest tworzona wyłącznie przez Live Activity z frameworkiem ActivityKit. Deweloper definiuje cztery obszary w kodzie: kompaktowy lewy (compactLeading), kompaktowy prawy (compactTrailing), minimalny (minimal) i rozszerzony (expanded). Każdy obszar to SwiftUI View, który otrzymuje bieżący stan Activity przez context. Jeśli obszar nie jest zdefiniowany, Island nie wyświetla tej Activity w odpowiednim trybie.
struct DeliveryIsland: DynamicIsland {
var body: some DynamicIslandContent {
DynamicIslandExpandedContent {
VStack(alignment: .leading) {
Text(context.state.status)
.font(.headline)
ProgressView(
value: context.state.progress
)
Text("ETA: \(context.state.minutes) min")
.font(.caption)
}
} compactLeading: {
Image(systemName: "box.truck")
} compactTrailing: {
Text("\(context.state.minutes) min")
.monospacedDigit()
} minimal: {
Image(systemName: "box.truck")
}
}
}
Ograniczenia SwiftUI w Dynamic Island — dostępne komponenty: Text, Image, HStack, VStack, ZStack, Spacer, ProgressView, Button (tylko przez Link), Gauge. Zabronione: ScrollView, List, TabView, animacje, gesture recognizers. Paleta kolorów — tylko System Colors (label, secondaryLabel, tint). Czcionki — systemowe rozmiary od .caption do .title3. Niestandardowe czcionki i SF Symbols działają poprawnie.
Testowanie Dynamic Island — Xcode udostępnia symulator z obsługą Dynamic Island. Wybierz iPhone 14 Pro lub 15 Pro jako urządzenie docelowe. ActivityKit symuluje różne tryby Island: przycisk Dynamic Island Mode w menu Debug w Xcode przełącza między kompaktowym, minimalnym i rozszerzonym. Do testowania wielu Activity jednocześnie użyj schematów z różnymi ActivityID lub uruchom dwie instancje aplikacji.
Zdarzenia systemowe — połączenia, AirPods, Face ID, ładowanie i inne — mają priorytet nad niestandardowymi Live Activity. Gdy występuje zdarzenie systemowe, Island wstrzymuje wyświetlanie niestandardowej treści i pokazuje systemową. Po zakończeniu zdarzenia systemowego Island wraca do niestandardowej treści z animacją. Deweloper nie może anulować ani zmienić zdarzeń systemowych — są one zarządzane na poziomie systemu operacyjnego iOS.
| Zdarzenie systemowe | Format wyświetlania | Priorytet |
|---|---|---|
| Połączenie przychodzące | Minimalna karta z nazwą kontaktu | Wysoki |
| AirPods | Animacja + poziom baterii | Średni |
| Face ID | Ikona kłódki | Średni |
| Ładowanie | Ikona błyskawicy + procenty | Niski |
| AirDrop | Postęp transferu | Średni |
| Zrzut ekranu | Animacja migawki | Niski |
Połączenie przychodzące — najważniejsze zdarzenie systemowe. Dynamic Island pokazuje nazwę dzwoniącego po lewej stronie wycięcia i czas trwania/status po prawej. Podczas aktywnego połączenia Island nie wyświetla żadnych niestandardowych Live Activity. Użytkownik może rozszerzyć Island, aby otworzyć ekran połączenia, lub zwinąć, aby kontynuować pracę w aplikacji z aktywnym połączeniem w tle.
Podłączanie AirPods — po otwarciu etui obok iPhone Dynamic Island animuje podłączenie i pokazuje poziom naładowania każdej słuchawki i etui. Animacja trwa 2–3 sekundy, po czym Island wraca do poprzedniego stanu. Jeśli użytkownik nie miał aktywnych Live Activity, Island pozostaje pusty. AirPods Pro 2 wyświetlają również głośność i tryb redukcji szumów po naciśnięciu nóżki.
Najlepsze praktyki Dynamic Island od Apple zaleca się przestrzegać w celu zapewnienia wysokiej jakości doświadczenia użytkownika. Tryb kompaktowy powinien wyświetlać tylko najważniejsze informacje — ikonę i jedną liczbę lub krótką etykietę. Tryb rozszerzony — tylko kluczowe informacje bez zbędnych elementów. Unikaj umieszczania tekstu w trybie kompaktowym, jeśli przekracza 20 znaków — system obcina tekst wielokropkiem.
Aktualizacje Push dla Dynamic Island — używaj ActivityKit push do rzadkich aktualizacji (status zamówienia, wyniki sportowe) i lokalnych aktualizacji do częstych timerów lub stoperów. Powiadomienia push przechodzą przez APNs i zajmują 0.5–2 sekundy do wyświetlenia w Island. StaleDate — ustawiaj datę dezaktualizacji treści: jeśli aktualizacja nie nadeszła na czas, system pokazuje szare tło zamiast treści, sygnalizując użytkownikowi nieaktualne dane.
func updateDelivery(activity: Activity<DeliveryAttributes>) {
Task {
let newContent = ActivityContent(
state: DeliveryAttributes.ContentState(
status: .delivered,
estimatedMinutes: 0
),
staleDate: Date().addingTimeInterval(300)
)
await activity.update(newContent)
// Kończymy Activity za 2 sekundy
try? await Task.sleep(nanoseconds: 2_000_000_000)
await activity.end(newContent)
}
}
Zużycie energii — Dynamic Island i Live Activities mają minimalny wpływ na baterię dzięki optymalizacji sprzętowej ekranu OLED. Czarne piksele wokół wycięcia są wyłączone, a treść jest renderowana na dedykowanym koprocesorze. Średnie zużycie Live Activity — poniżej 1% baterii na godzinę użytkowania przy aktualizacji co 5 minut. System automatycznie wstrzymuje Island przy niskim poziomie baterii (poniżej 20%) lub w trybie oszczędzania energii.
Projektowanie dla Dynamic Island nie wymaga adaptacji głównego UI aplikacji — Island działa niezależnie od aktywnego ekranu. Kolory Live Activity powinny odpowiadać systemowemu motywowi (jasny/ciemny) przez systemowe Color Assets. SF Symbols są preferowane nad niestandardowymi ikonami — gwarantują poprawne wyświetlanie w każdym trybie Island i mają wbudowaną obsługę Dynamic Type.
Często zadawane pytania
Dynamic Island jest dostępny tylko na iPhone 14 Pro, 14 Pro Max, 15 Pro, 15 Pro Max i nowszych z iOS 16.1+. Na starszych iPhone z «grzywką» Dynamic Island nie jest wyświetlany — Live Activity pokazuje się jako zwykły baner na ekranie blokady. Deweloper nie musi pisać innego kodu: system sam dostosowuje interfejs do możliwości urządzenia.
Dynamic Island obsługuje wyświetlanie dwóch aktywności jednocześnie — są one umieszczone po lewej i prawej stronie wycięcia kamery. Jeśli aktywność jest jedna, zajmuje lewą stronę, a prawa pozostaje w stanie kompaktowym. Po naciśnięciu dowolnej strony Island rozszerza się i pokazuje treść odpowiedniej Activity.
Zdarzenia systemowe w Dynamic Island: połączenie przychodzące z minimalną kartą i nazwą kontaktu, podłączenie AirPods z animacją i poziomem baterii, Face ID z ikoną kłódki, ładowanie urządzenia z procentem, tryb modemu, zmiana głośności, włączenie Silent Mode, AirDrop z postępem transferu i zrzut ekranu z animacją migawki.
Dynamic Island nie wymaga osobnego API — wyświetla Live Activity utworzone przez ActivityKit wraz z WidgetKit. Aplikacja rejestruje Activity z konfiguracją DynamicIsland, określa kompaktowy, minimalny i rozszerzony SwiftUI View. System automatycznie pokazuje go w Dynamic Island na obsługiwanych urządzeniach.
Dynamic Island jest ograniczony do trzech stanów wizualnych o różnych rozmiarach: kompaktowy do 50pt, minimalny do 22pt, rozszerzony do 300pt. W trybie kompaktowym nie zaleca się umieszczania tekstu dłuższego niż 20 znaków. Dostępne są tylko systemowe komponenty SwiftUI — Text, Image, ProgressView, Gauge. Niestandardowe czcionki i kolory są ograniczone do systemowej palety.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również