Dynamic Island — interaktywny obszar w górnej części iPhone 14 Pro i wszystkich iPhone 15/16, który łączy powiadomienia, aktywności w tle i wskaźniki systemowe w jednej dynamicznej strefie. W przeciwieństwie do tradycyjnego wycięcia (notch), Dynamic Island zmienia kształt i rozmiar w zależności od bieżącego kontekstu. Według danych Apple (WWDC 2024), użytkownicy wchodzą w interakcję z Dynamic Island średnio 12 razy dziennie — poprzez dotknięcia, długie naciśnięcia i Live Activities z ActivityKit. Więcej o animacjach w iOS przeczytasz w artykule o Corner Radius.
Najważniejsze
Dynamic Island — to interaktywny obszar oparty na programowo-sprzętowym rozwiązaniu Apple, zaprezentowany we wrześniu 2022 roku wraz z iPhone 14 Pro. Fizycznie jest to wycięcie w kształcie pigułki, otoczone pikselami OLED, które dynamicznie zmieniają kolor i kształt. Apple wykorzystuje kombinację sprzętowej wnęki na kamerę i Face ID z programowym renderowaniem czarnych obszarów wokół niej, tworząc iluzję „żywej" wyspy.
Głównym celem Dynamic Island jest wyeliminowanie luki między powiadomieniami systemowymi a aktywną treścią. Zamiast wyświetlać powiadomienia na środku ekranu (jak w Androidzie) lub w formie banerów u góry (jak w starszych wersjach iOS), Dynamic Island integruje je bezpośrednio w strefę sprzętową. Zmniejsza to rozpraszanie uwagi i tworzy wrażenie jednolitej przestrzeni.
Według danych Apple (iOS 17 Adoption Statistics, 2024), Dynamic Island jest dostępny na 38% aktywnych iPhone'ów. Począwszy od iPhone 15 (2023), wszystkie modele z serii otrzymały Dynamic Island, włączając w to modele podstawowe. W iOS 18 Apple rozszerzyło API Live Activities, dodając obsługę minutników i wyników sportowych bezpośrednio na Dynamic Island.
Dynamic Island jest dostępny 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 iPadzie Dynamic Island nie występuje. Do programowania pod Dynamic Island wymagany jest Xcode 14.1+ i iOS 16.1+.
Dynamic Island obsługuje trzy stany wyświetlania: kompaktowy (compact), minimalistyczny (minimal) i rozszerzony (expanded). Przejścia między stanami są animowane z użyciem UIKit-animacji i Core Animation. System sam zarządza priorytetem aktywności: jeśli kilka aplikacji próbuje wyświetlić treść jednocześnie, iOS używa kolejki opartej na czasie rozpoczęcia ostatniej aktywności.
| Stan | Rozmiar | Treść | Przykład |
|---|---|---|---|
| Compact | 49×18 pt | Ikona aplikacji + ikona systemowa | Minutnik, muzyka, połączenie |
| Minimal | Do 66×18 pt | Ikona + krótki tekst | Wskazówki nawigacji, kroki |
| Expanded | Do 364×160 pt | Pełnowartościowy widżet z treścią | Wyniki sportowe, status taksówki |
Stan kompaktowy — standardowy widok Dynamic Island, gdy aktywna jest jedna zadanie w tle. Wyświetlany jako zaokrąglona pigułka z ikoną aplikacji po lewej i ikoną systemową po prawej. Domyślnie wszystkie Live Activities startują w stanie kompaktowym.
Stan minimalistyczny występuje, gdy aktywne są dwie lub więcej zadań jednocześnie. Dynamic Island „rozdziela się" na dwa oddzielne elementy po lewej i prawej stronie kamery. Stan minimalistyczny pozwala wyświetlać dwa niezależne źródła informacji, na przykład czas do przyjazdu taksówki i bieżący utwór.
Stan rozszerzony aktywuje się przez długie naciśnięcie na Dynamic Island. W tym trybie wyświetlany jest pełnowartościowy widżet z konfigurowalną treścią: nagłówki, opisy, paski postępu, przyciski. Stan rozszerzony obsługuje przewijanie i elementy interaktywne.
ActivityKit — framework Swift, zaprezentowany w iOS 16.1, który pozwala aplikacjom publikować Live Activities na Dynamic Island i Lock Screen. ActivityKit używa architektury opartej na ActivityView i ActivityAttributes: pierwszy określa typ treści, drugi — zmienne dane. Framework działa w połączeniu z WidgetKit, ale w przeciwieństwie do widżetów, Live Activities mogą aktualizować się w czasie rzeczywistym bez otwierania aplikacji.
import ActivityKit
import SwiftUI
// Określamy atrybuty aktywności
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable, Hashable {
var driverName: String
var distanceToArrival: Double
var estimatedMinutes: Int
}
var orderNumber: String
}
// Uruchamiamy Live Activity
func startDeliveryActivity() {
let initialState = DeliveryAttributes.ContentState(
driverName: "Aleksiej",
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 aktualizują się przez ActivityView, który renderuje SwiftUI-treść dla Dynamic Island. System sam określa, którego szablonu użyć (kompaktowy, minimalistyczny lub rozszerzony), w zależności od rozmiaru Dynamic Island i liczby aktywności. Aby zaktualizować treść, wywołaj activity.update(using: contentState). Aby zakończyć — activity.end(dismissalPolicy: .immediate).
ActivityKit obsługuje aktualizacje push przez APNs (Apple Push Notification Service). Przy starcie Live Activity możesz poprosić o pushToken i wysyłać aktualizacje z serwera bez potrzeby uruchamiania aplikacji na urządzeniu. Aktualizacje push działają przez activity.pushToken i Activity.pushToStartToken do zdalnego uruchamiania Live Activity.
// Aktualizacja Live Activity przez Push
func updateActivity(activity: Activity<DeliveryAttributes>) {
let updatedState = DeliveryAttributes.ContentState(
driverName: "Aleksiej",
distanceToArrival: 1.2,
estimatedMinutes: 4
)
let alertConfiguration = AlertConfiguration(
title: "Kurier jest blisko",
body: "Aleksiej przybędzie za 4 minuty",
sound: .default
)
await activity.update(
using: updatedState,
alertConfiguration: alertConfiguration
)
}
AlertConfiguration — dodatkowy parametr, który wyświetla powiadomienie nad Dynamic Island przy ważnych aktualizacjach (na przykład „Kurier przybył"). Bez AlertConfiguration treść aktualizuje się bezgłośnie, co jest odpowiednie dla pasków postępu i minutników.
Notch (wycięcie) — sprzętowa strefa iPhone X–13, która zawiera przednią kamerę, czujnik Face ID i głośnik. Notch jest statyczny: jego rozmiar i kształt się nie zmieniają, a powiadomienia są wyświetlane pod nim w formie standardowych banerów. Dynamic Island, przeciwnie, wykorzystuje piksele wokół wycięcia do wyświetlania treści, czyniąc element sprzętowy częścią interfejsu.
| Kryterium | Dynamic Island | Notch |
|---|---|---|
| Interaktywność | Obsługuje dotknięcia, długie naciśnięcia, przeciągnięcia | Nie jest interaktywny |
| Adaptacja treści | Zmienia kształt w zależności od kontekstu | Statyczny, treść pod wycięciem |
| Live Activities | Wbudowana obsługa przez ActivityKit | Nie — tylko zwykłe powiadomienia |
| Wielozadaniowość | Dwie jednoczesne aktywności (lewa i prawa) | Tylko jedna aktywność |
| Dostępność | iOS 16.1+, iPhone 14 Pro i nowsze | iOS 11+, iPhone X–13 |
Według Apple Human Interface Guidelines (2025), Dynamic Island nie powinien być używany do reklam ani stałego wyświetlania statycznej treści. Live Activities są przeznaczone tylko do zadań w tle z jasnym cyklem życia: minutniki, dostawa, sport, muzyka, nawigacja. Naruszenie tych zasad prowadzi do odrzucenia aplikacji w App Store Review.
Dynamic Island ma ścisły cykl życia: aktywność zaczyna się od żądania przez Activity.request(), przechodzi przez stany aktywna/zawieszona/zaktualizowana i kończy się wywołaniem activity.end(). System może przymusowo zakończyć aktywność przy braku pamięci (na przykład przy uruchomieniu kamery). W takim przypadku aplikacja otrzymuje powiadomienie przez ActivityActivityState.finished.
Gesty Dynamic Island są obsługiwane przez SwiftUI-treść wewnątrz ActivityView. Standardowe gesty: dotknięcie stanu kompaktowego otwiera aplikację, długie naciśnięcie rozwija stan rozszerzony, przeciągnięcie w dół zamyka stan rozszerzony. Niestandardowe gesty dodaje się przez modyfikatory SwiftUI (onTapGesture, onLongPressGesture) wewnątrz widoku aktywności.
Gdy system kończy Live Activity (lub użytkownik usuwa ją przez przeciągnięcie), aplikacja powinna obsłużyć stan finished w celu zwolnienia zasobów. Zaleca się zasubskrybowanie Activity.activityStateUpdates i usunięcie lokalnych referencji do aktywności po jej zakończeniu.
import ActivityKit
func observeActivityState(activity: Activity<DeliveryAttributes>) {
Task {
for await state in activity.activityStateUpdates {
switch state {
case .active:
print("Activity aktywna na Dynamic Island")
case .dismissed:
print("Activity ukryta przez użytkownika")
await activity.end(dismissalPolicy: .immediate)
case .finished:
print("Activity zakończona przez system")
cleanupResources()
@unknown default:
break
}
}
}
}
Zalecenie Apple (WWDC 2024, Session 10146): nie używaj Dynamic Island do wyświetlania statusów, które nie wymagają uwagi użytkownika. Każda Live Activity powinna mieć jasny trigger startu i zakończenia. Do aktualizacji w tle bez UI używaj Background Tasks, a nie Live Activities.
Często zadawane pytania
Dynamic Island jest dostępny na iPhone 14 Pro, 14 Pro Max i wszystkich modelach iPhone 15 i iPhone 16 (włączając wersje podstawowe). Do programowania wymagany jest iOS 16.1+ i Xcode 14.1. Na starszych modelach (iPhone X–13) używane jest statyczne wycięcie notch, które nie obsługuje Live Activities.
Dynamic Island integruje powiadomienie w sprzętową strefę ekranu, nie zasłaniając treści. Zwykłe powiadomienie pojawia się w formie banera u góry i znika po kilku sekundach. Live Activities na Dynamic Island mogą pozostawać aktywne godzinami i aktualizować się w czasie rzeczywistym (status dostawy, minutnik, muzyka).
Użyj aktualizacji push przez APNs. Przy starcie Live Activity wywołaj activity.pushToken i wyślij token na swój serwer. Serwer wysyła żądanie update przez APNs z nowym ContentState. Alternatywa — lokalna aktualizacja przez activity.update(using:) z samej aplikacji.
iOS automatycznie dzieli Dynamic Island na dwa segmenty przy dwóch aktywnych Live Activities. Każda aktywność wyświetlana jest w stanie minimalistycznym po lewej i prawej stronie kamery. Przy długim naciśnięciu na jeden z segmentów otwiera się stan rozszerzony tylko tej aplikacji.
Sprawdź: (1) aplikacja ma NSSupportsLiveActivities = YES w Info.plist, (2) ActivityAttributes i ContentState implementują Codable i Hashable, (3) wersja iOS 16.1+, (4) urządzenie obsługuje Dynamic Island. Dla symulatora użyj iPhone 14 Pro lub nowszego w Xcode.
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ż