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, која садржи предњу камеру, FaceID сензор и звучник. 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође