Dynamic Island — ناحیه تعاملی در قسمت بالایی iPhone 14 Pro و جدیدتر که بریدگی سختافزاری دوربین را با اعلانهای نرمافزاری در یک عنصر رابط واحد ترکیب میکند. Dynamic Island شکل و اندازه خود را با نوع محتوا تطبیق میدهد: تماس، تایمر، موسیقی، Live Activity، اتصال AirPods. توسعهدهندگان از طریق Dynamic Island API مبتنی بر ActivityKit و WidgetKit تعامل میکنند. بیشتر در Dynamic Island HIG.
نکات اصلی
Dynamic Island — عنصر رابط iPhone 14 Pro، 15 Pro و جدیدتر که از ناحیه اطراف دوربین جلو و سنسورهای Face ID برای نمایش اعلانها و Live Activity استفاده میکند. برخلاف بریدگی قدیمی notch که یک عنصر سیاه ایستا بود، Dynamic Island به صورت پویا شکل و اندازه خود را تغییر میدهد: برای نمایش تایمر گسترش مییابد، برای نماد AirPods متصل کوچک میشود، برای نتایج ورزشی به مستطیل تبدیل میشود.
پیادهسازی فنی Dynamic Island مبتنی بر بریدگی سختافزاری (pill-shaped cutout) صفحه OLED و پردازش نرمافزاری پیکسلهای اطراف آن است. سیستم نرخ تازهسازی پیکسلها را در ناحیه Island به 120 هرتز افزایش میدهد و از هموارسازی برای انتقال روان بین محتوا و ناحیه سیاه دوربین استفاده میکند. توسعهدهنده Island را مستقیماً برنامهنویسی نمیکند — او محتوا را از طریق ActivityKit ایجاد میکند و سیستم آن را به طور خودکار در اطراف بریدگی قرار میدهد.
ادراک کاربر Dynamic Island یک نقص سختافزاری را به یک عنصر کاربردی تبدیل میکند. طبق تحقیقات اپل، کاربران پس از چند روز استفاده، Island را به عنوان بخش طبیعی صفحه نمایش درک میکنند. نور پسزمینه و انیمیشنها توجه را جلب میکنند — برای مثال، ورود اعلان Island را جابهجا میکند و محتوا را با اثر گسترش با 120 فریم در ثانیه نشان میدهد.
Dynamic Island پشتیبانی میکند سه حالت نمایش محتوا که سیستم بر اساس نوع و تعداد فعالیتها به طور خودکار انتخاب میکند. توسعهدهنده برای هر حالت در WidgetBundle UI تعیین میکند، اما مدیریت نمیکند که کدام حالت در حال حاضر فعال است. سیستم همچنین میتواند دو فعالیت را همزمان نمایش دهد: یکی در سمت چپ بریدگی، دیگری در سمت راست.
| حالت | اندازه | محتوا | مثال |
|---|---|---|---|
| فشرده | ~50pt عرض | نماد + متن کوتاه | تایمر: نماد ساعت + «05:00» |
| حداقلی | ~22pt دایرهای | فقط نماد برنامه | اعلان اسکرینشات |
| توسعهیافته | ~300pt x 80pt | SwiftUI View سفارشی | نتیجه ورزشی با لوگوها |
انتقال بین حالتها با انیمیشن سیستمی به مدت 0.4–0.6 ثانیه با منحنی ease-in-out انجام میشود. هنگام ظهور Activity جدید، Island از حالت فشرده به توسعهیافته گسترش مییابد. هنگام پایان — کوچک میشود. کاربر میتواند با کشیدن به چپ، حالت توسعهیافته را به اجبار جمع کند — Island به حالت فشرده یا حداقلی میرود. سیستم همچنین پس از 5 ثانیه عدم فعالیت، حالت توسعهیافته را جمع میکند، اگر انتظار بهروزرسانی نرود.
دو فعالیت — اگر دو برنامه دارای Live Activity فعال باشند، Dynamic Island آنها را در دو طرف بریدگی نشان میدهد. سمت چپ — اولین Activity راهاندازی شده، سمت راست — دومی. اگر یک فعالیت وجود داشته باشد، سمت چپ را اشغال میکند، سمت راست خالی میماند. با فشار دادن هر طرف، Island گسترش مییابد و محتوای آن Activity را نشان میدهد. سیستم خود تصمیم میگیرد در صورت تعارض به کدام Activity اولویت بدهد.
محتوای Dynamic Island منحصراً از طریق Live Activity با فریمورک ActivityKit ایجاد میشود. توسعهدهنده چهار ناحیه در کد تعریف میکند: فشرده چپ (compactLeading)، فشرده راست (compactTrailing)، حداقلی (minimal) و توسعهیافته (expanded). هر ناحیه یک SwiftUI View است که وضعیت فعلی Activity را از طریق context دریافت میکند. اگر ناحیه تعریف نشده باشد، Island این Activity را در حالت مربوطه نمایش نمیدهد.
struct DeliveryIsland: DynamicIsland {
var body: some DynamicIslandContent {
DynamicIslandExpandedContent {
VStack(alignment: .leading) {
Text(context.state.status)
.font(.headline)
ProgressView(
value: context.state.progress
)
Text("ETA: \(context.state.minutes) min")
.font(.caption)
}
} compactLeading: {
Image(systemName: "box.truck")
} compactTrailing: {
Text("\(context.state.minutes) min")
.monospacedDigit()
} minimal: {
Image(systemName: "box.truck")
}
}
}
محدودیتهای SwiftUI در Dynamic Island — اجزای در دسترس: Text, Image, HStack, VStack, ZStack, Spacer, ProgressView, Button (فقط از طریق Link), Gauge. ممنوع: ScrollView, List, TabView, انیمیشنها, gesture recognizers. پالت رنگی — فقط System Colors (label, secondaryLabel, tint). فونتها — اندازههای سیستم از .caption تا .title3. فونتهای سفارشی و SF Symbols به درستی کار میکنند.
تست Dynamic Island — Xcode شبیهسازی با پشتیبانی Dynamic Island ارائه میدهد. iPhone 14 Pro یا 15 Pro را به عنوان دستگاه هدف انتخاب کنید. ActivityKit حالتهای مختلف Island را شبیهسازی میکند: دکمه Dynamic Island Mode در منوی Debug Xcode بین فشرده، حداقلی و توسعهیافته جابهجا میکند. برای تست چندین Activity همزمان از طرحهایی با ActivityID مختلف استفاده کنید یا دو نمونه از برنامه را اجرا کنید.
رویدادهای سیستمی — تماسها، AirPods، Face ID، شارژ و موارد دیگر — بر Live Activityهای سفارشی اولویت دارند. هنگامی که یک رویداد سیستمی رخ میدهد، Island نمایش محتوای سفارشی را متوقف کرده و محتوای سیستمی را نشان میدهد. پس از پایان رویداد سیستمی، Island با انیمیشن به محتوای سفارشی بازمیگردد. توسعهدهنده نمیتواند رویدادهای سیستمی را لغو یا تغییر دهد — آنها در سطح سیستم عامل iOS مدیریت میشوند.
| رویداد سیستمی | فرمت نمایش | اولویت |
|---|---|---|
| تماس ورودی | کارت حداقلی با نام مخاطب | بالا |
| AirPods | انیمیشن + شارژ باتری | متوسط |
| Face ID | نماد قفل | متوسط |
| شارژ | نماد صاعقه + درصد | پایین |
| AirDrop | پیشرفت انتقال | متوسط |
| اسکرینشات | انیمیشن شاتر | پایین |
تماس ورودی — مهمترین رویداد سیستمی. Dynamic Island نام تماسگیرنده را در سمت چپ بریدگی و مدت/وضعیت را در سمت راست نشان میدهد. در طول تماس فعال، Island هیچ Live Activity سفارشی نمایش نمیدهد. کاربر میتواند Island را برای باز کردن صفحه تماس گسترش دهد یا برای ادامه کار در برنامه با تماس فعال در پسزمینه جمع کند.
اتصال AirPods — هنگام باز کردن قاب در کنار iPhone، Dynamic Island اتصال را انیمیشن میکند و شارژ هر هدفون و قاب را نشان میدهد. انیمیشن 2–3 ثانیه طول میکشد، پس از آن Island به حالت قبلی بازمیگردد. اگر کاربر Live Activity فعالی نداشته باشد، Island خالی میماند. AirPods Pro 2 همچنین هنگام فشار دادن ساقه، صدا و حالت حذف نویز را نمایش میدهد.
بهترین شیوههای Dynamic Island توسط اپل برای تضمین تجربه کاربری با کیفیت توصیه میشود. حالت فشرده باید فقط مهمترین اطلاعات را نمایش دهد — نماد و یک عدد یا برچسب کوتاه. حالت توسعهیافته — فقط اطلاعات کلیدی بدون عناصر اضافی. از قرار دادن متن در حالت فشرده اگر بیش از 20 کاراکتر است خودداری کنید — سیستم متن را با سه نقطه قطع میکند.
بهروزرسانیهای Push برای Dynamic Island — از ActivityKit push برای بهروزرسانیهای نادر (وضعیت سفارش، نتایج ورزشی) و بهروزرسانیهای محلی برای تایمرهای مکرر یا کرونومترها استفاده کنید. اعلانهای Push از APNs عبور میکنند و 0.5–2 ثانیه تا نمایش در Island زمان میبرند. StaleDate — تاریخ انقضای محتوا را تنظیم کنید: اگر بهروزرسانی به موقع نرسد، سیستم به جای محتوا پسزمینه خاکستری نشان میدهد و به کاربر درباره دادههای قدیمی هشدار میدهد.
func updateDelivery(activity: Activity<DeliveryAttributes>) {
Task {
let newContent = ActivityContent(
state: DeliveryAttributes.ContentState(
status: .delivered,
estimatedMinutes: 0
),
staleDate: Date().addingTimeInterval(300)
)
await activity.update(newContent)
// Activity را پس از 2 ثانیه پایان میدهیم
try? await Task.sleep(nanoseconds: 2_000_000_000)
await activity.end(newContent)
}
}
مصرف انرژی — Dynamic Island و Live Activities به لطف بهینهسازی سختافزاری صفحه OLED تأثیر حداقلی بر باتری دارند. پیکسلهای سیاه اطراف بریدگی خاموش هستند و محتوا روی یک پردازنده کمکی اختصاصی رندر میشود. مصرف متوسط Live Activity — کمتر از 1٪ باتری در هر ساعت استفاده با بهروزرسانی هر 5 دقیقه. سیستم به طور خودکار Island را در باتری کم (زیر 20٪) یا حالت ذخیره انرژی متوقف میکند.
طراحی برای Dynamic Island نیازی به تطبیق UI اصلی برنامه ندارد — Island مستقل از صفحه فعال کار میکند. رنگهای Live Activity باید از طریق Color Assets سیستم با تم سیستم (روشن/تاریک) مطابقت داشته باشند. SF Symbols ترجیح داده میشوند نسبت به نمادهای سفارشی — آنها تضمین میکنند در هر حالتی از Island به درستی نمایش داده میشوند و پشتیبانی داخلی از Dynamic Type دارند.
سوالات متداول
Dynamic Island فقط در iPhone 14 Pro، 14 Pro Max، 15 Pro، 15 Pro Max و جدیدتر با iOS 16.1+ در دسترس است. در iPhoneهای قدیمی با «بریدگی» Dynamic Island نمایش داده نمیشود — Live Activity به عنوان بنر معمولی در صفحه قفل نشان داده میشود. توسعهدهنده نیازی به نوشتن کد متفاوت ندارد: سیستم خود رابط را با قابلیتهای دستگاه تطبیق میدهد.
Dynamic Island نمایش همزمان دو فعالیت را پشتیبانی میکند — آنها در سمت چپ و راست بریدگی دوربین قرار میگیرند. اگر یک فعالیت وجود داشته باشد، سمت چپ را اشغال میکند و سمت راست در حالت فشرده باقی میماند. با فشار دادن هر طرف، Island گسترش مییابد و محتوای Activity مربوطه را نشان میدهد.
رویدادهای سیستمی در Dynamic Island: تماس ورودی با کارت حداقلی و نام مخاطب، اتصال AirPods با انیمیشن و شارژ باتری، Face ID با نماد قفل، شارژ دستگاه با درصد، حالت مودم، تغییر صدا، فعالسازی Silent Mode، AirDrop با پیشرفت انتقال و اسکرینشات با انیمیشن شاتر.
Dynamic Island به API جداگانه نیاز ندارد — Live Activity ایجاد شده از طریق ActivityKit به همراه WidgetKit را نمایش میدهد. برنامه Activity را با پیکربندی DynamicIsland ثبت میکند، SwiftUI View فشرده، حداقلی و توسعهیافته را تعریف میکند. سیستم آن را به طور خودکار در Dynamic Island در دستگاههای پشتیبانی شده نمایش میدهد.
Dynamic Island به سه حالت بصری با اندازههای مختلف محدود میشود: فشرده تا 50pt، حداقلی تا 22pt، توسعهیافته تا 300pt. در حالت فشرده قرار دادن متن بیش از 20 کاراکتر توصیه نمیشود. فقط اجزای سیستمی SwiftUI در دسترس هستند — Text, Image, ProgressView, Gauge. فونتها و رنگهای سفارشی به پالت سیستم محدود میشوند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.