Live Activity — چیست، ویجت‌های روی صفحه قفل

نویسنده: IT Sectr منتشر شده: 2026-02-15 زمان مطالعه: 9 دقیقه

Live Activity — ویجت دینامیک روی صفحه قفل iPhone و در Dynamic Island که اطلاعات را به صورت بلادرنگ نمایش می‌دهد: وضعیت تحویل، نتایج ورزشی، تایمرها و پخش موسیقی. از طریق ActivityKit (Swift، iOS 16.1+) به همراه WidgetKit پیاده‌سازی می‌شود. Live Activity به صورت محلی یا از طریق اعلان‌های push به‌روزرسانی می‌شود، چندین حالت را پشتیبانی می‌کند و پس از پایان رویداد توسط سیستم خاتمه می‌یابد. جزئیات بیشتر — در ActivityKit Documentation.

نکات اصلی

  • Live Activity — ویجت بلادرنگ روی Lock Screen و Dynamic Island
  • ActivityKit — فریم‌ورک راه‌اندازی و مدیریت Live Activities در iOS 16.1+
  • به‌روزرسانی‌های Push — سرور وضعیت جدید را از طریق اعلان‌های push ActivityKit ارسال می‌کند
  • حالت‌ها — هر Activity از حالت‌های فعال و تکمیل شده با UI متفاوت پشتیبانی می‌کند
  • Dynamic Island — نمایش فشرده Live Activity روی iPhone 14 Pro و جدیدتر

Live Activity چیست — ویجت روی Lock Screen؟

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 از خاتمه اجباری مطلع می‌شود و می‌تواند آخرین حالت را برای بازیابی ذخیره کند.

معماری ActivityKit و WidgetKit

معماری Live Activity بر دو فریم‌ورک استوار است: WidgetKit مسئول رندر کردن نمایش‌های SwiftUI، ActivityKit مسئول چرخه حیات Activity. توسعه‌دهنده WidgetBundle با پشتیبانی LiveActivityConfiguration ایجاد می‌کند. هر پیکربندی نوع داده (Attributes و State) و SwiftUI View را که توسط سیستم روی Lock Screen و Dynamic Island رندر می‌شود تعریف می‌کند. داده‌ها از طریق ActivityAttributes — struct با فیلدهای let برای محتوا و var برای حالت — منتقل می‌شوند.

کامپوننتکاربردAPI
Attributesداده‌های ایستای کل Activitylet name: String, let icon: String
ContentStateحالت دینامیک که در به‌روزرسانی تغییر می‌کندvar progress: Double, var status: Status
Activityشی درخواست و مدیریت ActivityActivity.request(attributes:content:)
PushTokenتوکن برای به‌روزرسانی‌های push سرورactivity.pushToken publisher
ActivityUISwiftUI View برای Lock Screen و Dynamic IslandLockScreenView, ExpandedView, CompactView

چرخه حیات Activity شامل سه فاز است: فعال (سیستم نمایش و به‌روزرسانی می‌کند)، نهایی (فعالیت تمام شده اما UI هنوز ۴ ساعت قابل مشاهده است)، حذف شده (سیستم UI را حذف می‌کند). برنامه می‌تواند Activity را در هر لحظه خاتمه دهد. سیستم نیز Activity را به صورت اجباری خاتمه می‌دهد — مثلاً در راه‌اندازی مجدد دستگاه یا پس از گذشت محدودیت ۸ ساعته.

swift
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 — رندر کند.

ایجاد Live Activity با WidgetKit و SwiftUI

ایجاد Activity با درخواست به ActivityKit آغاز می‌شود. برنامه Activity.request(attributes:content:pushType:) را با داده‌های اولیه فراخوانی می‌کند. سیستم بررسی می‌کند که آیا Dynamic Island روی دستگاه در دسترس است و شی Activity را برمی‌گرداند. درخواست ممکن است در صورت تجاوز از محدودیت Activity‌های فعال — معمولاً بیش از ۵ همزمان — با خطا مواجه شود. پس از درخواست موفق، سیستم ویجت را روی Lock Screen و در صورت امکان در Dynamic Island نمایش می‌دهد.

swift
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 انجام می‌شود.

به‌روزرسانی Live Activity به صورت محلی و از طریق push

به‌روزرسانی محلی — برنامه حالت Activity را با فراخوانی activity.update(using:) به‌روزرسانی می‌کند. متد ContentState جدید و AlertConfiguration اختیاری برای نمایش اعلان در هنگام به‌روزرسانی دریافت می‌کند. به‌روزرسانی‌های محلی سریع هستند — سیستم View را در چرخه رندر بعدی، معمولاً ظرف ۱–۲ ثانیه، دوباره ترسیم می‌کند. برای به‌روزرسانی‌های مکرر (تایمر، کرونومتر) از حالت محلی استفاده کنید — این روش قابل‌اعتمادتر و سریع‌تر از push است.

swift
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 ارسال می‌شوند.

نمایش Live Activity در Dynamic Island

Dynamic Island — ناحیه سخت‌افزاری-نرم‌افزاری در iPhone 14 Pro، 15 Pro و جدیدتر که با محتوای Live Activity سازگار می‌شود. سیستم به طور خودکار Activity را در سه حالت نمایش می‌دهد: فشرده (آیکون + متن کوتاه در سمت چپ بریدگی)، حداقلی (فقط آیکون) و گسترده (مستطیل ۳۰۰pt با اطلاعات). توسعه‌دهنده این حالت‌ها را مستقیماً مدیریت نمی‌کند — سیستم حالت را بر اساس اولویت و فضای موجود انتخاب می‌کند.

swift
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 آنها را با اولویت بر اساس زمان راه‌اندازی و نوع محتوا نمایش می‌دهد.

سوالات متداول

Live Activity چه تفاوتی با ویجت معمولی دارد؟

ویجت معمولی WidgetKit اطلاعات ایستا نمایش می‌دهد و طبق تایمر سیستم با حداقل فاصله ۱۵–۳۰ دقیقه به‌روزرسانی می‌شود. Live Activity داده‌های دینامیک را به صورت بلادرنگ روی صفحه قفل و Dynamic Island نشان می‌دهد. Live Activity توسط برنامه راه‌اندازی می‌شود، تا ۸ ساعت زنده می‌ماند و پس از پایان رویداد توسط سیستم خاتمه می‌یابد، برخلاف ویجت که دائماً وجود دارد.

Live Activity چند وقت یکبار به‌روزرسانی می‌شود؟

Live Activity دو حالت به‌روزرسانی را پشتیبانی می‌کند: محلی — برنامه از طریق ActivityKit API در هر لحظه حالت را به‌روزرسانی می‌کند، و push — سرور اعلان push ActivityKit را ارسال می‌کند که سیستم آن را به حالت جدید ویجت تبدیل می‌کند. در صورت شارژ کم باتری، سیستم ممکن است Live Activity را تا اتصال شارژر منجمد کند.

Live Activities روی چه دستگاه‌هایی کار می‌کنند؟

Live Activities روی iPhone با iOS 16.1 و جدیدتر در دسترس هستند. روی iPhone 14 Pro و جدیدتر Live Activity همچنین در Dynamic Island نمایش داده می‌شود. در iPad Live Activity فقط روی صفحه قفل پشتیبانی می‌شود — Dynamic Island در iPad وجود ندارد. Apple Watch مستقیماً از Live Activities پشتیبانی نمی‌کند اما می‌تواند اعلان‌های اتمام را نمایش دهد.

چند Live Activity می‌تواند همزمان کار کند؟

سیستم تعداد Live Activities فعال را محدود می‌کند — معمولاً برای همه برنامه‌ها بیش از ۵ همزمان نیست. در صورت تلاش برای فراتر از حد، ActivityKit خطا برمی‌گرداند. هر Live Activity می‌تواند چندین حالت داشته باشد — مثلاً در انتظار، در مسیر، تحویل شده برای سفارش غذا. پس از اتمام، Activity تا ۴ ساعت دیگر در UI باقی می‌ماند.

آیا برای Live Activity مجوز کاربر نیاز است؟

بله، برنامه باید برای ارسال اعلان‌ها مجوز درخواست کند — Live Activity از کانال اعلان سیستمی استفاده می‌کند. کاربر می‌تواند Live Activity را برای یک برنامه خاص در تنظیمات غیرفعال کند. در اولین راه‌اندازی ActivityKit، سیستم دیالوگ درخواست مجوز را نشان می‌دهد. بدون مجوز، درخواست Activity با خطا مواجه می‌شود.

خلاصه

  • Live Activity — ویجت دینامیک روی Lock Screen و Dynamic Island با به‌روزرسانی بلادرنگ
  • ActivityKit — فریم‌ورک iOS 16.1+ برای مدیریت چرخه حیات Live Activities
  • Attributes and State — داده‌های ایستا و حالت دینامیک Activity که به SwiftUI View منتقل می‌شوند
  • به‌روزرسانی‌های Push — سرور حالت جدید را از طریق APNs بدون دخالت برنامه ارسال می‌کند
  • Dynamic Island — سه حالت نمایش: فشرده، حداقلی و مستطیل گسترده
  • محدودیت‌ها — تا ۵ Activity فعال، تا ۸ ساعت عمر، تا ۴ ساعت پس از اتمام
  • AlertConfiguration — اعلان اختیاری در هنگام به‌روزرسانی حالت Activity

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید