# Live Activities do iOS

<Aside type="tip">
Assista a um vídeo sobre as Live Activities do iOS
<YouTube id="jRrDh_pIZCE" playlabel="Vídeo do Youtube: Live Activities do iOS" /> 
</Aside>


As [Live Activities](https://developer.apple.com/design/human-interface-guidelines/live-activities) exibem os dados mais atuais do seu aplicativo na Tela de Bloqueio do iPhone ou iPad e na Dynamic Island. Este recurso permite que os usuários vejam informações ao vivo rapidamente e realizem ações rápidas relacionadas às informações exibidas.

Aqui estão alguns exemplos de uso das Live Activities:

* Mostrar o status do pedido em um aplicativo de entrega;
* Fornecer uma contagem regressiva em tempo real em um aplicativo de treinamento;
* Mostrar informações de rastreamento em um aplicativo de táxi;
* Exibir estatísticas de jogos e placares atuais em um aplicativo de esportes;
* Fornecer previsões horárias em um aplicativo de clima.

Você pode habilitar as Live Activities usando o SDK da Pushwoosh para iOS, conforme descrito abaixo. Para gerenciar as Live Activities e atualizar seu conteúdo, use o método [/updateLiveActivity](/pt/developer/api-reference/ios-live-activities-api#updateliveactivity).



## Configuração 
<Aside type="caution" title="Importante" >
As Live Activities na Pushwoosh suportam apenas a [configuração baseada em token](/pt/developer/first-steps/connect-messaging-services/ios-configuration/ios-token-based-configuration/). A [configuração baseada em certificado](/pt/developer/first-steps/connect-messaging-services/ios-configuration/ios-platform-configuration/) não é suportada.
</Aside> 

### Adicionar uma Extensão de Widget

1. Crie um novo alvo (target)

Vá para **File > New > Target** e selecione **Widget Extension**.

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

2. Configuração da Extensão de Widget
Por favor, insira um nome e certifique-se de selecionar **Include Live Activity** e clique em **Finish**.

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

###  Configuração do Info.plist
Encontre o arquivo Info.plist no alvo principal, insira a chave "Supports Live Activities" e defina seu valor como YES.

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

###  Habilitando as Live Activities a partir do aplicativo
Para habilitar as Live Activities, adicione o código delas à sua extensão de widget existente ou crie uma nova se o seu aplicativo ainda não tiver. As Live Activities usam a funcionalidade do [SwiftUI](https://developer.apple.com/documentation/SwiftUI) e [WidgetKit](https://developer.apple.com/documentation/WidgetKit) para sua interface de usuário. O ActivityKit lida com o ciclo de vida de cada Live Activity: sua API é usada para solicitar, atualizar e encerrar uma Live Activity e para receber notificações push do ActivityKit. Você pode aprender mais sobre as Live Activities na [documentação da Apple](https://developer.apple.com/documentation/activitykit/displaying-live-data-with-live-activities).

 1. Navegue até o arquivo ContentView do seu projeto no Xcode e crie um 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. Crie um arquivo LiveActivityManager.swift para gerenciar as 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: - Enviar Token de Push para a Pushwoosh
                    Pushwoosh.LiveActivities.startLiveActivity(
                        token: pushTokenString,
                        activityId: "activity_id"
                    )
                }
            }
        } catch {
            print("Start Activity Error: \(error.localizedDescription)")
        }
    }
}

```

 3. É isso, agora executamos o projeto e pressionamos o botão 'Start Live Activity'. Em seguida, navegamos para a tela de bloqueio e vemos a Live Activity criada.


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

### Iniciar uma Live Activity com uma notificação push remota

1. Para iniciar uma Live Activity via Notificação Push Remota, você precisa enviar o token pushToStartTokenUpdates para 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)")

                // Enviar o token `pushToStartTokenUpdates` para a Pushwoosh
                try await Pushwoosh.LiveActivities.sendPushToStartLiveActivity(token: token)
            }
        }
    }
}
```
2. Inicie uma Live Activity com uma Notificação Push Remota

<Aside type="tip">
 Siga nossa [referência da API Pushwoosh](/pt/developer/api-reference/ios-live-activities-api#startliveactivity) para obter instruções e exemplos sobre como fazer uma solicitação para iniciar uma Live Activity remotamente.
</Aside>

### Gerenciando as Live Activities 

O SDK da Pushwoosh para iOS fornece os seguintes métodos para trabalhar com as Live Activities:

```swift
// Enviar Token de Início de Push da Live Activity para a Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Métodos para Iniciar Live Activity com ID de Atividade
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Métodos para Parar Live Activity
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

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

```

Você também pode atualizar as live activities por segmentos usando o parâmetro Activity ID. Ao criar uma atividade, você precisa passar um parâmetro Activity ID exclusivo no método, que será relevante para um segmento de usuário específico.

Por exemplo, N usuários se inscreveram no mesmo evento em uma Live Activity. É necessário que o parâmetro Activity ID seja único para todos esses N usuários.

Quando você terminar de trabalhar com uma Live Activity, use estes métodos:
```swift
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)
```
<Aside type="note">
 Você pode gerenciar as Live Activities do iOS através da [API da Pushwoosh](/pt/developer/api-reference/ios-live-activities-api).
</Aside>

### Método `Setup()`
A Pushwoosh simplifica a transferência de IDs de atividade introduzindo a função `PushwooshLiveActivities.setup`, que lida com todo o ciclo de vida de uma Live Activity dentro do aplicativo. Esta função escuta automaticamente as atualizações de token pushToStart e pushToUpdate. Ao usar este método, o aplicativo não precisa mais rastrear manualmente o início das Live Activities ou gerenciar as atualizações de token para as atualizações de atividade. 

Recomendamos usar este método porque ele lida com todo o gerenciamento de tokens do nosso lado, reduzindo a quantidade de código que você precisa manter do seu lado. Isso simplifica a integração e garante uma experiência mais suave e eficiente para o seu aplicativo.

No AppDelegate, certifique-se de importar `PushwooshFramework` e `PushwooshLiveActivities` e chamar o método `setup` do 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 estrutura está em conformidade com o protocolo `PushwooshLiveActivityAttributes`. É usada para definir os atributos de uma live activity dentro do aplicativo.

<Aside type="note">
 Você pode gerenciar as Live Activities e atualizar seu conteúdo usando o método /updateLiveActivity da API da Pushwoosh. Para mais informações, por favor, leia [este guia](/pt/developer/api-reference/ios-live-activities-api)
</Aside>

## Guia de migração

A partir da versão 6.8.0 do SDK da Pushwoosh para iOS, atualizamos a estrutura do SDK. Os métodos das Live Activities agora são acessados através do módulo `PushwooshLiveActivities`.

Se você estava usando uma versão do SDK da Pushwoosh para iOS anterior à 6.8.0 e estava chamando os métodos listados abaixo, e desde então atualizou para a versão 6.8.0 ou posterior, por favor, observe as seguintes alterações:

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

Agora, para acessar esses métodos, você deve usar o 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"])
```

Também mantivemos o suporte para os métodos através de `Pushwoosh.sharedInstance()` como listado abaixo, mas observe que esses métodos serão descontinuados em versões futuras.

``` swift
// Enviar Token de Início de Push da Live Activity para a Pushwoosh
static func sendPushToStartLiveActivity(token: String)
static func sendPushToStartLiveActivity(token: String, completion: @escaping (Error?) -> Void)

// Métodos para Iniciar Live Activity com ID de Atividade
static func startLiveActivity(token: String, activityId: String)
static func startLiveActivity(token: String, activityId: String, completion: @escaping (Error?) -> Void)

// Métodos para Parar Live Activity
static func stopLiveActivity()
static func stopLiveActivity(completion: @escaping (Error?) -> Void)

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