Live Activity — iPhone-un bloklama ekranında və Dynamic Island-da real vaxt rejimində məlumat göstərən dinamik vidjet: çatdırılma statusu, idman hesabları, taymerlər və musiqi ifası. ActivityKit (Swift, iOS 16.1+) vasitəsilə WidgetKit ilə birlikdə həyata keçirilir. Live Activity lokal olaraq və ya push bildirişləri vasitəsilə yenilənir, bir neçə vəziyyəti dəstəkləyir və hadisə bitdikdən sonra sistem tərəfindən dayandırılır. Ətraflı — ActivityKit Documentation.
Əsas məqamlar
Live Activity — WidgetKit genişləndirməsi, iPhone-un bloklama ekranında və Dynamic Island-da dinamik məzmun göstərir. Sistem taymeri ilə yenilənən statik vidjetdən fərqli olaraq, Live Activity tətbiq tərəfindən işə salınır və məhdud müddət ərzində aktiv qalır — aktiv Activity üçün 8 saata qədər və tamamlandıqdan sonra 4 saata qədər. İstifadəçi cihazı blokdan açmadan aktual məlumatları görür: çatdırılma sifarişinin statusu, taksidə təyinat nöqtəsinə qədər məsafə, matç nəticəsi və ya məşqin gedişatı.
ActivityKit — iOS 16.1-də təqdim edilmiş Live Activities ilə işləmək üçün framework. Activity-nin tələbi, yenilənməsi və dayandırılması üçün API təmin edir. Activity — məzmunu və vəziyyəti olan obyektdir. Məzmun (ActivityContent) statik məlumatları, vəziyyət (ActivityState) isə zamanla dəyişən dinamik məlumatları müəyyən edir. Sistem yeni vəziyyətin nə vaxt render ediləcəyinə özü qərar verir — bu, batareyaya qənaət edir və animasiyaların hamarlığını təmin edir.
Hər bir Live Activity unikal olaraq ActivityID ilə identifikasiya olunur və onu yaradan tətbiqə aid edilir. Sistem yaddaş çatışmazlığı və ya batareyanın az olması halında Activity-ni dayandıra bilər. Developer ActivityKit delegatı vasitəsilə məcburi dayandırma barədə bildiriş alır və bərpa üçün son vəziyyəti saxlaya bilər.
Live Activity arxitekturası iki framework-ə əsaslanır: WidgetKit SwiftUI görünüşlərinin render edilməsinə, ActivityKit isə Activity-nin həyat dövrünə cavabdehdir. Developer LiveActivityConfiguration dəstəyi ilə WidgetBundle yaradır. Hər bir konfiqurasiya məlumat növünü (Attributes və State) və sistem tərəfindən Lock Screen və Dynamic Island-da render edilən SwiftUI View-i müəyyən edir. Məlumatlar ActivityAttributes vasitəsilə ötürülür — məzmun üçün let, vəziyyət üçün var sahələri olan struct.
| Komponent | Təyinat | API |
|---|---|---|
| Attributes | Bütün Activity-nin statik məlumatları | let name: String, let icon: String |
| ContentState | Yenilənərkən dəyişən dinamik vəziyyət | var progress: Double, var status: Status |
| Activity | Activity-nin tələb və idarəetmə obyekti | Activity.request(attributes:content:) |
| PushToken | Server push yeniləmələri üçün token | activity.pushToken publisher |
| ActivityUI | Lock Screen və Dynamic Island üçün SwiftUI View | LockScreenView, ExpandedView, CompactView |
Activity-nin həyat dövrü üç fazadan ibarətdir: aktiv (sistem göstərir və yeniləyir), final (aktivlik tamamlanıb, lakin UI 4 saat görünür), silinmiş (sistem UI-ni silir). Tətbiq Activity-ni istənilən vaxt dayandıra bilər. Sistem də Activity-ni məcburi dayandırır — məsələn, cihaz yenidən başladıqda və ya 8 saatlıq limit keçdikdə.
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 makrosu vasitəsilə qeydiyyatdan keçirir: vidjet LiveActivityConfiguration daxil olmaqla konfiqurasiyalar siyahısını qaytarır. Sistem bu konfiqurasiyaya əsasən hansı məlumat növlərini gözləyəcəyini və Dynamic Island üçün müxtəlif vəziyyətlərdə — kompakt, minimal və genişləndirilmiş — UI-ni necə render edəcəyini bilir.
Activity yaratmaq ActivityKit-ə sorğu ilə başlayır. Tətbiq Activity.request(attributes:content:pushType:) çağırışını ilkin məlumatlarla çağırır. Sistem Dynamic Island-ın cihazda mövcud olub-olmadığını yoxlayır və Activity obyektini qaytarır. Aktiv Activity-lərin sayı həddi aşdıqda sorğu xəta ilə nəticələnə bilər — adətən eyni anda 5-dən çox olmamalıdır. Uğurlu sorğudan sonra sistem Lock Screen-də və mümkünsə Dynamic Island-da vidjeti göstərir.
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 üçün SwiftUI View WidgetKit-dən LockScreenView, ExpandedView və CompactView strukturlarından istifadə edir. View cari atributlar və vəziyyətlə kontekst (ActivityViewContext) alır. View-in yenilənməsi sistemdən yeni vəziyyət alındıqda avtomatik baş verir. Live Activity yalnız məhdud SwiftUI komponentlərini dəstəkləyir — Text, Image, HStack, VStack və bir neçə modifier.
Hər bir Live Activity View yüngül və sürətli olmalıdır — sistem ağır görünüşləri render etməkdən imtina edir. Render vaxtı məhdudiyyəti — kadr başına 30 ms. Animasiyalar vəziyyətlər arasında sistem keçidləri ilə məhdudlaşır — Live Activity-də xüsusi animasiyalar mövcud deyil. Render WidgetKit fon prosesində Lock Screen-in cavabdehlik prioriteti ilə həyata keçirilir.
Lokal yeniləmə — tətbiq activity.update(using:) çağırışı ilə Activity-nin vəziyyətini yeniləyir. Metod yeni ContentState və yeniləmə zamanı bildiriş göstərmək üçün isteğe bağlı AlertConfiguration qəbul edir. Lokal yeniləmələr sürətlidir — sistem növbəti render dövründə View-i yenidən çəkir, adətən 1–2 saniyə ərzində. Tez-tez yeniləmələr (taymer, saniyəölçən) üçün lokal rejimdən istifadə edin — bu, push-dan daha etibarlı və sürətlidir.
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 yeniləmələri — server JSON formatında yeni vəziyyətlə ActivityKit push bildirişi göndərir. Bunun üçün tətbiq activity.pushToken publisher-dən pushToken alır və onu serverə ötürür. Server APNs-ə yeni ContentState ehtiva edən payload ilə POST sorğusu göndərir. Sistem push-u alır, vəziyyəti dekod edir və tətbiqin iştirakı olmadan Live Activity-ni yeniləyir — bu, tətbiq bağlı olsa belə Activity-ni yeniləməyə imkan verir.
Push yeniləmələri nadir yeniləmələr üçün (hər 5–10 dəqiqədə çatdırılma statusu) daha qənaətcildir — tətbiq şəbəkə bağlantısını saxlamalı deyil. Hər 1–2 saniyədən bir tez-tez yeniləmələr üçün lokal metoddan istifadə edin. Server payload yalnız dəyişən ContentState sahələrini ehtiva edir — Attributes-in statik məlumatları yalnız Activity yaradılarkən göndərilir.
Dynamic Island — iPhone 14 Pro, 15 Pro və daha yeni modellərdə Live Activity məzmununa uyğunlaşan aparat-proqram sahəsidir. Sistem Activity-ni avtomatik olaraq üç rejimdə göstərir: kompakt (kəsimin solunda ikon + qısa mətn), minimal (yalnız ikon) və genişləndirilmiş (məlumatlı 300pt düzbucaqlı). Developer bu rejimləri birbaşa idarə etmir — sistem rejimi prioritet və mövcud yerə əsasən seçir.
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 interaktivliyi dəstəkləyir — istifadəçi sahəyə toxunur və tətbiqə daxil olur və ya genişləndirilmiş görünüşü açır. Kompakt rejimə toxunma genişləndirilmiş rejimə keçir, sola sürüşdürmə isə Activity-ni minimallaşdırır. Genişləndirilmiş rejimdə düymələr (pause/cancel) SwiftUI-dən Link vasitəsilə işlənir — sistem deep link URL ilə tətbiqi işə salır, emal UIApplicationDelegate-də aparılır.
Dynamic Island məhdudiyyətləri: genişləndirilmiş rejimin eni — 300pt-dək, kompakt mətn — 30 simvoladək. Rənglər və şriftlər sistem mövzusuna uyğundur — fərdiləşdirmə məhduddur. Rejimlər arasında keçid animasiyaları sistemdir və konfiqurasiya edilə bilməz. Bir neçə tətbiqin aktiv Activity-si varsa, Dynamic Island onları işə salma vaxtı və məzmun növünə görə prioritetlə göstərir.
Tez-tez verilən suallar
Adi WidgetKit vidjeti statik məlumat göstərir və sistem taymeri ilə minimum 15–30 dəqiqə intervalında yenilənir. Live Activity bloklama ekranında və Dynamic Island-da real vaxtda dinamik məlumatlar göstərir. Live Activity tətbiq tərəfindən işə salınır, 8 saata qədər yaşayır və hadisə bitdikdən sonra sistem tərəfindən dayandırılır, daim mövcud olan vidjetdən fərqli olaraq.
Live Activity iki yeniləmə rejimini dəstəkləyir: lokal — tətbiq ActivityKit API vasitəsilə istənilən vaxt vəziyyəti yeniləyir, və push — server sistemin vidjetin yeni vəziyyətinə çevirdiyi ActivityKit push bildirişi göndərir. Batareya səviyyəsi aşağı olduqda sistem şarj qoşulana qədər Live Activity-ni dondura bilər.
Live Activities iOS 16.1 və daha yeni versiyası olan iPhone-larda mövcuddur. iPhone 14 Pro və daha yeni modellərdə Live Activity həmçinin Dynamic Island-da göstərilir. iPad-də Live Activity yalnız bloklama ekranında dəstəklənir — iPad-də Dynamic Island yoxdur. Apple Watch Live Activities-i birbaşa dəstəkləmir, lakin tamamlanma barədə bildirişləri göstərə bilər.
Sistem aktiv Live Activities sayını məhdudlaşdırır — adətən bütün tətbiqlər üçün eyni anda 5-dən çox olmamalıdır. Limiti aşmaq cəhdi zamanı ActivityKit xəta qaytarır. Hər bir Live Activity bir neçə vəziyyətə malik ola bilər — məsələn, gözləmə, yolda, çatdırıldı. Tamamlandıqdan sonra Activity UI-də daha 4 saat qalır.
Bəli, tətbiq bildirişlərin göndərilməsi üçün icazə istəməlidir — Live Activity sistem bildiriş kanalından istifadə edir. İstifadəçi parametrlərdə müəyyən tətbiq üçün Live Activity-ni söndürə bilər. ActivityKit ilk işə salındıqda sistem icazə sorğusu ilə dialoq göstərir. İcazə olmadan Activity sorğusu xəta ilə nəticələnir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun