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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также