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، 2024)، Dynamic Island متاح على 38% من أجهزة iPhone النشطة. بدءاً من iPhone 15 (2023)، تلقت جميع الموديلات في السلسلة Dynamic Island، بما في ذلك الموديلات الأساسية. في iOS 18، وسعت Apple واجهة Live Activities API، بإضافة دعم للمؤقتات التنازلية ونتائج الرياضة مباشرة في 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. Dynamic Island غير متاح على iPad. يتطلب التطوير لـ Dynamic Island Xcode 14.1+ و iOS 16.1+.
Dynamic Island يدعم ثلاث حالات عرض: مضغوطة (compact)، بسيطة (minimal) وموسعة (expanded). الانتقالات بين الحالات تكون متحركة باستخدام رسوم UIKit و Core Animation. النظام نفسه يدير أولوية الأنشطة: إذا حاولت تطبيقات متعددة عرض المحتوى في وقت واحد، يستخدم iOS قائمة انتظار بناءً على وقت بدء آخر نشاط.
| الحالة | الحجم | المحتوى | مثال |
|---|---|---|---|
| مضغوطة | 49×18 pt | أيقونة التطبيق + أيقونة النظام | مؤقت، موسيقى، مكالمة |
| بسيطة | حتى 66×18 pt | أيقونة + نص قصير | اتجاهات الملاحة، خطوات |
| موسعة | حتى 364×160 pt | أداة كاملة مع محتوى | نتيجة رياضية، حالة التاكسي |
الحالة المضغوطة هي العرض القياسي لـ Dynamic Island عندما تكون مهمة خلفية واحدة نشطة. تظهر كحبة مستديرة مع أيقونة التطبيق على اليسار وأيقونة النظام على اليمين. افتراضياً، تبدأ جميع Live Activities في الحالة المضغوطة.
الحالة البسيطة تنشأ عندما يكون هناك مهمتان أو أكثر نشطة في وقت واحد. ينقسم Dynamic Island إلى عنصرين منفصلين على يسار ويمين الكاميرا. الحالة البسيطة تسمح بعرض مصدرين مستقلين للمعلومات، مثل الوقت المتبقي لوصول التاكسي والمسار الحالي.
الحالة الموسعة تُفعَّل بالضغط المطول على Dynamic Island. في هذا الوضع، يتم عرض أداة كاملة بمحتوى قابل للتخصيص: عناوين، أوصاف، أشرطة تقدم، أزرار. الحالة الموسعة تدعم التمرير والعناصر التفاعلية.
ActivityKit هو إطار Swift تم تقديمه في iOS 16.1، يسمح للتطبيقات بنشر Live Activities على Dynamic Island وشاشة القفل. يستخدم 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). عند بدء 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 (2025)، لا ينبغي استخدام Dynamic Island للإعلانات أو العرض الدائم للمحتوى الثابت. Live Activities مخصصة فقط للمهام الخلفية ذات دورة حياة واضحة: مؤقتات، توصيل، رياضة، موسيقى، ملاحة. انتهاك هذه القواعد يؤدي إلى رفض التطبيق في مراجعة App Store.
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("النشاط نشط على Dynamic Island")
case .dismissed:
print("النشاط تم إخفاؤه من قبل المستخدم")
await activity.end(dismissalPolicy: .immediate)
case .finished:
print("النشاط أنهته النظام")
cleanupResources()
@unknown default:
break
}
}
}
}
توصية Apple (WWDC 2024، الجلسة 10146): لا تستخدم Dynamic Island لعرض حالات لا تتطلب انتباه المستخدم. يجب أن يكون لكل Live Activity مشغل بدء وانتهاء واضح. للتحديثات الخلفية بدون واجهة مستخدم، استخدم 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 وأرسل الرمز إلى خادمك. يرسل الخادم طلب تحديث عبر APNs مع ContentState الجديد. البديل هو التحديث المحلي عبر activity.update(using:) من داخل التطبيق نفسه.
يقوم iOS تلقائياً بتقسيم Dynamic Island إلى جزأين عند وجود نشاطين Live Activity نشطين. يُعرض كل نشاط في حالة بسيطة على يسار ويمين الكاميرا. الضغط المطول على أحد الأجزاء يفتح الحالة الموسعة لذلك التطبيق فقط.
تحقق من: (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. سوف نقدم لك النصح ونقترح أفضل حل.