- Что на самом деле можно “настроить” в Dynamic Island
- Где это включается у пользователя (и что проверить в первую очередь)
- Ключевая технология: ActivityKit + WidgetKit (и отдельный экран под Dynamic Island)
- Как настроить интерфейс: заблокированный экран и сам “островок”
- Как сделать “развернутый” интерфейс с областями (.center, .leading, .trailing, .bottom)
- Как обновлять уведомления в Dynamic Island: меняем динамические данные
- Сколько времени Live Activity может висеть
- Как правильно “завершить”, чтобы островок не мигал лишний раз
- Что пользователь увидит и почему это выглядит как “настроенные уведомления”
- Быстрые действия и кнопки (если нужно не просто смотреть, а управлять)
- Почему у вас “не получается настроить”, хотя вы ищете в настройках
- Короткий чек-лист “как настроить уведомления в Dynamic Island”
Вы хотите, чтобы нужные уведомления появлялись не просто “сверху”, а красиво и вовремя в Dynamic Island. В этой статье разберём, как это делается через Live Activities (а не обычные push), и что именно нужно включить, чтобы “островок” показывал актуальные data на экране.
Что на самом деле можно “настроить” в Dynamic Island
Dynamic Island умеет показывать интерактивные уведомления благодаря Live Activities: это отдельный тип “активностей” вашего приложение, который система выводит на island и на заблокированном экране. Простые push-сообщения тоже приходят, но они отображаются иначе — как стандартные уведомления, а не как интерактивный баннер вокруг выреза.
Важно понимать разницу:
| Что вы хотите | Что показывает Dynamic Island | Как это работает |
|---|---|---|
| Сообщения/звонки “как в чате” | Часто да (в зависимости от приложения) | Обычно через встроенную логику ОС и Live Activity у конкретного сервиса |
| Отслеживание статуса доставки/такси/таймера | Да, через Live activity | Данные обновляются по правилам ActivityKit или push |
| “Просто уведомление, чтобы всплывало красиво” | Не всегда | Нужно, чтобы приложение поддерживало activity и нужный интерфейс |
Если ваше приложение не поддерживает Live Activities, то вы не сможете “донастроить” это только в настройках телефона — нужно, чтобы разработчик добавил поддержку.
Где это включается у пользователя (и что проверить в первую очередь)
Настройки зависят от версии iOS, но общий смысл такой: пользователь должен разрешить уведомления и доступ к activities. Если Live Activities выключены системно, Dynamic Island не будет показывать нужный контент.
Самый практичный путь — проверить доступность Live Activities для конкретного устройства и аккаунта. На стороне приложения также важно убедиться, что system разрешает отображение активностей (например, через проверку доступности).
Если вы разработчик и делаете “уведомления в островке”, ориентир такой: прежде чем запускать live-активность, проверяйте, разрешены ли они пользователем.
Ключевая технология: ActivityKit + WidgetKit (и отдельный экран под Dynamic Island)
Чтобы Live Activity появилась на Dynamic Island, в проекте обычно используют связку:
- WidgetKit (как часть расширения)
- ActivityKit (для activity и интерактивного состояния)
Что добавляется в проект
Обычно требуется:
- включить поддержку Live Activities в Info.plist (флаг NSSupportsLiveActivities)
- описать модель данных через ActivityAttributes
- собрать интерфейс через ActivityConfiguration: отдельные представления для заблокированного экран и для Dynamic Island
Модель данных: статические и динамические
Live activity держится на двух наборах данных:
- статические данные — меняются редко, нужны для “конфигурации” активности при создании
- динамические данные — обновляются, именно они влияют на то, что будет показано пользователю в реальном времени
На практике это выглядит как структура ActivityAttributes с полями для данные, где есть статические атрибуты и ContentState для dynamic состояния.
Как настроить интерфейс: заблокированный экран и сам “островок”
В ActivityConfiguration задают два направления отображения:
- представление для заблокированного экрана
- представление для Dynamic Island
Заблокированный экран: баннер и читаемая информация
Представление на блокировке показывается “как обычный уведомительный баннер”, если устройство не поддерживает Dynamic Island или активность должна отображаться на экране блокировки.
Там вы выводите важный контент, используя текущее состояние.
Dynamic Island: компактный, минимальный, развернутый
Dynamic Island для Live activities умеет три типа отображения:
- компактный (Compact)
- минимальный (Minimal)
- развёрнутый (Expanded)
Логика такая:
- если активна одна активность — показывается compact-представление (две части слева и справа относительно камеры)
- если активны несколько — система может перейти к minimal, где одна активность может быть “прикреплена” к острову, а другая — показана отдельно
- при касании и удержании — появляется expanded и раскрывается больше информации
Как сделать “развернутый” интерфейс с областями (.center, .leading, .trailing, .bottom)
Чтобы внутри раскрытого вида показывать больше данных, используется разметка областей:
.center— под камерой.leading— слева от камеры.trailing— справа от камеры.bottom— внизу (если не хватает места)
Если текст или элементы не помещаются, используется правило адаптации: чтобы контент переносился/менял размещение под камерой. Это помогает сохранить читабельность контент в разных ситуациях.
Как обновлять уведомления в Dynamic Island: меняем динамические данные
Главное: обновлять можно только динамическое состояние Content State. Системе нужно передать новые значения, и UI перерисуется на островке и на блокировке.
Обновление из приложения
Когда приложение получает новые события (например, статус доставки), оно обновляет текущую активность, подставляя новое состояние dynamic данных.
Обновление через push (если приложение в фоне)
Если приложение не может само обновиться, используется push для Live Activity:
- формируется APNS payload
- указывается apns-topic и тип liveactivity
- в теле передаются обновления в блоке content-state, строго совпадающем с моделью ActivityAttributes
При таком подходе Live activity обновится даже когда приложение не активно в iphone-переднем плане (но активность уже существует).
Сколько времени Live Activity может висеть
У Live activities есть ограничения по времени: они могут быть активными до 8 часов. После этого система автоматически завершает активность, а остаточное отображение может зависеть от сценария завершения. На практике это приводит к тому, что максимум видимость может растягиваться дольше (в зависимости от событий завершения).
Как правильно “завершить”, чтобы островок не мигал лишний раз
Когда задача выполнена (например, заказ доставлен), активность нужно завершить. Важно выбрать политику:
- завершить сразу
- или завершить с финальными данными и задержкой (чтобы пользователь увидел итог)
Это влияет на то, как system уберёт активность с Dynamic Island и с заблокированного экрана.
Что пользователь увидит и почему это выглядит как “настроенные уведомления”
В итоге “уведомления в Dynamic Island” — это не настройка “как у всех”, а результат того, что приложение:
- запустило Live activity
- показало нужное представление для компактного/минимального/развёрнутого вида
- регулярно делало обновление состояния (или получало push)
- корректно завершало activity
Если всё сделано правильно, пользователь видит понятный contеnt: статус, таймеры, ход события и возможность быстрой реакции.
Быстрые действия и кнопки (если нужно не просто смотреть, а управлять)
Для Live activities можно добавить интерактивность: кнопки и toggle-переключатели в SwiftUI. Тогда пользователь может сделать действие, не заходя в приложение (например, “получить заказ”, “поставить на паузу”, “перейти к экрану события”).
Также можно подключать Deep Link, чтобы при нажатии открывался нужный экран. Тогда “островок” становится удобной точкой входа, а не просто уведомлением.
Почему у вас “не получается настроить”, хотя вы ищете в настройках
Самая частая причина: Dynamic Island не может показывать live-контент вашего сервиса, если:
- у приложения нет поддержки Live Activity
- activities выключены пользователем
- вы пытаетесь “красиво оформить” обычные push без Live Activities (а это другой механизм)
Поэтому решение — либо убедиться, что конкретное приложение действительно поддерживает Live Activities и вы включили разрешения, либо (если вы разработчик) добавить поддержку через ActivityKit/WidgetKit и настроить представления для island.
Короткий чек-лист “как настроить уведомления в Dynamic Island”
- Убедитесь, что Live activity поддерживается нужным приложение (или добавьте поддержку в проект)
- В проекте включите поддержку NSSupportsLiveActivities
- Опишите ActivityAttributes: статические данные и dynamic Content State
- Настройте ActivityConfiguration: представление для заблокированного экрана и для Dynamic Island
- Сделайте интерфейс для
.compactLeading,.compactTrailing,.minimalиexpanded-областей (.center,.leading,.trailing,.bottom) - Обновляйте только динамическое состояние, либо из приложения, либо через push
- Корректно завершайте activity, когда событие закончилось
Так вы добьётесь именно того эффекта, ради которого люди и ищут “как настроить уведомления в Dynamic Island”: чтобы важные события отображались вокруг выреза и обновлялись по делу.