Live Activity — ویجت دینامیک روی صفحه قفل iPhone و در Dynamic Island که اطلاعات را به صورت بلادرنگ نمایش میدهد: وضعیت تحویل، نتایج ورزشی، تایمرها و پخش موسیقی. از طریق ActivityKit (Swift، iOS 16.1+) به همراه WidgetKit پیادهسازی میشود. Live Activity به صورت محلی یا از طریق اعلانهای push بهروزرسانی میشود، چندین حالت را پشتیبانی میکند و پس از پایان رویداد توسط سیستم خاتمه مییابد. جزئیات بیشتر — در ActivityKit Documentation.
نکات اصلی
Live Activity — افزونه WidgetKit که محتوای دینامیک را روی صفحه قفل iPhone و Dynamic Island نمایش میدهد. برخلاف ویجت ایستا که طبق تایمر سیستم بهروزرسانی میشود، Live Activity توسط برنامه راهاندازی میشود و برای مدت محدودی زنده میماند — تا ۸ ساعت برای Activity فعال و تا ۴ ساعت پس از اتمام. کاربر بدون باز کردن قفل دستگاه، دادههای بهروز را میبیند: وضعیت سفارش تحویل، فاصله تا مقصد در تاکسی، نتیجه مسابقه یا پیشرفت تمرین.
ActivityKit — فریمورک کار با Live Activities که در iOS 16.1 معرفی شد. API برای درخواست، بهروزرسانی و خاتمه Activity ارائه میدهد. Activity شیئی با محتوا و حالت است. محتوا (ActivityContent) دادههای ایستا را تعریف میکند و حالت (ActivityState) — دادههای دینامیک که در طول زمان تغییر میکنند. سیستم خود تصمیم میگیرد چه زمانی حالت جدید را رندر کند — این کار باعث صرفهجویی در باتری و تضمین روانی انیمیشنها میشود.
هر Live Activity به طور یکتا با ActivityID شناسایی میشود و به یک فرآیند — برنامهای که آن را ایجاد کرده — متصل است. سیستم میتواند Activity را در صورت کمبود حافظه یا باتری کم خاتمه دهد. توسعهدهنده از طریق دلیگیت ActivityKit از خاتمه اجباری مطلع میشود و میتواند آخرین حالت را برای بازیابی ذخیره کند.
معماری Live Activity بر دو فریمورک استوار است: WidgetKit مسئول رندر کردن نمایشهای SwiftUI، ActivityKit مسئول چرخه حیات Activity. توسعهدهنده WidgetBundle با پشتیبانی LiveActivityConfiguration ایجاد میکند. هر پیکربندی نوع داده (Attributes و State) و SwiftUI View را که توسط سیستم روی Lock Screen و Dynamic Island رندر میشود تعریف میکند. دادهها از طریق ActivityAttributes — struct با فیلدهای let برای محتوا و var برای حالت — منتقل میشوند.
| کامپوننت | کاربرد | API |
|---|---|---|
| Attributes | دادههای ایستای کل Activity | let name: String, let icon: String |
| ContentState | حالت دینامیک که در بهروزرسانی تغییر میکند | var progress: Double, var status: Status |
| Activity | شی درخواست و مدیریت Activity | Activity.request(attributes:content:) |
| PushToken | توکن برای بهروزرسانیهای push سرور | activity.pushToken publisher |
| ActivityUI | SwiftUI View برای Lock Screen و Dynamic Island | LockScreenView, ExpandedView, CompactView |
چرخه حیات Activity شامل سه فاز است: فعال (سیستم نمایش و بهروزرسانی میکند)، نهایی (فعالیت تمام شده اما UI هنوز ۴ ساعت قابل مشاهده است)، حذف شده (سیستم UI را حذف میکند). برنامه میتواند Activity را در هر لحظه خاتمه دهد. سیستم نیز Activity را به صورت اجباری خاتمه میدهد — مثلاً در راهاندازی مجدد دستگاه یا پس از گذشت محدودیت ۸ ساعته.
import ActivityKit
struct DeliveryAttributes: ActivityAttributes {
public struct ContentState: Codable & Hashable {
var status: DeliveryStatus
var estimatedMinutes: Int
}
var orderNumber: String
var restaurantName: String
}
WidgetBundle Live Activity را از طریق ماکرو @main ثبت میکند: ویجت لیستی از پیکربندیها از جمله LiveActivityConfiguration را برمیگرداند. سیستم بر اساس این پیکربندی میداند چه نوع دادههایی را انتظار داشته باشد و چگونه UI را در حالتهای مختلف — فشرده، حداقلی و گسترده برای Dynamic Island — رندر کند.
ایجاد Activity با درخواست به ActivityKit آغاز میشود. برنامه Activity.request(attributes:content:pushType:) را با دادههای اولیه فراخوانی میکند. سیستم بررسی میکند که آیا Dynamic Island روی دستگاه در دسترس است و شی Activity را برمیگرداند. درخواست ممکن است در صورت تجاوز از محدودیت Activityهای فعال — معمولاً بیش از ۵ همزمان — با خطا مواجه شود. پس از درخواست موفق، سیستم ویجت را روی Lock Screen و در صورت امکان در Dynamic Island نمایش میدهد.
let attributes = DeliveryAttributes(
orderNumber: "A-1234",
restaurantName: "Pizza House"
)
let initialState = DeliveryAttributes.ContentState(
status: DeliveryStatus.preparing,
estimatedMinutes: 30
)
do {
let activity = try await Activity<DeliveryAttributes>.request(
attributes: attributes,
content: ActivityContent(state: initialState, staleDate: nil),
pushType: .token
)
print("Activity started: \(activity.id)")
} catch {
print("Failed: \(error)")
}
SwiftUI View برای Live Activity از ساختارهای LockScreenView، ExpandedView و CompactView از WidgetKit استفاده میکند. View زمینه (ActivityViewContext) را با ویژگیها و حالت جاری دریافت میکند. بهروزرسانی View هنگام دریافت حالت جدید از سیستم به طور خودکار انجام میشود. Live Activity فقط از مجموعه محدودی از کامپوننتهای SwiftUI پشتیبانی میکند — Text، Image، HStack، VStack و چند modifier.
هر Live Activity View باید سبک و سریع باشد — سیستم از رندر کردن نمایشهای سنگین خودداری میکند. محدودیت زمان رندر — ۳۰ میلیثانیه هر فریم. انیمیشنها به انتقالهای سیستمی بین حالتها محدود هستند — انیمیشنهای سفارشی در Live Activity در دسترس نیستند. رندر در پسزمینه فرآیند WidgetKit با اولویت پاسخگویی Lock Screen انجام میشود.
بهروزرسانی محلی — برنامه حالت Activity را با فراخوانی activity.update(using:) بهروزرسانی میکند. متد ContentState جدید و AlertConfiguration اختیاری برای نمایش اعلان در هنگام بهروزرسانی دریافت میکند. بهروزرسانیهای محلی سریع هستند — سیستم View را در چرخه رندر بعدی، معمولاً ظرف ۱–۲ ثانیه، دوباره ترسیم میکند. برای بهروزرسانیهای مکرر (تایمر، کرونومتر) از حالت محلی استفاده کنید — این روش قابلاعتمادتر و سریعتر از push است.
let updatedState = DeliveryAttributes.ContentState(
status: DeliveryStatus.outForDelivery,
estimatedMinutes: 10
)
await activity.update(
ActivityContent<DeliveryAttributes.ContentState>(
state: updatedState,
staleDate: Date().addingTimeInterval(60)
),
alertConfiguration: AlertConfiguration(
title: "Order out for delivery",
body: "Arriving in 10 min"
)
)
بهروزرسانیهای Push — سرور اعلان push ActivityKit را با حالت جدید در قالب JSON ارسال میکند. برای این کار برنامه pushToken را از activity.pushToken publisher دریافت و به سرور منتقل میکند. سرور درخواست POST به APNs با payload حاوی ContentState جدید ارسال میکند. سیستم push را دریافت، حالت را کدگشایی و Live Activity را بدون دخالت برنامه بهروزرسانی میکند — این امکان بهروزرسانی Activity را حتی زمانی که برنامه بسته است فراهم میکند.
بهروزرسانیهای push برای بهروزرسانیهای نادر (وضعیت تحویل هر ۵–۱۰ دقیقه) اقتصادیتر از محلی هستند — برنامه نیازی به نگهداشتن اتصال شبکه ندارد. برای بهروزرسانیهای مکرر هر ۱–۲ ثانیه از روش محلی استفاده کنید. payload سرور فقط شامل فیلدهای قابل تغییر ContentState است — دادههای ایستای Attributes فقط هنگام ایجاد Activity ارسال میشوند.
Dynamic Island — ناحیه سختافزاری-نرمافزاری در iPhone 14 Pro، 15 Pro و جدیدتر که با محتوای Live Activity سازگار میشود. سیستم به طور خودکار Activity را در سه حالت نمایش میدهد: فشرده (آیکون + متن کوتاه در سمت چپ بریدگی)، حداقلی (فقط آیکون) و گسترده (مستطیل ۳۰۰pt با اطلاعات). توسعهدهنده این حالتها را مستقیماً مدیریت نمیکند — سیستم حالت را بر اساس اولویت و فضای موجود انتخاب میکند.
struct DeliveryLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: DeliveryAttributes.self) { context in
LockScreenView(context: context)
} dynamicIsland: { context in
DynamicIsland {
DynamicIslandExpandedContent {
ExpandedView(context: context)
}
} compactLeading: {
CompactLeadingView(context: context)
} compactTrailing: {
CompactTrailingView(context: context)
} minimal: {
MinimalView(context: context)
}
}
}
}
Dynamic Island از تعامل پشتیبانی میکند — کاربر ناحیه را لمس میکند و وارد برنامه میشود یا نمای گسترده را باز میکند. لمس حالت فشرده به حالت گسترده منتقل میکند و کشیدن به چپ Activity را به حالت حداقلی میبرد. دکمهها در حالت گسترده (pause/cancel) از طریق Link از SwiftUI پردازش میشوند — سیستم برنامه را با deep link URL راهاندازی میکند، پردازش در UIApplicationDelegate انجام میشود.
محدودیتهای Dynamic Island: عرض حالت گسترده — تا ۳۰۰pt، متن فشرده — تا ۳۰ کاراکتر. رنگها و فونتها مطابق با تم سیستم هستند — سفارشیسازی محدود است. انیمیشنهای انتقال بین حالتها سیستمی و غیرقابل تنظیم هستند. اگر چندین برنامه Activity فعال داشته باشند، Dynamic Island آنها را با اولویت بر اساس زمان راهاندازی و نوع محتوا نمایش میدهد.
سوالات متداول
ویجت معمولی WidgetKit اطلاعات ایستا نمایش میدهد و طبق تایمر سیستم با حداقل فاصله ۱۵–۳۰ دقیقه بهروزرسانی میشود. Live Activity دادههای دینامیک را به صورت بلادرنگ روی صفحه قفل و Dynamic Island نشان میدهد. Live Activity توسط برنامه راهاندازی میشود، تا ۸ ساعت زنده میماند و پس از پایان رویداد توسط سیستم خاتمه مییابد، برخلاف ویجت که دائماً وجود دارد.
Live Activity دو حالت بهروزرسانی را پشتیبانی میکند: محلی — برنامه از طریق ActivityKit API در هر لحظه حالت را بهروزرسانی میکند، و push — سرور اعلان push ActivityKit را ارسال میکند که سیستم آن را به حالت جدید ویجت تبدیل میکند. در صورت شارژ کم باتری، سیستم ممکن است Live Activity را تا اتصال شارژر منجمد کند.
Live Activities روی iPhone با iOS 16.1 و جدیدتر در دسترس هستند. روی iPhone 14 Pro و جدیدتر Live Activity همچنین در Dynamic Island نمایش داده میشود. در iPad Live Activity فقط روی صفحه قفل پشتیبانی میشود — Dynamic Island در iPad وجود ندارد. Apple Watch مستقیماً از Live Activities پشتیبانی نمیکند اما میتواند اعلانهای اتمام را نمایش دهد.
سیستم تعداد Live Activities فعال را محدود میکند — معمولاً برای همه برنامهها بیش از ۵ همزمان نیست. در صورت تلاش برای فراتر از حد، ActivityKit خطا برمیگرداند. هر Live Activity میتواند چندین حالت داشته باشد — مثلاً در انتظار، در مسیر، تحویل شده برای سفارش غذا. پس از اتمام، Activity تا ۴ ساعت دیگر در UI باقی میماند.
بله، برنامه باید برای ارسال اعلانها مجوز درخواست کند — Live Activity از کانال اعلان سیستمی استفاده میکند. کاربر میتواند Live Activity را برای یک برنامه خاص در تنظیمات غیرفعال کند. در اولین راهاندازی ActivityKit، سیستم دیالوگ درخواست مجوز را نشان میدهد. بدون مجوز، درخواست Activity با خطا مواجه میشود.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید