# Live Activities de iOS

<Aside type="tip">
Mira un video sobre las Live Activities de iOS
<YouTube id="jRrDh_pIZCE" playlabel="Video de Youtube: Live Activities de iOS" /> 
</Aside>


Las [Live Activities](https://developer.apple.com/design/human-interface-guidelines/live-activities) muestran los datos más actuales de tu aplicación en la pantalla de bloqueo del iPhone o iPad y en la Dynamic Island. Esta función permite a los usuarios ver información en vivo de un vistazo y realizar acciones rápidas relacionadas con la información mostrada.

Aquí tienes algunos ejemplos de uso de las Live Activities:

*   Mostrar el estado de un pedido en una aplicación de entregas;
*   Proporcionar una cuenta regresiva en tiempo real en una aplicación de entrenamiento;
*   Mostrar información de seguimiento en una aplicación de taxi;
*   Mostrar estadísticas de juego y puntuaciones actuales en una aplicación de deportes;
*   Proporcionar pronósticos por hora en una aplicación del tiempo.

Puedes habilitar las Live Activities usando el SDK de Pushwoosh para iOS como se describe a continuación. Para gestionar las Live Activities y actualizar su contenido, utiliza el método [/updateLiveActivity](/es/developer/api-reference/ios-live-activities-api#updateliveactivity).



## Configuración
<Aside type="caution" title="Importante" >
Las Live Activities en Pushwoosh solo admiten la [configuración basada en token](/es/developer/first-steps/connect-messaging-services/ios-configuration/ios-token-based-configuration/). La [configuración basada en certificado](/es/developer/first-steps/connect-messaging-services/ios-configuration/ios-platform-configuration/) no es compatible.
</Aside> 

### Añadir una Extensión de Widget

1.  Crear un nuevo target

Ve a **File > New > Target** y selecciona **Widget Extension**.

<img src="/ios-push-notifications-ios-live-activities-1.webp" alt=""/>

2.  Configuración de la Extensión de Widget
Por favor, introduce un nombre y asegúrate de seleccionar **Include Live Activity** y haz clic en **Finish**.

<img src="/ios-push-notifications-ios-live-activities-2.webp" alt=""/>

### Configuración de Info.plist
Busca el archivo Info.plist en el target principal, inserta la clave "Supports Live Activities" y establece su valor en YES.

```xml
	<key>NSSupportsLiveActivities</key>
	<true/>
```

### Habilitar las live activities desde la aplicación
Para habilitar las Live Activities, añade su código a tu extensión de widget existente o crea una nueva si tu aplicación aún no la tiene. Las Live Activities utilizan la funcionalidad de [SwiftUI](https://developer.apple.com/documentation/SwiftUI) y [WidgetKit](https://developer.apple.com/documentation/WidgetKit) para su interfaz de usuario. ActivityKit gestiona el ciclo de vida de cada Live Activity: su API se utiliza para solicitar, actualizar y finalizar una Live Activity y para recibir notificaciones push de ActivityKit. Puedes aprender más sobre las Live Activities en la [documentación de Apple](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities).

 1. Navega al archivo ContentView de tu proyecto en Xcode y crea un Button

```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing: 20) {

            Button(action: {
                LiveActivityManager.shared.startActivity()
            }, label: {
                Text("Start Live Activity")
                    .foregroundColor(.white)
                    .padding()
                    .background(Color.blue)
                    .cornerRadius(10)
            })
        }
        .padding()
    }
}

#Preview {
    ContentView()
}
```
<img src="/ios-push-notifications-ios-live-activities-4.webp" alt=""/>

 2. Crea un archivo LiveActivityManager.swift para gestionar las Live Activities

```swift
import Foundation
import ActivityKit
import UIKit
import PushwooshFramework
import PushwooshLiveActivities

class LiveActivityManager: NSObject, ObservableObject {
    public static let shared: LiveActivityManager = LiveActivityManager()

    private var currentActivity: Activity<FoodDeliveryAttributes>? = nil

    override init() {
        super.init()
    }

    func startActivity() {
        guard ActivityAuthorizationInfo().areActivitiesEnabled else {
            print("You can't start live activity.")
            return
        }
        do {
            let pushwooshData = PushwooshLiveActivityAttributeData(activityId: "activity_id")
            let atttribute = FoodDeliveryAttributes(orderNumber: "1234567", pushwoosh: pushwooshData)
            let initialState = FoodDeliveryAttributes.ContentState(
                status: "Preparing your meal",
                estimatedTime: "25 min",
                emoji: "👨‍🍳",
                pushwoosh: nil
            )
            let activity = try Activity<FoodDeliveryAttributes>.request(
                attributes: atttribute,
                content: .init(state:initialState , staleDate: nil),
                pushType: .token
            )
            self.currentActivity = activity

            Task {
                for await pushToken in activity.pushTokenUpdates {
                    let pushTokenString = pushToken.reduce("") {
                        $0 + String(format: "%02x", $1)
                    }
                    print("Activity:\(activity.id) push token: \(pushTokenString)")

                    // MARK: - Send Push Token to Pushwoosh
                    Pushwoosh.LiveActivities.startLiveActivity(
                        token: pushTokenString,
                        activityId: "activity_id"
                    )
                }
            }
        } catch {
            print("Start Activity Error: \(error.localizedDescription)")
        }
    }
}

```

 3. Eso es todo, ahora ejecutamos el proyecto y pulsamos el botón 'Start Live Activity'. Luego navegamos a la pantalla de bloqueo y vemos la Live Activity creada.


<img src="/live-activities-1.webp" alt=""/>

### Iniciar una Live Activity con una notificación push remota

1.  Para iniciar una Live Activity a través de una Notificación Push Remota, necesitas enviar el token `pushToStartTokenUpdates` a Pushwoosh.

```swift
func getPushToStartToken() {
    if #available(iOS 17.2, *) {
        Task {
            for await data in Activity<LiveActivityAttributes>.pushToStartTokenUpdates {
                let token = data.map {String(format: "%02x", $0)}.joined()
                print("Activity PushToStart Token: \(token)")

                // Send `pushToStartTokenUpdates` token to Pushwoosh
                try await Pushwoosh.LiveActivities.sendPushToStartLiveActivity(token: token)
            }
        }
    }
}
```
2.  Iniciar una Live Activity con una Notificación Push Remota

<Aside type="tip">
 Sigue nuestra [referencia de la API de Pushwoosh](/es/developer/api-reference/ios-live-activities-api#startliveactivity) para obtener instrucciones y ejemplos sobre cómo hacer una solicitud para iniciar una Live Activity de forma remota.
</Aside>

### Gestionar las Live Activities

El SDK de Pushwoosh para iOS proporciona los siguientes métodos para trabajar con Live Activities:

```swift
// Send Live Activity Push To Start Token to Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Start Live Activity Methods with Activity ID
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Stop Live Activity Methods
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

static func stopLiveActivity(activityId: String)
static func stopLiveActivity(activityId: String, completion: @escaping (Error?) -> Void)

```

También puedes actualizar las live activities por segmentos utilizando el parámetro Activity ID. Al crear una actividad, necesitas pasar un parámetro único de Activity ID en el método, que será relevante para un segmento de usuarios específico.

Por ejemplo, N usuarios se han suscrito al mismo evento en una Live Activity. Es necesario que el parámetro Activity ID sea único para todos estos N usuarios.

Cuando termines de trabajar con una Live Activity, utiliza estos métodos:
```swift
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)
```
<Aside type="note">
 Puedes gestionar las Live Activities de iOS a través de la [API de Pushwoosh](/es/developer/api-reference/ios-live-activities-api).
</Aside>

### Método `Setup()`.
Pushwoosh simplifica la transferencia de IDs de actividad introduciendo la función `PushwooshLiveActivities.setup`, que gestiona todo el ciclo de vida de una Live Activity dentro de la aplicación. Esta función escucha automáticamente tanto las actualizaciones de token `pushToStart` como `pushToUpdate`. Al usar este método, la aplicación ya no necesita rastrear manualmente el inicio de las Live Activities ni gestionar las actualizaciones de token para las actualizaciones de actividad.

Recomendamos usar este método porque gestiona toda la administración de tokens de nuestro lado, reduciendo la cantidad de código que necesitas mantener en tu lado. Esto simplifica la integración y asegura una experiencia más fluida y eficiente para tu aplicación.

En el AppDelegate, asegúrate de importar `PushwooshFramework` y `PushwooshLiveActivities` y llama al método `setup` desde el módulo `Pushwoosh.LiveActivities`.

**AppDelegate.swift**
```swift
if #available(iOS 16.1, *) {
    Pushwoosh.LiveActivities.setup(FoodDeliveryAttributes.self)
}
```
**FoodDeliveryAttributes**

```swift
import WidgetKit
import SwiftUI
import ActivityKit
import PushwooshFramework
import PushwooshLiveActivities

struct FoodDeliveryAttributes: PushwooshLiveActivityAttributes {
    public struct ContentState: PushwooshLiveActivityContentState {
        var status: String
        var estimatedTime: String
        var emoji: String
        var pushwoosh: PushwooshLiveActivityContentStateData?
    }

    var orderNumber: String
    var pushwoosh: PushwooshLiveActivityAttributeData
}
```
`FoodDeliveryAttributes`: Esta estructura se ajusta al protocolo `PushwooshLiveActivityAttributes`. Se utiliza para definir los atributos de una live activity dentro de la aplicación.

<Aside type="note">
 Puedes gestionar las Live Activities y actualizar su contenido utilizando el método /updateLiveActivity de la API de Pushwoosh. Para más información, por favor lee [esta guía](/es/developer/api-reference/ios-live-activities-api)
</Aside>

## Guía de migración

A partir de la versión 6.8.0 del SDK de Pushwoosh para iOS, hemos actualizado la estructura del SDK. Los métodos de Live Activities ahora se acceden a través del módulo `PushwooshLiveActivities`.

Si estabas usando una versión del SDK de Pushwoosh para iOS anterior a la 6.8.0 y llamabas a los métodos listados a continuación, y desde entonces has actualizado a la versión 6.8.0 o posterior, por favor ten en cuenta los siguientes cambios:

```swift
static func setup<Attributes: PushwooshLiveActivityAttributes>(_ activityType: Attributes.Type)
static func defaultSetup()
static func defaultStart(_ activityId: String, attributes: [String: Any], content: [String: Any])
```

Ahora, para acceder a estos métodos, debes usar el módulo LiveActivity.

```swift
import PushwooshFramework
import PushwooshLiveActivities

```

```swift
Pushwoosh.LiveActivities.setup(FoodDeliveryAttributes.self)
Pushwoosh.LiveActivities.defaultSetup()
Pushwoosh.LiveActivities.defaultStart("activity_id",
                            attributes: ["key_attribute": "value_attribute"],
                            content: ["key_content": "value_content"])
```

También hemos mantenido el soporte para los métodos a través de `Pushwoosh.sharedInstance()` como se lista a continuación, pero ten en cuenta que estos métodos serán obsoletos en futuras versiones.

``` swift
// Send Live Activity Push To Start Token to Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Start Live Activity Methods with Activity ID
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Stop Live Activity Methods
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

static func stopLiveActivity(activityId: String)
static func stopLiveActivity(activityId: String, completion: @escaping (Error?) -> Void)
```