Live Activity — ce este, widgeturi pe ecranul de blocare

Autor: IT Sectr Publicat: 2026-02-15 Timp de citire: 9 min

Live Activity — un widget dinamic pe ecranul de blocare al iPhone și în Dynamic Island, care afișează informații în timp real: statusul livrării, scoruri sportive, cronometre și redare muzică. Se implementează prin ActivityKit (Swift, iOS 16.1+) împreună cu WidgetKit. Live Activity se actualizează local sau prin notificări push, suportă mai multe stări și este încheiat de sistem după terminarea evenimentului. Mai multe pe ActivityKit Documentation.

Principalele puncte

  • Live Activity — widget în timp real pe Lock Screen și Dynamic Island
  • ActivityKit — framework pentru lansarea și gestionarea Live Activities în iOS 16.1+
  • Actualizări push — serverul trimite o stare nouă prin notificări push ActivityKit
  • Stări — fiecare Activity suportă stări active și finalizate cu UI diferite
  • Dynamic Island — afișare compactă Live Activity pe iPhone 14 Pro și mai noi

Ce este Live Activity — widget pe Lock Screen?

Live Activity — o extensie WidgetKit care afișează conținut dinamic pe ecranul de blocare al iPhone și în Dynamic Island. Spre deosebire de widgetul static care se actualizează după timerul sistemului, Live Activity este lansat de aplicație și trăiește un timp limitat — până la 8 ore pentru o Activity activă și până la 4 ore după finalizare. Utilizatorul vede datele actuale fără a debloca dispozitivul: statusul comenzii de livrare, distanța până la destinație în taxi, rezultatul meciului sau progresul antrenamentului.

ActivityKit — framework pentru lucrul cu Live Activities, introdus în iOS 16.1. Oferă API pentru solicitarea, actualizarea și încheierea Activity. Activity este un obiect cu conținut și stare. Conținutul (ActivityContent) definește datele statice, iar starea (ActivityState) — cele dinamice care se modifică în timp. Sistemul decide singur când să redeze noua stare — economisește bateria și garantează fluiditatea animațiilor.

Fiecare Live Activity este identificată unic prin ActivityID și legată de un singur proces — aplicația care a creat-o. Sistemul poate încheia Activity la insuficiență de memorie sau baterie scăzută. Dezvoltatorul primește notificare despre încheierea forțată prin delegatul ActivityKit și poate salva ultima stare pentru restaurare.

Arhitectura ActivityKit și WidgetKit

Arhitectura Live Activity se bazează pe două frameworkuri: WidgetKit răspunde de randarea vizualizărilor SwiftUI, ActivityKit — de ciclul de viață al Activity. Dezvoltatorul creează WidgetBundle cu suport pentru LiveActivityConfiguration. Fiecare configurație definește tipul de date (Attributes și State) și SwiftUI View care este randată de sistem pe Lock Screen și Dynamic Island. Datele sunt transmise prin ActivityAttributes — struct cu câmpuri let pentru conținut și var pentru stare.

ComponentăRolAPI
AttributesDate statice ale întregii Activitylet name: String, let icon: String
ContentStateStare dinamică, modificată la actualizarevar progress: Double, var status: Status
ActivityObiect de solicitare și gestionare a ActivityActivity.request(attributes:content:)
PushTokenToken pentru actualizări push de la serveractivity.pushToken publisher
ActivityUISwiftUI View pentru Lock Screen și Dynamic IslandLockScreenView, ExpandedView, CompactView

Ciclul de viață al Activity include trei faze: activă (sistemul afișează și actualizează), finală (activitatea s-a încheiat dar UI mai este vizibil 4 ore), ștearsă (sistemul elimină UI). Aplicația poate încheia Activity în orice moment. Sistemul încheie și el Activity forțat — de exemplu, la repornirea dispozitivului sau la expirarea limitei de 8 ore.

swift
import ActivityKit

struct DeliveryAttributes: ActivityAttributes {
    public struct ContentState: Codable & Hashable {
        var status: DeliveryStatus
        var estimatedMinutes: Int
    }
    var orderNumber: String
    var restaurantName: String
}

WidgetBundle înregistrează Live Activity prin macrocomanda @main: widgetul returnează o listă de configurații, inclusiv LiveActivityConfiguration. Pe baza acestei configurații, sistemul știe ce tipuri de date să aștepte și cum să redeze UI în diferite stări — compact, minim și extins pentru Dynamic Island.

Crearea Live Activity cu WidgetKit și SwiftUI

Crearea Activity începe cu o solicitare către ActivityKit. Aplicația apelează Activity.request(attributes:content:pushType:) cu datele inițiale. Sistemul verifică dacă Dynamic Island este disponibil pe dispozitiv și returnează un obiect Activity. Solicitarea poate eșua dacă limita de Activity active este depășită — de obicei nu mai mult de 5 simultan. După o solicitare reușită, sistemul afișează widgetul pe Lock Screen și, dacă este posibil, în 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 pentru Live Activity folosește structurile LockScreenView, ExpandedView și CompactView din WidgetKit. View primește contextul (ActivityViewContext) cu atributele și starea curentă. Actualizarea View are loc automat la primirea unei noi stări de la sistem. Live Activity suportă doar un set limitat de componente SwiftUI — Text, Image, HStack, VStack și câțiva modificatori.

Fiecare Live Activity View trebuie să fie ușoară și rapidă — sistemul refuză să redea vizualizări grele. Limita de timp pentru randare — 30 ms per cadru. Animațiile sunt limitate la tranzițiile sistemice între stări — animațiile personalizate în Live Activity nu sunt disponibile. Randarea se execută în fundal de procesul WidgetKit cu prioritatea de receptivitate a Lock Screen.

Actualizarea Live Activity local și prin push

Actualizarea locală — aplicația actualizează starea Activity apelând activity.update(using:). Metoda primește un nou ContentState și un AlertConfiguration opțional pentru afișarea notificării la actualizare. Actualizările locale sunt rapide — sistemul redesenează View în următorul ciclu de randare, de obicei în 1–2 secunde. Pentru actualizări frecvente (timer, cronometru) folosiți modul local — este mai fiabil și mai rapid decât 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"
    )
)

Actualizările push — serverul trimite o notificare push ActivityKit cu o stare nouă în format JSON. Pentru aceasta, aplicația obține pushToken din activity.pushToken publisher și îl transmite serverului. Serverul trimite o cerere POST la APNs cu payload care conține noul ContentState. Sistemul primește push, decodează starea și actualizează Live Activity fără participarea aplicației — acest lucru permite actualizarea Activity chiar și când aplicația este închisă.

Actualizările push sunt mai economice decât cele locale pentru actualizări rare (statusul livrării la fiecare 5–10 minute) — aplicația nu trebuie să mențină o conexiune de rețea. Pentru actualizări frecvente la fiecare 1–2 secunde folosiți metoda locală. Payloadul serverului include doar câmpurile modificabile ale ContentState — datele statice Attributes sunt trimise doar la crearea Activity.

Afișarea Live Activity în Dynamic Island

Dynamic Island — o zonă hardware-software pe iPhone 14 Pro, 15 Pro și mai noi care se adaptează la conținutul Live Activity. Sistemul afișează automat Activity în trei moduri: compact (pictogramă + text scurt la stânga decupajului), minim (doar pictogramă) și extins (dreptunghi de 300pt cu informații). Dezvoltatorul nu gestionează direct aceste moduri — sistemul alege modul pe baza priorității și spațiului disponibil.

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 suportă interactivitate — utilizatorul atinge zona și intră în aplicație sau deschide vizualizarea extinsă. Atingerea modului compact trece în modul extins, iar glisarea la stânga ascunde Activity în modul minim. Butoanele în modul extins (pause/cancel) sunt gestionate prin Link din SwiftUI — sistemul lansează aplicația cu un URL deep link, procesarea se face în UIApplicationDelegate.

Limitările Dynamic Island: lățimea modului extins — până la 300pt, textul compact — până la 30 caractere. Culorile și fonturile corespund temei sistemului — personalizarea este limitată. Animațiile de tranziție între moduri sunt sistemice și nu se configurează. Dacă mai multe aplicații au Activity active, Dynamic Island le afișează cu prioritate după timpul de lansare și tipul conținutului.

Întrebări frecvente

Cu ce se deosebește Live Activity de un widget obișnuit?

Widgetul obișnuit WidgetKit afișează informații statice și se actualizează după timerul sistemului cu un interval minim de 15–30 minute. Live Activity arată date dinamice în timp real pe ecranul de blocare și Dynamic Island. Live Activity este lansat de aplicație, trăiește până la 8 ore și este încheiat de sistem după terminarea evenimentului, spre deosebire de widgetul care există permanent.

Cât de des se actualizează Live Activity?

Live Activity suportă două moduri de actualizare: local — aplicația actualizează starea prin API-ul ActivityKit în orice moment, și push — serverul trimite o notificare push ActivityKit pe care sistemul o transformă în noua stare a widgetului. La baterie scăzută, sistemul poate îngheța Live Activity până la conectarea încărcătorului.

Pe ce dispozitive funcționează Live Activities?

Live Activities sunt disponibile pe iPhone cu iOS 16.1 și mai nou. Pe iPhone 14 Pro și mai noi, Live Activity se afișează și în Dynamic Island. Pe iPad, Live Activity este suportat doar pe ecranul de blocare — Dynamic Island nu există pe iPad. Apple Watch nu suportă Live Activities direct, dar poate afișa notificări de finalizare.

Câte Live Activities pot funcționa simultan?

Sistemul limitează numărul de Live Activities active — de obicei nu mai mult de 5 simultan pentru toate aplicațiile. La încercarea de a depăși limita, ActivityKit returnează o eroare. Fiecare Live Activity poate avea mai multe stări — de exemplu, în așteptare, în tranzit, livrat pentru o comandă de mâncare. După finalizare, Activity rămâne în UI încă 4 ore.

Este necesară permisiunea utilizatorului pentru Live Activity?

Da, aplicația trebuie să solicite permisiunea pentru trimiterea notificărilor — Live Activity folosește canalul de notificări al sistemului. Utilizatorul poate dezactiva Live Activity pentru o aplicație specifică în setări. La prima lansare, ActivityKit arată un dialog de solicitare a permisiunii. Fără permisiune, solicitarea Activity eșuează cu eroare.

Concluzii

  • Live Activity — widget dinamic pe Lock Screen și Dynamic Island cu actualizare în timp real
  • ActivityKit — framework iOS 16.1+ pentru gestionarea ciclului de viață al Live Activities
  • Attributes and State — date statice și stare dinamică ale Activity, transmise către SwiftUI View
  • Actualizări push — serverul trimite o stare nouă prin APNs fără participarea aplicației
  • Dynamic Island — trei moduri de afișare: compact, minim și dreptunghi extins
  • Limite — până la 5 Activity active, până la 8 ore de viață, până la 4 ore după finalizare
  • AlertConfiguration — notificare opțională la actualizarea stării Activity

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și