Live Activity — qué es, widgets en la pantalla de bloqueo

Autor: IT Sectr Publicado: 2026-02-15 Tiempo de lectura: 9 min

Live Activity es un widget dinámico en la pantalla de bloqueo del iPhone y en Dynamic Island que muestra información en tiempo real: estado de entrega, resultados deportivos, temporizadores y reproducción de música. Se implementa mediante ActivityKit (Swift, iOS 16.1+) junto con WidgetKit. Live Activity se actualiza localmente o mediante notificaciones push, admite múltiples estados y el sistema lo finaliza después de que termina el evento. Más información en ActivityKit Documentation.

Puntos clave

  • Live Activity — widget en tiempo real en la pantalla de bloqueo y Dynamic Island
  • ActivityKit — framework para iniciar y gestionar Live Activities en iOS 16.1+
  • Actualizaciones push — el servidor envía un nuevo estado mediante notificaciones push de ActivityKit
  • Estados — cada Activity admite estados activo y finalizado con diferentes IU
  • Dynamic Island — visualización compacta de Live Activity en iPhone 14 Pro y posteriores

¿Qué es Live Activity? — Widget en la pantalla de bloqueo

Live Activity es una extensión de WidgetKit que muestra contenido dinámico en la pantalla de bloqueo del iPhone y en Dynamic Island. A diferencia de un widget estático que se actualiza mediante un temporizador del sistema, Live Activity se inicia por la aplicación y vive un tiempo limitado — hasta 8 horas para una Activity activa y hasta 4 horas después de finalizar. El usuario ve datos actualizados sin desbloquear el dispositivo: estado del pedido de entrega, distancia al destino en un taxi, resultados de un partido o progreso de un entrenamiento.

ActivityKit es un framework para trabajar con Live Activities, presentado en iOS 16.1. Proporciona una API para solicitar, actualizar y finalizar Activities. Una Activity es un objeto con contenido y estado. El contenido (ActivityContent) define datos estáticos, mientras que el estado (ActivityState) define datos dinámicos que cambian con el tiempo. El propio sistema decide cuándo renderizar el nuevo estado — esto ahorra batería y garantiza animaciones fluidas.

Cada Live Activity se identifica de forma única por un ActivityID y está vinculada a un proceso — la aplicación que la creó. El sistema puede finalizar la Activity cuando hay poca memoria o batería baja. El desarrollador recibe una notificación de terminación forzada a través del delegado de ActivityKit y puede guardar el último estado para restaurarlo.

Arquitectura de ActivityKit y WidgetKit

La arquitectura de Live Activity se basa en dos frameworks: WidgetKit se encarga del renderizado de las vistas SwiftUI, ActivityKit gestiona el ciclo de vida de la Activity. El desarrollador crea un WidgetBundle con soporte para LiveActivityConfiguration. Cada configuración define el tipo de datos (Attributes y State) y una vista SwiftUI que el sistema renderiza en la pantalla de bloqueo y Dynamic Island. Los datos se pasan mediante ActivityAttributes — una estructura con campos let para el contenido y campos var para el estado.

ComponentePropósitoAPI
AttributesDatos estáticos de toda la Activitylet name: String, let icon: String
ContentStateEstado dinámico, modificable al actualizarvar progress: Double, var status: Status
ActivityObjeto de solicitud y gestión de la ActivityActivity.request(attributes:content:)
PushTokenToken para actualizaciones push del servidoractivity.pushToken publisher
ActivityUIVista SwiftUI para pantalla de bloqueo y Dynamic IslandLockScreenView, ExpandedView, CompactView

Ciclo de vida de la Activity incluye tres fases: activa (el sistema muestra y actualiza), final (la actividad ha terminado pero la IU sigue visible 4 horas) y eliminada (el sistema elimina la IU). La aplicación puede finalizar la Activity en cualquier momento. El sistema también finaliza las Activities de forma forzada — por ejemplo, al reiniciar el dispositivo o al expirar el límite de 8 horas.

swift
import ActivityKit

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

WidgetBundle registra Live Activity mediante la macro @main: el widget devuelve una lista de configuraciones incluyendo LiveActivityConfiguration. Según esta configuración, el sistema sabe qué tipos de datos esperar y cómo renderizar la IU en diferentes estados — compacto, mínimo y expandido para Dynamic Island.

Crear Live Activity con WidgetKit y SwiftUI

Crear una Activity comienza con una solicitud a ActivityKit. La aplicación llama a Activity.request(attributes:content:pushType:) con datos iniciales. El sistema verifica si Dynamic Island está disponible en el dispositivo y devuelve un objeto Activity. La solicitud puede fallar si se supera el límite de Activities activas — normalmente no más de 5 simultáneas. Tras una solicitud exitosa, el sistema muestra el widget en la pantalla de bloqueo y, si está disponible, en 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)")
}

La vista SwiftUI para Live Activity utiliza las estructuras LockScreenView, ExpandedView y CompactView de WidgetKit. La vista recibe el contexto (ActivityViewContext) con los atributos y el estado actuales. La actualización de la vista ocurre automáticamente cuando llega un nuevo estado del sistema. Live Activity solo admite un conjunto limitado de componentes SwiftUI — Text, Image, HStack, VStack y algunos modificadores.

Cada vista de Live Activity debe ser ligera y rápida — el sistema se niega a renderizar vistas pesadas. El límite de tiempo de renderizado es de 30 ms por fotograma. Las animaciones se limitan a transiciones del sistema entre estados — las animaciones personalizadas no están disponibles en Live Activity. El renderizado se realiza en un proceso en segundo plano de WidgetKit con prioridad de respuesta de la pantalla de bloqueo.

Actualizar Live Activity localmente y mediante push

Actualización local — la aplicación actualiza el estado de la Activity llamando a activity.update(using:). El método acepta un nuevo ContentState y un AlertConfiguration opcional para mostrar una notificación al actualizar. Las actualizaciones locales son rápidas — el sistema redibuja la vista en el siguiente ciclo de renderizado, normalmente en 1–2 segundos. Para actualizaciones frecuentes (temporizador, cronómetro) use el modo local — es más fiable y rápido que 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"
    )
)

Actualizaciones push — el servidor envía una notificación push de ActivityKit con el nuevo estado en formato JSON. Para ello, la aplicación recibe un pushToken del publicador activity.pushToken y lo pasa al servidor. El servidor envía una solicitud POST a APNs con un payload que contiene el nuevo ContentState. El sistema recibe el push, decodifica el estado y actualiza la Live Activity sin participación de la aplicación — esto permite actualizar la Activity incluso cuando la aplicación está cerrada.

Las actualizaciones push son más eficientes que las locales para actualizaciones poco frecuentes (estado de entrega cada 5–10 minutos) — la aplicación no necesita mantener una conexión de red. Para actualizaciones frecuentes cada 1–2 segundos use el método local. El payload del servidor incluye solo los campos mutables de ContentState — los datos estáticos de Attributes se envían solo al crear la Activity.

Mostrar Live Activity en Dynamic Island

Dynamic Island es un área de hardware y software en iPhone 14 Pro, 15 Pro y posteriores que se adapta al contenido de Live Activity. El sistema muestra automáticamente la Activity en tres modos: compacto (icono + texto corto a la izquierda del recorte), mínimo (solo icono) y expandido (rectángulo de 300pt con información). El desarrollador no controla estos modos directamente — el sistema selecciona el modo según la prioridad y el espacio disponible.

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 admite interactividad — el usuario toca el área y entra en la aplicación o abre la vista expandida. Al tocar el modo compacto se cambia a expandido, y al deslizar hacia la izquierda se minimiza la Activity. Los botones en el modo expandido (pausa/cancelar) se manejan mediante Link de SwiftUI — el sistema inicia la aplicación con una URL deep link, el procesamiento se realiza en UIApplicationDelegate.

Limitaciones de Dynamic Island: el ancho del modo expandido es de hasta 300pt, el texto compacto hasta 30 caracteres. Los colores y fuentes coinciden con el tema del sistema — la personalización es limitada. Las animaciones de transición entre modos son del sistema y no se pueden personalizar. Si varias aplicaciones tienen Activities activas, Dynamic Island las muestra con prioridad según la hora de inicio y el tipo de contenido.

Preguntas frecuentes

¿En qué se diferencia Live Activity de un widget normal?

Un widget normal de WidgetKit muestra información estática y se actualiza mediante un temporizador del sistema con un intervalo mínimo de 15–30 minutos. Live Activity muestra datos dinámicos en tiempo real en la pantalla de bloqueo y Dynamic Island. Live Activity se inicia por la aplicación, vive hasta 8 horas y el sistema la finaliza después de que termina el evento, a diferencia de un widget que existe permanentemente.

¿Con qué frecuencia se actualiza Live Activity?

Live Activity admite dos modos de actualización: local — la aplicación actualiza el estado mediante la API de ActivityKit en cualquier momento, y actualización push — el servidor envía una notificación push de ActivityKit que el sistema convierte en un nuevo estado del widget. Cuando la batería está baja, el sistema puede congelar Live Activity hasta que se conecte la carga.

¿En qué dispositivos funcionan Live Activities?

Live Activities están disponibles en iPhone con iOS 16.1 y versiones posteriores. En iPhone 14 Pro y posteriores, Live Activity también se muestra en Dynamic Island. En iPad, Live Activity solo se admite en la pantalla de bloqueo — Dynamic Island no está disponible en iPad. Apple Watch no admite Live Activities directamente, pero puede mostrar notificaciones de finalización.

¿Cuántas Live Activities pueden funcionar simultáneamente?

El sistema limita el número de Live Activities activas — normalmente no más de 5 simultáneas para todas las aplicaciones. Intentar iniciar más allá del límite devuelve un error de ActivityKit. Cada Live Activity puede tener múltiples estados — por ejemplo, pendiente, en tránsito, entregado para un pedido de comida. Después de finalizar, la Activity permanece en la IU otras 4 horas.

¿Se necesita permiso del usuario para Live Activity?

Sí, la aplicación debe solicitar permiso para enviar notificaciones — Live Activity utiliza el canal de notificaciones del sistema. El usuario puede desactivar Live Activity para una aplicación específica en los ajustes. En el primer inicio, ActivityKit muestra un diálogo solicitando permiso. Sin permiso, la solicitud de Activity falla.

Resumen

  • Live Activity — widget dinámico en la pantalla de bloqueo y Dynamic Island con actualizaciones en tiempo real
  • ActivityKit — framework de iOS 16.1+ para gestionar el ciclo de vida de Live Activities
  • Attributes and State — datos estáticos y estado dinámico de la Activity pasados a la vista SwiftUI
  • Actualizaciones push — el servidor envía un nuevo estado mediante APNs sin participación de la aplicación
  • Dynamic Island — tres modos de visualización: compacto, mínimo y rectángulo expandido
  • Límites — hasta 5 Activities activas, hasta 8 horas de vida, hasta 4 horas después de finalizar
  • AlertConfiguration — notificación opcional al actualizar el estado de la Activity

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también