Live Activity — iPhone bloklash ekrani va Dynamic Island-da real vaqtda ma'lumot ko'rsatadigan dinamik vidjet: yetkazib berish holati, sport hisoblari, taymerlar va musiqa ijrosi. ActivityKit (Swift, iOS 16.1+) orqali WidgetKit bilan birga amalga oshiriladi. Live Activity mahalliy yoki push bildirishnomalari orqali yangilanadi, bir nechta holatlarni qo'llab-quvvatlaydi va voqea tugagandan so'ng tizim tomonidan yakunlanadi. Batafsil — ActivityKit Documentation.
Asosiy ma'lumotlar
Live Activity — WidgetKit kengaytmasi, iPhone bloklash ekrani va Dynamic Island da dinamik tarkibni ko'rsatadi. Tizim taymeri bo'yicha yangilanadigan statik vidjetdan farqli o'laroq, Live Activity ilova tomonidan ishga tushiriladi va cheklangan vaqt davomida yashaydi — faol Activity uchun 8 soatgacha va tugagandan so'ng 4 soatgacha. Foydalanuvchi qurilmani qulfdan ochmasdan dolzarb ma'lumotlarni ko'radi: yetkazib berish buyurtmasi holati, taksidagi manzilgacha masofa, o'yin natijasi yoki mashg'ulot jarayoni.
ActivityKit — iOS 16.1 da taqdim etilgan Live Activities bilan ishlash uchun freymvork. Activity so'rash, yangilash va yakunlash uchun API taqdim etadi. Activity — mazmun va holatga ega ob'ekt. Mazmun (ActivityContent) statik ma'lumotlarni, holat (ActivityState) esa vaqt o'tishi bilan o'zgaruvchi dinamik ma'lumotlarni belgilaydi. Tizim yangi holatni qachon render qilishni o'zi hal qiladi — bu batareyani tejaydi va animatsiyalarning silliqligini ta'minlaydi.
Har bir Live Activity noyob ActivityID bilan identifikatsiya qilinadi va uni yaratgan ilovaga bog'lanadi. Tizim xotira yetishmasligi yoki batareya past bo'lganda Activity ni yakunlashi mumkin. Ishlab chiquvchi ActivityKit delegati orqali majburiy yakunlash haqida xabarnoma oladi va tiklash uchun oxirgi holatni saqlashi mumkin.
Live Activity arxitekturasi ikki freymvorkka asoslanadi: WidgetKit SwiftUI ko'rinishlarini render qilish uchun, ActivityKit esa Activity hayotiy sikli uchun javobgardir. Ishlab chiquvchi LiveActivityConfiguration qo'llab-quvvatlashi bilan WidgetBundle yaratadi. Har bir konfiguratsiya ma'lumot turini (Attributes va State) va tizim tomonidan Lock Screen va Dynamic Island da render qilinadigan SwiftUI View ni belgilaydi. Ma'lumotlar ActivityAttributes orqali uzatiladi — mazmun uchun let va holat uchun var maydonlariga ega struct.
| Komponent | Maqsad | API |
|---|---|---|
| Attributes | Butun Activity ning statik ma'lumotlari | let name: String, let icon: String |
| ContentState | Yangilanishda o'zgaruvchi dinamik holat | var progress: Double, var status: Status |
| Activity | Activity so'rovi va boshqaruvi ob'ekti | Activity.request(attributes:content:) |
| PushToken | Server push yangilanishlari uchun token | activity.pushToken publisher |
| ActivityUI | Lock Screen va Dynamic Island uchun SwiftUI View | LockScreenView, ExpandedView, CompactView |
Activity hayotiy sikli uch fazadan iborat: faol (tizim ko'rsatadi va yangilaydi), yakuniy (faoliyat tugagan, lekin UI 4 soat ko'rinadi), o'chirilgan (tizim UI ni olib tashlaydi). Ilova Activity ni istalgan vaqtda yakunlashi mumkin. Tizim ham Activity ni majburiy yakunlaydi — masalan, qurilma qayta ishga tushirilganda yoki 8 soatlik limit tugaganda.
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 ni @main makrosi orqali ro'yxatdan o'tkazadi: vidjet LiveActivityConfiguration ni o'z ichiga olgan konfiguratsiyalar ro'yxatini qaytaradi. Tizim ushbu konfiguratsiyaga asoslanib, qanday ma'lumot turlarini kutishni va Dynamic Island uchun turli holatlarda — ixcham, minimal va kengaytirilgan — UI ni qanday render qilishni biladi.
Activity yaratish ActivityKit ga so'rov bilan boshlanadi. Ilova Activity.request(attributes:content:pushType:) ni boshlang'ich ma'lumotlar bilan chaqiradi. Tizim Dynamic Island qurilmada mavjudligini tekshiradi va Activity ob'ektini qaytaradi. Faol Activity lar limiti oshib ketganda so'rov xato bilan tugashi mumkin — odatda bir vaqtning o'zida 5 tadan ko'p bo'lmasligi kerak. Muvaffaqiyatli so'rovdan so'ng, tizim vidjetni Lock Screen da va iloji bo'lsa Dynamic Island da ko'rsatadi.
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)")
}
Live Activity uchun SwiftUI View WidgetKit dan LockScreenView, ExpandedView va CompactView strukturalaridan foydalanadi. View joriy atributlar va holat bilan kontekst (ActivityViewContext) oladi. View ning yangilanishi tizimdan yangi holat olinganda avtomatik ravishda sodir bo'ladi. Live Activity faqat cheklangan SwiftUI komponentlarini qo'llab-quvvatlaydi — Text, Image, HStack, VStack va bir nechta modifier.
Har bir Live Activity View engil va tez bo'lishi kerak — tizim og'ir ko'rinishlarni render qilishdan bosh tortadi. Render vaqti chegarasi — kadr uchun 30 ms. Animatsiyalar holatlar orasidagi tizim o'tishlari bilan cheklangan — Live Activity da maxsus animatsiyalar mavjud emas. Render WidgetKit fon jarayonida Lock Screen javob berish ustuvorligi bilan amalga oshiriladi.
Mahalliy yangilash — ilova activity.update(using:) chaqiruvi bilan Activity holatini yangilaydi. Metod yangi ContentState va yangilanishda bildirishnoma ko'rsatish uchun ixtiyoriy AlertConfiguration qabul qiladi. Mahalliy yangilanishlar tez — tizim keyingi render siklida View ni qayta chizadi, odatda 1-2 soniya ichida. Tez-tez yangilanishlar (taymer, sekundomer) uchun mahalliy rejimdan foydalaning — bu push dan ishonchliroq va tezroq.
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 yangilanishlari — server JSON formatida yangi holat bilan ActivityKit push bildirishnomasi yuboradi. Buning uchun ilova activity.pushToken publisher dan pushToken oladi va serverni uzatadi. Server APNs ga yangi ContentState ni o'z ichiga olgan payload bilan POST so'rovi yuboradi. Tizim push ni qabul qiladi, holatni dekodlaydi va ilova ishtirokisiz Live Activity ni yangilaydi — bu ilova yopiq bo'lganda ham Activity ni yangilash imkonini beradi.
Push yangilanishlari kamdan-kam yangilanishlar uchun (har 5-10 daqiqada yetkazib berish holati) tejamliroq — ilova tarmoq ulanishini ushlab turishi shart emas. Har 1-2 soniyada tez-tez yangilanishlar uchun mahalliy usuldan foydalaning. Server payload faqat o'zgaruvchan ContentState maydonlarini o'z ichiga oladi — Attributes statik ma'lumotlari faqat Activity yaratilganda yuboriladi.
Dynamic Island — iPhone 14 Pro, 15 Pro va undan yangilarida Live Activity mazmuniga moslashadigan apparat-dasturiy maydoni. Tizim Activity ni avtomatik ravishda uch rejimda ko'rsatadi: ixcham (kesimning chap tomonida ikonka + qisqa matn), minimal (faqat ikonka) va kengaytirilgan (ma'lumotli 300pt to'rtburchak). Ishlab chiquvchi bu rejimlarni bevosita boshqarmaydi — tizim rejimni ustuvorlik va mavjud joyga qarab tanlaydi.
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 interaktivlikni qo'llab-quvvatlaydi — foydalanuvchi maydonga tegadi va ilovaga kiradi yoki kengaytirilgan ko'rinishni ochadi. Ixcham rejimga tegish kengaytirilgan rejimga o'tadi, chapga surish esa Activity ni minimal rejimga yashiradi. Kengaytirilgan rejimdagi tugmalar (pause/cancel) SwiftUI dan Link orqali qayta ishlanadi — tizim ilovani deep link URL bilan ishga tushiradi, qayta ishlash UIApplicationDelegate da amalga oshiriladi.
Dynamic Island cheklovlari: kengaytirilgan rejim kengligi — 300pt gacha, ixcham matn — 30 belgigacha. Ranglar va shriftlar tizim mavzusiga mos keladi — sozlash cheklangan. Rejimlar orasidagi o'tish animatsiyalari tizimga oid va sozlanmaydi. Agar bir nechta ilovalar faol Activity larga ega bo'lsa, Dynamic Island ularni ishga tushirish vaqti va tarkib turiga qarab ustuvorlik bilan ko'rsatadi.
Tez-tez beriladigan savollar
Oddiy WidgetKit vidjeti statik ma'lumotlarni ko'rsatadi va tizim taymeri bo'yicha minimal 15-30 daqiqa intervalida yangilanadi. Live Activity bloklash ekrani va Dynamic Island da real vaqtda dinamik ma'lumotlarni ko'rsatadi. Live Activity ilova tomonidan ishga tushiriladi, 8 soatgacha yashaydi va voqea tugagandan so'ng tizim tomonidan yakunlanadi, doimiy mavjud vidjetdan farqli o'laroq.
Live Activity ikki yangilash rejimini qo'llab-quvvatlaydi: mahalliy — ilova ActivityKit API orqali istalgan vaqtda holatni yangilaydi, va push — server tizim vidjetning yangi holatiga aylantiradigan ActivityKit push bildirishnomasini yuboradi. Batareya darajasi past bo'lganda, tizim zaryadlovchi ulanguncha Live Activity ni muzlatishi mumkin.
Live Activities iOS 16.1 va undan yangi iPhone larda mavjud. iPhone 14 Pro va undan yangilarida Live Activity Dynamic Island da ham ko'rsatiladi. iPad da Live Activity faqat bloklash ekranida qo'llab-quvvatlanadi — iPad da Dynamic Island mavjud emas. Apple Watch Live Activities ni to'g'ridan-to'g'ri qo'llab-quvvatlamaydi, lekin yakunlash haqidagi bildirishnomalarni ko'rsatishi mumkin.
Tizim faol Live Activities sonini cheklaydi — odatda barcha ilovalar uchun bir vaqtning o'zida 5 tadan ko'p bo'lmasligi kerak. Limitdan oshib ketishga urinishda ActivityKit xato qaytaradi. Har bir Live Activity bir nechta holatga ega bo'lishi mumkin — masalan, kutish, yo'lda, yetkazilgan. Yakunlangandan so'ng, Activity UI da yana 4 soat qoladi.
Ha, ilova bildirishnomalarni yuborish uchun ruxsat so'rashi kerak — Live Activity tizim bildirishnomalar kanalidan foydalanadi. Foydalanuvchi sozlamalarda ma'lum bir ilova uchun Live Activity ni o'chirib qo'yishi mumkin. Birinchi ishga tushirishda ActivityKit ruxsat so'rovi bilan dialog oynasini ko'rsatadi. Ruxsatsiz Activity so'rovi xato bilan tugaydi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.