Dynamic Island — ناحیه تعاملی در بالای آیفون 14 پرو و تمام آیفونهای 15/16 است که اعلانها، فعالیتهای پسزمینه و نشانگرهای سیستم را در یک ناحیه پویا یکپارچه میکند. برخلاف بریدگی سنتی (notch)، Dynamic Island شکل و اندازه خود را با توجه به زمینه فعلی تغییر میدهد. طبق دادههای اپل (WWDC 2024)، کاربران به طور متوسط 12 بار در روز با Dynamic Island تعامل دارند — از طریق لمسها، فشارهای طولانی و Live Activities با ActivityKit. درباره انیمیشنهای iOS بیشتر در مقاله Corner Radius بخوانید.
نکات اصلی
Dynamic Island — یک ناحیه تعاملی مبتنی بر راهحل نرمافزاری-سختافزاری اپل است که در سپتامبر ۲۰۲۲ همراه با آیفون ۱۴ پرو معرفی شد. از نظر فیزیکی، این یک بریدگی به شکل قرص است که توسط پیکسلهای OLED احاطه شده و به طور پویا رنگ و شکل خود را تغییر میدهد. اپل از ترکیب محفظه سختافزاری دوربین و Face ID با رندر نرمافزاری نواحی سیاه اطراف آن استفاده میکند و توهم یک «جزیره زنده» را ایجاد میکند.
هدف اصلی Dynamic Island از بین بردن شکاف بین اعلانهای سیستم و محتوای فعال است. به جای ظاهر شدن اعلانها در مرکز صفحه (مانند اندروید) یا به صورت بنر در بالا (مانند iOS قدیمیتر)، Dynamic Island آنها را مستقیماً در ناحیه سختافزاری ادغام میکند. این کار حواسپرتی را کاهش میدهد و حس یک فضای واحد را ایجاد میکند.
بر اساس دادههای اپل (iOS 17 Adoption Statistics، ۲۰۲۴)، Dynamic Island روی ۳۸٪ آیفونهای فعال در دسترس است. از آیفون ۱۵ (۲۰۲۳) به بعد، تمام مدلهای سری Dynamic Island را دریافت کردند، از جمله مدلهای پایه. در iOS 18، اپل API Live Activities را گسترش داد و پشتیبانی از تایمرهای شمارش معکوس و نتایج ورزشی را مستقیماً در Dynamic Island اضافه کرد.
Dynamic Island در آیفون ۱۴ پرو، آیفون ۱۴ پرو مکس، آیفون ۱۵، آیفون ۱۵ پلاس، آیفون ۱۵ پرو، آیفون ۱۵ پرو مکس، آیفون ۱۶، آیفون ۱۶ پلاس، آیفون ۱۶ پرو، آیفون ۱۶ پرو مکس در دسترس است. در 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: "الکسی ۴ دقیقه دیگر میرسد",
sound: .default
)
await activity.update(
using: updatedState,
alertConfiguration: alertConfiguration
)
}
AlertConfiguration — پارامتر اضافی است که هنگام بهروزرسانیهای مهم (مثلاً «پیک رسید») اعلانی را روی Dynamic Island نشان میدهد. بدون AlertConfiguration، محتوا بیصدا بهروزرسانی میشود که برای نوارهای پیشرفت و تایمرها مناسب است.
Notch (بریدگی) — ناحیه سختافزاری آیفون X–۱۳ است که شامل دوربین جلو، سنسور Face ID و بلندگو میشود. Notch ایستا است: اندازه و شکل آن تغییر نمیکند و اعلانها در زیر آن به صورت بنرهای استاندارد نمایش داده میشوند. Dynamic Island، در مقابل، از پیکسلهای اطراف بریدگی برای نمایش محتوا استفاده میکند و عنصر سختافزاری را به بخشی از رابط تبدیل میکند.
| معیار | Dynamic Island | Notch |
|---|---|---|
| تعاملی بودن | پشتیبانی از ضربه، فشار طولانی، کشیدن | تعاملی نیست |
| سازگاری محتوا | شکل را بر اساس زمینه تغییر میدهد | ایستا، محتوا زیر بریدگی |
| Live Activities | پشتیبانی داخلی از طریق ActivityKit | خیر — فقط اعلانهای معمولی |
| چندوظیفهای | دو فعالیت همزمان (چپ و راست) | فقط یک فعالیت |
| دسترسی | iOS 16.1+، آیفون ۱۴ پرو و جدیدتر | iOS 11+، آیفون X–۱۳ |
طبق Apple Human Interface Guidelines (۲۰۲۵)، 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
}
}
}
}
توصیه اپل (WWDC 2024، Session 10146): از Dynamic Island برای نمایش وضعیتهایی که نیاز به توجه کاربر ندارند استفاده نکنید. هر Live Activity باید دارای یک محرک شروع و پایان مشخص باشد. برای بهروزرسانیهای پسزمینه بدون رابط کاربری از Background Tasks استفاده کنید، نه Live Activities.
سوالات متداول
Dynamic Island در آیفون ۱۴ پرو، ۱۴ پرو مکس و تمام مدلهای آیفون ۱۵ و آیفون ۱۶ (شامل نسخههای پایه) در دسترس است. برای توسعه به iOS 16.1+ و Xcode 14.1 نیاز است. در مدلهای قدیمیتر (آیفون X–۱۳) از بریدگی ایستای notch استفاده میشود که از Live Activities پشتیبانی نمیکند.
Dynamic Island اعلان را در ناحیه سختافزاری صفحه ادغام میکند بدون اینکه محتوا را بپوشاند. اعلان معمولی به صورت بنر در بالا ظاهر میشود و پس از چند ثانیه ناپدید میشود. Live Activities در Dynamic Island میتوانند ساعتها فعال بمانند و در زمان واقعی بهروزرسانی شوند (وضعیت تحویل، تایمر، موسیقی).
از بهروزرسانیهای push از طریق APNs استفاده کنید. هنگام شروع Live Activity، activity.pushToken را فراخوانی کرده و توکن را به سرور خود ارسال کنید. سرور یک درخواست بهروزرسانی از طریق APNs با ContentState جدید ارسال میکند. جایگزین — بهروزرسانی محلی از طریق activity.update(using:) از خود برنامه.
iOS به طور خودکار Dynamic Island را به دو بخش تقسیم میکند وقتی دو Live Activity فعال وجود دارد. هر فعالیت در حالت حداقل در سمت چپ و راست دوربین نمایش داده میشود. با فشار طولانی روی یکی از بخشها، حالت گسترده فقط همان برنامه باز میشود.
بررسی کنید: (۱) برنامه دارای NSSupportsLiveActivities = YES در Info.plist است، (۲) ActivityAttributes و ContentState Codable و Hashable را پیادهسازی میکنند، (۳) نسخه iOS 16.1+، (۴) دستگاه از Dynamic Island پشتیبانی میکند. برای شبیهساز از آیفون ۱۴ پرو یا جدیدتر در Xcode استفاده کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.