Skip to content

Atividades ao vivo para Swift

Aprenda como implementar Atividades ao Vivo para o SDK Swift da Braze. Atividades ao Vivo são notificações persistentes e interativas exibidas diretamente na tela de bloqueio, permitindo que os usuários recebam atualizações dinâmicas em tempo real—sem desbloquear o dispositivo.

Como funciona

Atividade ao vivo de um rastreador de entregas em uma tela de bloqueio do iPhone. Uma barra de status com um carro está quase na metade. O texto diz "2 min until pickup"

As Atividades ao Vivo apresentam uma combinação de informações estáticas e dinâmicas que você atualiza. Por exemplo, você pode criar uma Atividade ao Vivo que fornece um rastreador de status para uma entrega. Essa Atividade ao Vivo teria o nome da sua empresa como informação estática, bem como um “Tempo para entrega” dinâmico que seria atualizado à medida que o motorista de entrega se aproximasse do destino.

Como desenvolvedor, você pode usar a Braze para gerenciar os ciclos de vida das suas Atividades ao Vivo, fazer chamadas para a REST API da Braze para realizar atualizações e fazer com que todos os dispositivos inscritos recebam a atualização o mais rápido possível. E, como você está gerenciando as Atividades ao Vivo por meio da Braze, pode usá-las em conjunto com seus outros canais de envio de mensagens—notificações por push, mensagens no app, Content Cards—para promover a adoção.

Diagrama de sequência

Mostrar Diagrama
---
config:
  theme: mc
---
sequenceDiagram
  participant Server as Client Server
  participant Device as User Device
  participant App as iOS App / Braze SDK
  participant BrazeAPI as Braze API
  participant APNS as Apple Push Notification Service
  Note over Server, APNS: Launch Option 1<br/>Locally Start Activities
  App ->> App: Register a Live Activity using <br>`launchActivity(pushTokenTag:activity:)`
  App ->> App: Get push token from iOS
  App ->> BrazeAPI: Activity ID & Push token<br>automatically sent to Braze
  Note over Server, APNS: Launch Option 2<br/>Remotely Start Activities
  Device ->> App: Call `registerPushToStart`<br>to collect push tokens early
  App ->> BrazeAPI: Push-to-start tokens sent to Braze
  Server ->> BrazeAPI: POST /messages/live_activity/start
  Note right of BrazeAPI: Payload includes:<br>- push_token<br>- activity_id<br>- external_id<br>- event_name<br>- content_state (optional)
  BrazeAPI ->> APNS: Live activity start request
  APNS ->> Device: APNS sends activity to device
  App ->> App: Get push token from iOS
  App ->> BrazeAPI: Activity ID & Push token<br>automatically sent to Braze
  Note over Server, APNS: Resuming activities upon app launch
  App ->> App: Call `resumeActivities(ofType:)` on each app launch
  Note over Server, APNS: Updating a Live Activity
  loop update a live activity
  Server ->> BrazeAPI: POST /messages/live_activity/update
  Note right of BrazeAPI: Payload includes changes<br>to ContentState (dynamic variables)
  BrazeAPI ->> APNS: Update sent to APNS
  APNS ->> Device: APNS sends update to device
  end
  Note over Server, APNS: Ending a Live Activity
  Server ->> BrazeAPI: POST /messages/live_activity/update
  Note right of BrazeAPI: Activity can be ended via:<br> - User manually dismisses<br>- Times out after 12 hours<br>- Setting `end_activity: true` on `/messages/live_activity/update`
  APNS ->> Device: Live activity is dismissed

Implementação de uma Atividade ao Vivo

Pré-requisitos

Antes de poder usar esse recurso, você precisará integrar o Swift Braze SDK. Você também precisará completar o seguinte:

  • Certifique-se de que seu projeto está direcionado para iOS 16.1 ou posterior.
  • Adicione a autorização Push Notification em Signing & Capabilities no seu projeto Xcode.
  • Certifique-se de que chaves .p8 são usadas para enviar notificações. Não há suporte para arquivos mais antigos, como .p12 ou .pem.
  • A partir da versão 8.2.0 do SDK Swift da Braze, é possível registrar remotamente uma Atividade ao Vivo. Para usar esse recurso, é necessário o iOS 17.2 ou posterior.

Etapa 1: Crie uma atividade

Primeiro, certifique-se de ter seguido o procedimento Exibindo dados ao vivo com Live Activities na documentação da Apple para configurar Atividades ao Vivo no seu aplicativo iOS. Como parte dessa tarefa, inclua NSSupportsLiveActivities definido como YES no seu Info.plist.

Como a natureza exata da sua Atividade ao Vivo será específica para o seu caso de negócios, você precisará configurar e inicializar os objetos Activity. É importante ressaltar que você definirá:

  • ActivityAttributes: Esse protocolo define o conteúdo estático (imutável) e dinâmico (mutável) que aparecerá na sua Atividade ao Vivo.
  • ActivityAttributes.ContentState: Esse tipo define os dados dinâmicos que serão atualizados no decorrer da atividade.

Você também usará o SwiftUI para criar a apresentação da interface do usuário da tela de bloqueio e do Dynamic Island nos dispositivos compatíveis.

Certifique-se de estar familiarizado com os pré-requisitos e as limitações da Apple para Atividades ao Vivo, pois essas restrições são independentes da Braze.

Exemplo

Vamos imaginar que queremos criar uma Atividade ao Vivo para fornecer aos nossos usuários atualizações sobre o show Superb Owl, em que dois resgates de animais selvagens concorrentes recebem pontos pelas corujas que têm em sua residência. Neste exemplo, criamos uma struct chamada SportsActivityAttributes, mas você pode usar sua própria implementação de ActivityAttributes.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#if canImport(ActivityKit)
  import ActivityKit
#endif

@available(iOS 16.1, *)
struct SportsActivityAttributes: ActivityAttributes {
  public struct ContentState: Codable, Hashable {
    var teamOneScore: Int
    var teamTwoScore: Int
  }

  var gameName: String
  var gameNumber: String
}

Etapa 2: Inicie a atividade

Primeiro, escolha como deseja registrar sua atividade:

  • Remoto: Use o método registerPushToStart no início do ciclo de vida do usuário e antes que o token de push-to-start seja necessário, e então inicie uma atividade usando o endpoint /messages/live_activity/start.
  • Local: Crie uma instância da sua Atividade ao Vivo e, em seguida, use o método launchActivity para criar tokens push para a Braze gerenciar.

Etapa 2.1: Adicione o BrazeKit à sua extensão de widget

No seu projeto Xcode, selecione o nome do aplicativo e, em seguida, General. Em Frameworks and Libraries, confirme se o BrazeKit está listado.

O framework BrazeKit em Frameworks and Libraries em um projeto Xcode de exemplo.

Etapa 2.2: Adicione o protocolo BrazeLiveActivityAttributes

Na sua implementação de ActivityAttributes, adicione conformidade ao protocolo BrazeLiveActivityAttributes e então adicione a propriedade brazeActivityId ao seu modelo de atributos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import BrazeKit

#if canImport(ActivityKit)
  import ActivityKit
#endif

@available(iOS 16.1, *)
// 1. Add the `BrazeLiveActivityAttributes` conformance to your `ActivityAttributes` struct.
struct SportsActivityAttributes: ActivityAttributes, BrazeLiveActivityAttributes {
  public struct ContentState: Codable, Hashable {
    var teamOneScore: Int
    var teamTwoScore: Int
  }

  var gameName: String
  var gameNumber: String

  // 2. Add the `String?` property to represent the activity ID.
  var brazeActivityId: String?
}

Etapa 2.3: Registre para push-to-start

Em seguida, registre o tipo de Atividade ao Vivo para que a Braze possa rastrear todos os tokens push-to-start e instâncias de Atividade ao Vivo associadas a esse tipo.

Exemplo

No exemplo a seguir, a classe LiveActivityManager manipula objetos de Atividade ao Vivo. Em seguida, o método registerPushToStart registra SportsActivityAttributes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import BrazeKit

#if canImport(ActivityKit)
  import ActivityKit
#endif

class LiveActivityManager {

  @available(iOS 17.2, *)
  func registerActivityType() {
    // This method returns a Swift background task.
    // You may keep a reference to this task if you need to cancel it wherever appropriate, or ignore the return value if you wish.
    let pushToStartObserver: Task = Self.braze?.liveActivities.registerPushToStart(
      forType: Activity<SportsActivityAttributes>.self,
      name: SportsActivityAttributes.name
    )
  }

}

Etapa 2.4: Envie uma notificação push-to-start

Envie uma notificação push-to-start remota usando o endpoint /messages/live_activity/start.

Você pode usar o framework ActivityKit da Apple para obter um token de push, que o SDK da Braze pode gerenciar para você. Isso permite que você atualize as Atividades ao Vivo por meio da API da Braze, pois a Braze enviará o token de push para o serviço de Notificações por Push da Apple (APNs) no back-end.

  1. Crie uma instância da sua implementação de Atividade ao Vivo usando as APIs do ActivityKit da Apple.
  2. Defina o parâmetro pushType como .token.
  3. Passe os ActivitiesAttributes e ContentState das Atividades ao Vivo que você definiu.
  4. Registre sua atividade na instância da Braze, passando-a para launchActivity(pushTokenTag:activity:). O parâmetro pushTokenTag é uma string personalizada que você define. Ele deve ser exclusivo para cada Atividade ao Vivo que você criar.

Depois de registrar a Atividade ao Vivo, o SDK da Braze extrairá e observará as alterações nos tokens de push.

Exemplo

No nosso exemplo, criaremos uma classe chamada LiveActivityManager como interface para nossos objetos de Atividade ao Vivo. Em seguida, definiremos o pushTokenTag como "sports-game-2024-03-15".

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import BrazeKit

#if canImport(ActivityKit)
  import ActivityKit
#endif

class LiveActivityManager {

  @available(iOS 16.2, *)
  func createActivity() {
    let activityAttributes = SportsActivityAttributes(gameName: "Superb Owl", gameNumber: "Game 1")
    let contentState = SportsActivityAttributes.ContentState(teamOneScore: "0", teamTwoScore: "0")
    let activityContent = ActivityContent(state: contentState, staleDate: nil)
    if let activity = try? Activity.request(attributes: activityAttributes,
                                            content: activityContent,
      // Setting your pushType as .token allows the Activity to generate push tokens for the server to watch.
                                            pushType: .token) {
      // Register your Live Activity with Braze using the pushTokenTag.
      // This method returns a Swift background task.
      // You may keep a reference to this task if you need to cancel it wherever appropriate, or ignore the return value if you wish.
      let liveActivityObserver: Task = AppDelegate.braze?.liveActivities.launchActivity(pushTokenTag: "sports-game-2024-03-15",
                                                                                        activity: activity)
    }
  }

}

O widget da Atividade ao Vivo exibiria esse conteúdo inicial para os usuários.

Uma atividade ao vivo em uma tela de bloqueio do iPhone com as pontuações de duas equipes. Tanto o Wild Bird Fund quanto o Owl Rehab têm pontuações de 0.

Etapa 3: Retome o rastreamento de atividades

Para garantir que a Braze rastreie sua Atividade ao Vivo na inicialização do app:

  1. Abra seu arquivo AppDelegate.
  2. Importe o módulo ActivityKit se ele estiver disponível.
  3. Chame resumeActivities(ofType:) em application(_:didFinishLaunchingWithOptions:) para todos os tipos de ActivityAttributes que você registrou no seu aplicativo.

Isso permite que a Braze retome as tarefas para rastrear atualizações de tokens push para todas as Atividades ao Vivo ativas. Observe que, se um usuário tiver descartado explicitamente a Atividade ao Vivo no dispositivo, ela será considerada removida e a Braze não a rastreará mais.

Exemplo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import UIKit
import BrazeKit

#if canImport(ActivityKit)
  import ActivityKit
#endif

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

  static var braze: Braze? = nil

  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {

    if #available(iOS 16.1, *) {
      Self.braze?.liveActivities.resumeActivities(
        ofType: Activity<SportsActivityAttributes>.self
      )
    }

    return true
  }
}

Etapa 4: Atualize a atividade

Uma atividade ao vivo em uma tela de bloqueio do iPhone com as pontuações de duas equipes. O Wild Bird Fund tem 2 pontos e o Owl Rehab tem 4 pontos.

O endpoint /messages/live_activity/update permite que você atualize uma Atividade ao Vivo por meio de notificações por push enviadas pela REST API da Braze. Use esse endpoint para atualizar o ContentState da sua Atividade ao Vivo.

Ao atualizar o ContentState, o widget da Atividade ao Vivo exibirá as novas informações. Veja como seria o show Superb Owl no final do primeiro tempo.

Consulte nosso artigo sobre o endpoint /messages/live_activity/update para obter todos os detalhes.

Etapa 5: Encerre a atividade

Quando uma Atividade ao Vivo está ativa, ela é exibida na tela de bloqueio do usuário e no Dynamic Island. Para encerrá-la pela Braze, use o endpoint /messages/live_activity/update com end_activity definido como true.

Para melhorar a confiabilidade ao encerrar uma Atividade ao Vivo, siga estas etapas opcionais:

  1. Opcionalmente, inclua dismissal_date na mesma solicitação de update para sugerir quando o iOS deve remover a interface da Atividade ao Vivo.
  2. Verifique os resultados de entrega no Registro de atividades de envio de mensagem.

Organizando o descarte automático

Para organizar o descarte automático, agende uma solicitação de acompanhamento para o endpoint de atualização após iniciar a Atividade ao Vivo.

  1. Envie uma solicitação /messages/live_activity/start com um activity_id que você possa rastrear.
  2. Armazene esse activity_id e o horário de encerramento desejado no agendador do seu backend.
  3. No horário de encerramento desejado, envie uma solicitação /messages/live_activity/update com end_activity definido como true.
  4. Configure a data de descarte na mesma solicitação de atualização. Para saber mais, consulte o endpoint /messages/live_activity/update.

Observe que o momento do descarte é controlado pelo iOS. Mesmo após enviar uma solicitação de encerramento válida, a remoção da tela de bloqueio ou do Dynamic Island pode ser atrasada ou se comportar de forma diferente com base em condições do sistema operacional.

Uma Atividade ao Vivo também pode ser encerrada fora da Braze:

  • Descarte pelo usuário: Um usuário pode descartar manualmente uma Atividade ao Vivo.
  • Tempo limite: Após um tempo padrão de oito horas, o iOS removerá a Atividade ao Vivo do Dynamic Island do usuário. Após um tempo padrão de 12 horas, o iOS removerá a Atividade ao Vivo da tela de bloqueio do usuário.

Consulte nosso artigo sobre o endpoint /messages/live_activity/update para obter todos os detalhes.

Rastreamento de Atividades ao Vivo

Os eventos de Atividade ao Vivo estão disponíveis em Currents, Compartilhamento de dados Snowflake e Criador de consultas. Os eventos a seguir podem ajudar você a entender e monitorar o ciclo de vida das suas Atividades ao Vivo, rastrear a disponibilidade de tokens e diagnosticar problemas ou verificar status de entrega de forma independente.

Observar eventos de Atividade ao Vivo (opcional)

O SDK da Braze fornece dois métodos de inscrição em braze.liveActivities para observar o ciclo de vida completo das Atividades ao Vivo. Para um passo a passo completo, consulte o tutorial de Atividades ao Vivo.

  • subscribeToStateUpdates(_:): Entrega eventos de ciclo de vida tanto para o registro de tokens push-to-start quanto para instâncias de atividades em execução.
  • subscribeToErrors(_:): Entrega erros do SDK e do lado do servidor encontrados durante o rastreamento de Atividades ao Vivo.

Configurar inscrições

Configure as inscrições uma vez em application(_:didFinishLaunchingWithOptions:) e mantenha-as durante toda a vida útil do seu app:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class AppDelegate: UIResponder, UIApplicationDelegate {
  static var braze: Braze?

  var stateSubscription: Braze.Cancellable?
  var errorSubscription: Braze.Cancellable?

  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let braze = Braze(configuration: config)
    Self.braze = braze

    if #available(iOS 16.1, *) {
      stateSubscription = Self.braze?.liveActivities.subscribeToStateUpdates { event in
        self.handleStateUpdate(event)
      }
      errorSubscription = Self.braze?.liveActivities.subscribeToErrors { error in
        self.handleLiveActivityError(error)
      }
    }

    return true
  }
}

subscribeToStateUpdates

subscribeToStateUpdates(_:) entrega valores UpdateEvent que cobrem o ciclo de vida completo das Atividades ao Vivo. Os eventos são divididos em dois escopos:

  • .activityType(ActivityType): Eventos em nível de tipo para registro de tokens push-to-start (iOS 17.2+). Nenhuma instância de atividade existe ainda.
  • .activityInstance(ActivityInstance): Eventos em nível de instância para uma atividade específica em execução.

Múltiplos assinantes são suportados — cada inscrição ativa recebe cada emissão de forma independente.

Eventos com escopo de tipo

Evento Quando é disparado
.pushToStartTokenRead(activityType:) Um token push-to-start foi lido do sistema operacional. A Braze agora pode iniciar remotamente uma nova atividade desse tipo.
.pushToStartTokenFlushed(activityType:) O token foi enviado ao servidor da Braze. A Braze pode enviar notificações push-to-start para esse tipo.
.pushToStartOptedOut(activityType:) O usuário optou por não receber push-to-start para esse tipo de atividade por meio de optOutPushToStart(type:).
.pushToStartOptOutFlushed(activityType:) A opção de não receber foi enviada ao servidor da Braze.

Eventos com escopo de instância

Evento Quando é disparado
.started(activityId:activityType:pushTokenTag:launchSource:) O SDK começou a rastrear essa atividade por meio de launchActivity(pushTokenTag:activity:). O valor de launchSource é .local para atividades iniciadas pelo app ou .pushToStart para atividades iniciadas remotamente.
.resumed(activityId:activityType:pushTokenTag:) O SDK retomou o rastreamento dessa atividade por meio de resumeActivities(ofType:).
.pushTokenFlushed(activityId:activityType:pushTokenTag:) O token de push da atividade foi aceito pelo servidor da Braze — a atividade agora pode receber atualizações remotas.
.active(activityId:activityType:) A atividade está atualmente ativa e visível para o usuário.
.stale(activityId:activityType:staleDate:) O conteúdo da atividade ficou desatualizado. Emitido apenas no iOS 16.2 e posterior.
.dismissed(activityId:activityType:) O usuário descartou manualmente a atividade.
.ended(activityId:activityType:) A atividade foi encerrada.
.contentUpdated(activityId:activityType:) O estado do conteúdo da atividade foi atualizado (iOS 16.2+). Use lógica personalizada para buscar a Activity<T> pelo ID em Activity.activities e acessar o estado tipado por meio de activity.content.state.
.pushTokenUpdated(activityId:activityType:) O ActivityKit rotacionou o token de push da atividade.
Exemplo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
func handleStateUpdate(_ event: Braze.LiveActivities.UpdateEvent) {
  switch event {

  // Type-scoped: push-to-start token lifecycle (iOS 17.2+)
  case .activityType(.pushToStartTokenRead(let activityType)):
    print("[\(activityType)] Push-to-start token read by SDK")

  // ...

  // Instance-scoped: SDK tracking
  case .activityInstance(.started(let id, let type, let tag, let source)):
    print("[\(type)] Activity \(id) started via \(source), tag: \(tag)")

  // ...

  // Instance-scoped: ActivityKit lifecycle
  case .activityInstance(.active(let id, let type)):
    print("[\(type)] Activity \(id) is active")

  // ...

  case .activityInstance(.ended(let id, let type)):
    print("[\(type)] Activity \(id) ended")

  // Instance-scoped: content updates (iOS 16.2+)
  case .activityInstance(.contentUpdated(let id, let type)):
    // For more advanced use cases of `contentUpdated`, see the section below
    print("[\(type)] Content updated for activity \(id)")

  case .activityInstance(.pushTokenUpdated(let id, let type)):
    print("[\(type)] Activity \(id) push token rotated")
  }
}

subscribeToErrors

subscribeToErrors(_:) entrega valores ErrorEvent usando os mesmos dois escopos que UpdateEvent:

  • .activityType(ActivityType): Erros em nível de tipo para falhas de registro push-to-start.
  • .activityInstance(ActivityInstance): Erros em nível de instância para uma atividade em execução.

Use a flag isTransient para determinar se uma nova tentativa é apropriada. O SDK tenta novamente automaticamente as falhas transitórias.

Erros com escopo de tipo

Erro Quando é disparado
.pushToStartRegistrationFailed(activityType:isTransient:reason:) O token push-to-start não conseguiu chegar ao servidor da Braze.

Erros com escopo de instância

Erro Quando é disparado
.registrationFailed(activityId:activityType:pushTokenTag:isTransient:reason:) O token de push da atividade não conseguiu se registrar na Braze.
.activityNotFound(activityId:activityType:) resumeActivities(ofType:) encontrou um mapeamento armazenado para uma atividade que não está mais em execução — provavelmente ela foi encerrada enquanto o app estava fechado.
.invalidPushTokenTag(activityId:activityType:tag:) launchActivity(pushTokenTag:activity:) foi chamado com uma tag inválida. As tags devem ser não vazias e ter menos de 256 bytes.
Exemplo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func handleLiveActivityError(_ error: Braze.LiveActivities.ErrorEvent) {
  switch error {

  // Type-scoped errors
  case .activityType(.pushToStartRegistrationFailed(let type, let isTransient, let reason)):
    if isTransient {
      print("[\(type)] Push-to-start registration failed (transient, will retry): \(reason)")
    } else {
      print("[\(type)] Push-to-start registration failed (permanent): \(reason)")
    }

  // Instance-scoped errors
  case .activityInstance(.registrationFailed(let id, let type, _, let isTransient, let reason)):
    if isTransient {
      print("[\(type)] Activity \(id) registration failed (transient, retrying): \(reason)")
    } else {
      print("[\(type)] Activity \(id) registration failed (permanent): \(reason)")
    }

  case .activityInstance(.activityNotFound(let id, let type)):
    print("[\(type)] Stored activity \(id) not found on resume")

  case .activityInstance(.invalidPushTokenTag(let id, let type, let tag)):
    print("[\(type)] Activity \(id) has invalid push token tag '\(tag)'")
  }
}

Lidar com atualizações de estado do conteúdo (opcional)

Se você quiser usar o estado do conteúdo da instância real da Atividade ao Vivo, siga esta seção.

Quando um evento .contentUpdated é disparado, use lógica personalizada para buscar a Activity<T> em execução pelo seu ID em Activity.activities e, em seguida, acesse o ContentState tipado por meio de activity.content.state.

Tipo de atributos único

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
case .activityInstance(.contentUpdated(let id, let type)):
  #if canImport(ActivityKit)
    // Add custom logic look up the Activity<T> by ID and access your app's typed ContentState.
    // In this example, `SportsActivityAttributes` is the app's custom type.
    if #available(iOS 16.2, *),
      let activity = findActivityInstance(id: id, as: SportsActivityAttributes.self)
    {
      // `activityContent` is now strongly typed as a `SportsActivityAttributes`
      let activityContent = activity.content.state
      print("[\(type)] Game \(id) — score: \(activityContent.teamOneScore)\(activityContent.teamTwoScore)")
      return
    }
  #endif
  print("[\(type)] Content updated for activity \(id)")

// ...

// - MARK: Helper methods

@available(iOS 16.2, *)
func findActivityInstance<Attributes: ActivityAttributes>(
  id: String,
  as type: Attributes.Type
) -> Activity<Attributes>? {
  // Use Apple's API to find the matching Live Activity instance:
  // - https://developer.apple.com/documentation/activitykit/activity/activities
  Activity<Attributes>.activities.first(where: { $0.id == id })
}

Múltiplos tipos de atributos

Se o seu app usa múltiplos tipos de ActivityAttributes, verifique a string type para buscar a Activity<T> apropriada:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
case .activityInstance(.contentUpdated(let id, let type)):
  #if canImport(ActivityKit)
    if #available(iOS 16.2, *) {
      if type == SportsActivityAttributes.name,
        let activity = findActivityInstance(id: id, as: SportsActivityAttributes.self)
      {
        let activityContent = activity.content.state
        print("[\(type)] Game \(id) — score: \(activityContent.teamOneScore)\(activityContent.teamTwoScore)")
        return

      } else if type == OrderActivityAttributes.name,
        let activity = findActivityInstance(id: id, as: OrderActivityAttributes.self)
      {
        let activityContent = activity.content.state
        print("[\(type)] Order \(id) — status: \(activityContent.status), ETA: \(activityContent.eta)")
        return
      }
    }
  #endif
  print("[\(type)] Content updated for activity \(id)")

// ...

// - MARK: Helper methods

@available(iOS 16.2, *)
func findActivityInstance<Attributes: ActivityAttributes>(
  id: String,
  as type: Attributes.Type
) -> Activity<Attributes>? {
  // Use Apple's API to find the matching Live Activity instance:
  // - https://developer.apple.com/documentation/activitykit/activity/activities
  Activity<Attributes>.activities.first(where: { $0.id == id })
}

Perguntas frequentes (FAQ)

Funcionalidade e suporte

Quais plataformas suportam Atividades ao Vivo?

Atualmente, as Atividades ao Vivo são um recurso específico do iOS e iPadOS. Por padrão, atividades lançadas em um iPhone ou iPad também são exibidas em qualquer dispositivo watchOS 11+ ou macOS 26+ emparelhado.

Uma captura de tela de uma barra de menu do macOS exibindo uma Atividade ao Vivo como um alerta.

O artigo sobre Atividades ao Vivo aborda os pré-requisitos para o gerenciamento de Atividades ao Vivo por meio do SDK Swift da Braze.

Os apps React Native são compatíveis com Atividades ao Vivo?

Sim, o React Native SDK 3.0.0+ oferece suporte a Atividades ao Vivo por meio do SDK Swift da Braze. Ou seja, você precisa escrever código React Native iOS diretamente sobre o SDK Swift da Braze.

Não há uma API de conveniência JavaScript específica do React Native para Atividades ao Vivo porque os recursos de Atividades ao Vivo fornecidos pela Apple usam linguagens intraduzíveis em JavaScript (por exemplo, concorrência Swift, genéricos, SwiftUI).

A Braze oferece suporte a Atividades ao Vivo como uma Campaign ou etapa do Canvas?

Não, isso não é suportado no momento.

Notificações por push e Atividades ao Vivo

O que acontece se uma notificação por push for enviada enquanto uma Atividade ao Vivo estiver ativa?

Uma tela de telefone com uma Atividade ao Vivo de um jogo esportivo entre Bulls e Bears no meio da tela e um texto de notificação por push lorem ipsum na parte inferior da tela.

As Atividades ao Vivo e as notificações por push ocupam espaços diferentes na tela e não entram em conflito na tela do usuário.

Se as Atividades ao Vivo utilizam a funcionalidade de mensagens push, as notificações por push precisam estar ativadas para receber Atividades ao Vivo?

Embora as Atividades ao Vivo dependam de notificações por push para atualizações, elas são controladas por configurações de usuário diferentes. Um usuário pode aceitar Atividades ao Vivo, mas não as notificações por push, e vice-versa.

Os tokens de atualização de Atividade ao Vivo expiram após oito horas.

As Atividades ao Vivo requerem push primers?

Os push primers são uma prática recomendada para solicitar que os usuários aceitem notificações por push do seu app. No entanto, não há nenhum prompt do sistema para aceitar Atividades ao Vivo. Por padrão, os usuários aceitam Atividades ao Vivo para um app individual quando instalam esse app no iOS 16.1 ou posterior. Essa permissão pode ser desativada ou reativada nas configurações do dispositivo por app.

Tópicos técnicos e solução de problemas

Como posso saber se as Atividades ao Vivo têm erros?

Todos os erros de Atividades ao Vivo são registrados no dashboard da Braze no Registro de atividades de envio de mensagem, onde é possível filtrar por “LiveActivity Errors”.

Depois de enviar uma notificação push-to-start, por que não recebi minha Atividade ao Vivo?

Primeiro, verifique se sua carga útil inclui todos os campos obrigatórios descritos no endpoint messages/live_activity/start. Os campos activity_attributes e content_state devem corresponder às propriedades definidas no código do seu projeto. Se tiver certeza de que a carga útil está correta, é possível que você esteja sendo limitado pelos APNs. Esse limite é imposto pela Apple e não pela Braze.

Para verificar se a notificação push-to-start chegou com sucesso ao dispositivo, mas não foi exibida devido a limites de taxa, você pode depurar o projeto usando o app Console no Mac. Anexe o processo de gravação do dispositivo desejado e, em seguida, filtre os registros por process:liveactivitiesd na barra de pesquisa.

Depois de iniciar minha Atividade ao Vivo com push-to-start, por que ela não está recebendo novas atualizações?

Verifique se você implementou corretamente as instruções descritas acima. Seu ActivityAttributes deve conter tanto a conformidade com o protocolo BrazeLiveActivityAttributes quanto a propriedade brazeActivityId.

Depois de receber uma notificação push-to-start de Atividade ao Vivo, verifique se você consegue ver uma solicitação de rede de saída para o endpoint /push_token_tag da sua URL da Braze e se ela contém o ID da atividade correto no campo "tag".

Por fim, certifique-se de que o tipo de atributo da Atividade ao Vivo na sua carga útil de atualização corresponda exatamente à string e à classe usadas na chamada do método do SDK para registerPushToStart. Use constantes para evitar erros de digitação.

Estou recebendo uma resposta de acesso negado quando tento usar o endpoint live_activity/update. Por quê?

As chaves de API que você usa precisam ter as permissões corretas para acessar os diferentes endpoints da API da Braze. Se estiver usando uma chave de API criada anteriormente, é possível que tenha se esquecido de atualizar as permissões. Leia nossa visão geral da segurança da chave de API para relembrar.

O endpoint messages/send compartilha os limites de taxa com o endpoint messages/live_activity/update?

Por padrão, o limite de taxa do endpoint messages/live_activity/update é de 250.000 solicitações por hora, por espaço de trabalho e em vários endpoints. Consulte os limites de taxa da API para obter mais informações.

New Stuff!