Dynamic Island — интерактивна област в горната част на iPhone 14 Pro и всички iPhone 15/16, която обединява известия, фоновни активности и системни индикатори в единна динамична зона. За разлика от традиционния изрез (notch), Dynamic Island променя формата и размера си в зависимост от текущия контекст. Според данни на Apple (WWDC 2024), потребителите взаимодействат с Dynamic Island средно 12 пъти на ден — чрез докосвания, продължителни натискания и Live Activities с ActivityKit. Научете повече за анимациите в iOS в статията за Corner Radius.
Основни точки
Dynamic Island — е интерактивна област, базирана на софтуерно-хардуерното решение на Apple, представена през септември 2022 г. заедно с iPhone 14 Pro. Физически това е изрез във формата на хапче, заобиколен от OLED пиксели, които динамично променят цвета и формата си. Apple използва комбинация от хардуерното отделение за камерата и Face ID със софтуерен рендер на черните области около него, създавайки илюзията за „жив" остров.
Основната цел на Dynamic Island е да преодолее пропастта между системните известия и активното съдържание. Вместо известията да се появяват в центъра на екрана (както на Android) или като банери отгоре (както на по-старите iOS), Dynamic Island ги интегрира директно в хардуерната зона. Това намалява разсейването и създава усещане за единно пространство.
Според данни на Apple (iOS 17 Adoption Statistics, 2024), Dynamic Island е достъпен на 38% от активните iPhone. От iPhone 15 (2023) нататък всички модели от серията получиха Dynamic Island, включително базовите модели. В iOS 18 Apple разшири API на Live Activities, добавяйки поддръжка за таймери за обратно броене и спортни резултати директно на Dynamic Island.
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. На iPad Dynamic Island липсва. За разработка с Dynamic Island е необходим Xcode 14.1+ и iOS 16.1+.
Dynamic Island поддържа три състояния на показване: компактно (compact), минимално (minimal) и разширено (expanded). Преходът между състоянията е анимиран с помощта на UIKit анимации и Core Animation. Системата сама управлява приоритета на активностите: ако няколко приложения се опитват да покажат съдържание едновременно, iOS използва опашка, базирана на времето за стартиране на последната активност.
| Състояние | Размер | Съдържание | Пример |
|---|---|---|---|
| Compact | 49×18 pt | Икона на приложение + системна икона | Таймер, музика, разговор |
| Minimal | До 66×18 pt | Икона + кратък текст | Навигационни указания, стъпки |
| Expanded | До 364×160 pt | Пълноценен уиджет със съдържание | Спортен резултат, статус на такси |
Компактно състояние — стандартният изглед на Dynamic Island, когато една фонова задача е активна. Показва се като заоблено хапче с икона на приложението отляво и системна икона отдясно. По подразбиране всички Live Activities стартират в компактно състояние.
Минимално състояние възниква, когато две или повече задачи са активни едновременно. Dynamic Island се „разделя" на два отделни елемента отляво и отдясно на камерата. Минималното състояние позволява показване на два независими източника на информация, например време за пристигане на такси и текущ трак.
Разширено състояние се активира чрез продължително натискане на Dynamic Island. В този режим се показва пълноценен уиджет с настройваемо съдържание: заглавия, описания, ленти за напредък, бутони. Разширеното състояние поддържа превъртане и интерактивни елементи.
ActivityKit — Swift рамка, представена в iOS 16.1, която позволява на приложенията да публикуват Live Activities на Dynamic Island и Lock Screen. ActivityKit използва архитектура, базирана на ActivityView и ActivityAttributes: първият определя типа съдържание, вторият — променливите данни. Рамката работи в съчетание с WidgetKit, но за разлика от уиджетите, Live Activities могат да се актуализират в реално време без отваряне на приложението.
import ActivityKit
import SwiftUI
// Определяме атрибутите на активността
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable, Hashable {
var driverName: String
var distanceToArrival: Double
var estimatedMinutes: Int
}
var orderNumber: String
}
// Стартираме Live Activity
func startDeliveryActivity() {
let initialState = DeliveryAttributes.ContentState(
driverName: "Алексей",
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 се актуализират чрез ActivityView, който рендерира SwiftUI съдържание за Dynamic Island. Системата сама определя кой шаблон да използва (компактен, минимален или разширен), в зависимост от размера на Dynamic Island и броя на активностите. За актуализиране на съдържанието извикайте activity.update(using: contentState). За прекратяване — activity.end(dismissalPolicy: .immediate).
ActivityKit поддържа push актуализации чрез APNs (Apple Push Notification Service). При стартиране на Live Activity можете да поискате pushToken и да изпращате актуализации от сървъра, без да е необходимо да стартирате приложението на устройството. Push актуализациите работят чрез activity.pushToken и Activity.pushToStartToken за отдалечено стартиране на Live Activity.
// Актуализация на Live Activity чрез Push
func updateActivity(activity: Activity<DeliveryAttributes>) {
let updatedState = DeliveryAttributes.ContentState(
driverName: "Алексей",
distanceToArrival: 1.2,
estimatedMinutes: 4
)
let alertConfiguration = AlertConfiguration(
title: "Куриерът е наблизо",
body: "Алексей пристига след 4 минути",
sound: .default
)
await activity.update(
using: updatedState,
alertConfiguration: alertConfiguration
)
}
AlertConfiguration — допълнителен параметър, който показва известие над Dynamic Island при важни актуализации (например „Куриерът пристигна"). Без AlertConfiguration съдържанието се актуализира безшумно, което е подходящо за ленти за напредък и таймери.
Notch (изрез) — хардуерната зона на iPhone X–13, която съдържа предната камера, сензора Face ID и високоговорителя. Notch-ът е статичен: размерът и формата му не се променят, а известията се показват под него като стандартни банери. Dynamic Island, обратно, използва пикселите около изреза за показване на съдържание, превръщайки хардуерния елемент в част от интерфейса.
| Критерий | Dynamic Island | Notch |
|---|---|---|
| Интерактивност | Поддържа докосвания, продължителни натискания, плъзгане | Не е интерактивен |
| Адаптация на съдържание | Променя формата според контекста | Статичен, съдържание под изреза |
| Live Activities | Вградена поддръжка чрез ActivityKit | Не — само обикновени известия |
| Многозадачност | Две едновременни активности (ляво и дясно) | Само една активност |
| Наличност | iOS 16.1+, iPhone 14 Pro и по-нови | iOS 11+, iPhone X–13 |
Според Apple Human Interface Guidelines (2025), Dynamic Island не трябва да се използва за реклами или постоянно показване на статично съдържание. Live Activities са предназначени само за фонови задачи с ясен жизнен цикъл: таймери, доставка, спорт, музика, навигация. Нарушаването на тези правила води до отхвърляне на приложението в App Store Review.
Dynamic Island има строг жизнен цикъл: активността започва с заявка чрез Activity.request(), преминава през състояния активна/паузирана/актуализирана и завършва с извикване на activity.end(). Системата може принудително да прекрати активността при недостиг на памет (например при стартиране на камерата). В този случай приложението получава известие чрез ActivityActivityState.finished.
Жестовете на Dynamic Island се обработват от SwiftUI съдържанието вътре в ActivityView. Стандартни жестове: докосване на компактното състояние отваря приложението, продължително натискане отваря разширеното състояние, плъзгане надолу затваря разширеното състояние. Персонализирани жестове се добавят чрез SwiftUI модификатори (onTapGesture, onLongPressGesture) вътре в изгледа на активността.
Когато системата прекрати Live Activity (или потребителят я премахне чрез плъзгане), приложението трябва да обработи състоянието finished за освобождаване на ресурси. Препоръчва се да се абонирате за Activity.activityStateUpdates и да премахнете локалните препратки към активността след завършване.
import ActivityKit
func observeActivityState(activity: Activity<DeliveryAttributes>) {
Task {
for await state in activity.activityStateUpdates {
switch state {
case .active:
print("Activity активна на Dynamic Island")
case .dismissed:
print("Activity скрита от потребителя")
await activity.end(dismissalPolicy: .immediate)
case .finished:
print("Activity прекратена от системата")
cleanupResources()
@unknown default:
break
}
}
}
}
Препоръка на Apple (WWDC 2024, Session 10146): не използвайте Dynamic Island за показване на статуси, които не изискват внимание от потребителя. Всяка Live Activity трябва да има ясен тригер за старт и край. За фонови актуализации без UI използвайте Background Tasks, а не Live Activities.
Често задавани въпроси
Dynamic Island е достъпен на iPhone 14 Pro, 14 Pro Max и всички модели iPhone 15 и iPhone 16 (включително базовите версии). За разработка е необходим iOS 16.1+ и Xcode 14.1. На по-старите модели (iPhone X–13) се използва статичният изрез notch, който не поддържа Live Activities.
Dynamic Island интегрира известието в хардуерната зона на екрана, без да закрива съдържанието. Обикновеното известие се появява като банер отгоре и изчезва след няколко секунди. Live Activities на Dynamic Island могат да останат активни с часове и да се актуализират в реално време (статус на доставка, таймер, музика).
Използвайте push актуализации чрез APNs. При стартиране на Live Activity извикайте activity.pushToken и изпратете токена на вашия сървър. Сървърът изпраща update заявка чрез APNs с нов ContentState. Алтернатива — локална актуализация чрез activity.update(using:) от самото приложение.
iOS автоматично разделя Dynamic Island на два сегмента при наличие на две активни Live Activities. Всяка активност се показва в минимално състояние отляво и отдясно на камерата. При продължително натискане на един от сегментите се отваря разширено състояние само на това приложение.
Проверете: (1) приложението има NSSupportsLiveActivities = YES в Info.plist, (2) ActivityAttributes и ContentState имплементират Codable и Hashable, (3) iOS версия 16.1+, (4) устройството поддържа Dynamic Island. За симулатор използвайте iPhone 14 Pro или по-нов в Xcode.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също