Pular para o conteúdo principal
Live Activities permitem que seu aplicativo iOS mostre atualizações em tempo real diretamente na tela de bloqueio e Dynamic Island. Ideal para rastreamento de entregas, placares esportivos ou atualizações transacionais sensíveis ao tempo, eles mantêm os usuários informados sem abrir o aplicativo.
Android tem um recurso semelhante chamado Notificações Live do Android.

Requisitos


Configuração

Estes passos orientam você na configuração de Live Activities rapidamente. Para mais detalhes e personalizações de design, consulte a documentação de desenvolvedor de Live Activities da Apple.

1. Adicionar uma Widget Extension

No Xcode, vá para File > New > Target… > Widget Extension.

Adicione um novo destino Widget Extension para seu aplicativo no Xcode.

Selecione e pressione Next. Configure a Widget Extension fornecendo um nome (exemplo: OneSignalWidget) e garanta que Include Live Activity esteja selecionado. Então clique em Finish.

Opções de Widget Extension para uma Live Activity.

Clique em Don’t Activate se solicitado para ativar o esquema.

Opções de Widget Extension para uma Live Activity.

2. Atualizar Info.plist

No Info.plist do seu destino principal, adicione a chave Supports Live Activities como Boolean, e defina para YES.

Adicione a chave Supports Live Activities ao Info e defina seu valor para Boolean YES

Se você defini-la programaticamente, deve ficar assim:
info.plist
<key>NSSupportsLiveActivities</key>
<true/>
Ao atualizar Live Activities, você tem a opção de definir uma “prioridade” que a Apple usa para determinar quão urgente é a atualização. A Apple tem limites internos nos quais ela limitará requisições que usam a flag de alta prioridade com muita frequência.Se seus casos de uso para Live Activities dependem de atualizações de alta prioridade mais frequentes, você pode adicionar a chave NSSupportsLiveActivitiesFrequentUpdates ao seu Info.plist como um tipo Boolean definido para YES conforme instruído na Documentação de Desenvolvedor da Apple. Os usuários verão um diálogo quando a Live Activity exceder seu orçamento de push, e se eles permitirem que a Live Activity continue, o orçamento será automaticamente aumentado para uma experiência do usuário sem problemas.

3. Adicionar SDK

  • Package Manager
  • Cocoapods
No seu destino Widget Extension, adicione o OneSignalFramework em General > Frameworks, Libraries and Embedded Content:

Adicione o OneSignalFramework ao seu destino Widget Extension

4. Definir atributos e UI do widget

Abra o arquivo your-nameLiveActivity.swift (exemplo: OneSignalWidgetLiveActivity.swift) para definir as propriedades da estrutura e fazer alterações na UI do widget.
  • your-nameAttributes descreve o conteúdo estático da sua Live Activity.
  • ContentState descreve o conteúdo dinâmico da sua Live Activity.
Se você estiver seguindo o exemplo, copie e cole o código abaixo em seu arquivo OneSignalWidgetLiveActivity.swift.
your-nameLiveActivity.swift
import ActivityKit
import WidgetKit
import SwiftUI
// Import the OneSignalLiveActivities module
// If you get an error about the module not being found, return to step 3 and ensure you have added the OneSignalLiveActivities pod correctly.
import OneSignalLiveActivities

// Update to inherit from OneSignalLiveActivityAttributes
// This will be used in your API requests to start a Live Activity
struct OneSignalWidgetAttributes: OneSignalLiveActivityAttributes  {
    // Update to inherit from OneSignalLiveActivityContentState
    public struct ContentState: OneSignalLiveActivityContentState {
        // Dynamic stateful properties about your activity go here!
        var emoji: String
        // Add a reference to OneSignalLiveActivityContentStateData?
        var onesignal: OneSignalLiveActivityContentStateData?
    }
    // Fixed non-changing properties about your activity go here!
    var name: String
    // Add a reference to OneSignalLiveActivityAttributeData
    var onesignal: OneSignalLiveActivityAttributeData
}

struct OneSignalWidgetLiveActivity: Widget {
    var body: some WidgetConfiguration {
      // Update to use `for: the-name-of-your-attributes-struct`
      // This will be used in your API requests to start a Live Activity
        ActivityConfiguration(for: OneSignalWidgetAttributes.self) { context in
            // Lock screen/banner UI goes here
            // Update to show the attributes sent via the payload
            VStack {
                Text("Hello \(context.attributes.name) \(context.state.emoji)")
            }
            .activityBackgroundTint(Color.cyan)
            .activitySystemActionForegroundColor(Color.black)

        } dynamicIsland: { context in
            DynamicIsland {
                // Expanded UI goes here.  Compose the expanded UI through
                // various regions, like leading/trailing/center/bottom
                DynamicIslandExpandedRegion(.leading) {
                    Text("Leading")
                }
                DynamicIslandExpandedRegion(.trailing) {
                    Text("Trailing")
                }
                DynamicIslandExpandedRegion(.bottom) {
                    Text("Bottom \(context.state.emoji)")
                    // more content
                }
            } compactLeading: {
                Text("L")
            } compactTrailing: {
                Text("T \(context.state.emoji)")
            } minimal: {
                Text(context.state.emoji)
            }
            .widgetURL(URL(string: "http://www.apple.com"))
            .keylineTint(Color.red)
        }
    }
}

5. Permitir associação ao destino principal

Adicione seu destino de aplicativo principal à lista Target Membership no arquivo your-nameLiveActivity.swift. No Xcode, abra o painel Inspector no lado direito da tela. Dentro de Target Membership, clique no botão + e selecione seu destino de aplicativo principal contendo o ContentView e seu código de inicialização do OneSignal.

Permitir associação ao destino principal

6. Adicionar o método de configuração ao seu AppDelegate

Chame OneSignal.LiveActivities.setup em seu AppDelegate, após a inicialização do SDK OneSignal. Substitua OneSignalWidgetAttributes pelo nome da sua estrutura de atributos de Live Activity.
AppDelegate
// Import the OneSignalLiveActivities module
import OneSignalLiveActivities

// This should be added after initializing the OneSignal SDK
if #available(iOS 16.1, *) {
	OneSignal.LiveActivities.setup(OneSignalWidgetAttributes.self)
  // If you have multiple Live Activities, you can add them here with the setup method
  // OneSignal.LiveActivities.setup(LiveActivityWidgetAttributes-2.self)
}
Isso gerencia e relata atualizações usando sequências assíncronas do ActivityKit.
Se você também consumir qualquer uma das seguintes sequências diretamente em seu aplicativo, isso pode interferir no comportamento da Live Activity do OneSignal:
  • activityStateUpdates
  • pushTokenUpdates
  • pushToStartTokenUpdates
  • activityUpdates

Iniciar uma Live Activity

Existem 2 opções para iniciar uma Live Activity em um dispositivo:
  • Push-to-start
  • Ativar no aplicativo
Envie uma requisição da API Push To Start. Certifique-se de que todos os nomes e IDs correspondam exatamente à configuração do seu widget (os parâmetros são sensíveis a maiúsculas e minúsculas). Se algo estiver faltando ou adicionado incorretamente, você pode encontrar problemas ao tentar lançar o widget.Aqui está um exemplo de requisição que funcionará para o exemplo acima.Substitua:
  • YOUR_APP_ID pelo seu OneSignal App ID.
  • YOUR_APP_API_KEY pela sua chave de API do OneSignal.
  • OneSignalWidgetAttributes pelo nome da sua estrutura de Widget Attributes.
    curl
    curl --location 'https://api.onesignal.com/apps/YOUR_APP_ID/activities/activity/OneSignalWidgetAttributes' \
    --header 'Authorization: key YOUR_APP_API_KEY' \
    --header 'Content-Type: application/json' \
    --data '{
        "event": "start",
        "activity_id": "push-to-start",
        "included_segments": [
            "Subscribed Users"
        ],
        "event_attributes": {
            "name": "World"
        },
        "event_updates": {
            "emoji":"🤩"
        },
        "name": "Live Activities Test",
        "contents": {
            "en": "A push started this Live Activity"
        },
        "headings": {
          "en": "Live Activity Started"
        }
      }'
    
Se você estiver seguindo o código de exemplo fornecido, você deve ver a Live Activity na tela de bloqueio do seu dispositivo.

Live Activity na tela de bloqueio

Você iniciou com sucesso uma Live Activity com push-to-start!Os usuários precisarão selecionar “Allow” para continuar recebendo atualizações.

Atualizar uma Live Activity

Use a API Update Live Activity para atualizar widgets ativos. Corresponda ao activity_id usado ao iniciar a atividade. Este exemplo de requisição atualizará o widget push-to-start porque ele tem o activity_id intitulado push-to-start que definimos. Para atualizar o widget click-to-start, atualize o caminho da requisição para usar click-to-start em vez de push-to-start.
curl
curl --location 'https://api.onesignal.com/apps/YOUR_APP_ID/live_activities/push-to-start/notifications' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: key YOUR_API_KEY' \
--data '{
    "event": "update",
    "event_updates": {
        "emoji": "😎"
    },
    "contents": {
        "en": "A push updated this Live Activity"
    },
    "name": "Live Activity Updated"
}'

Live Activity Atualizada

Você atualizou com sucesso uma Live Activity!Confira a API Update Live Activity para mais informações sobre atualização de uma Live Activity.

Encerrar uma Live Activity

Usando a mesma API Update Live Activity, podemos encerrar uma Live Activity definindo "event": "end".
curl
curl --location 'https://api.onesignal.com/apps/YOUR_APP_ID/live_activities/my_activity_id/notifications' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: key YOUR_API_KEY' \
--data '{
    "event": "end",
    "event_updates": {
        "emoji": "👋"
    },
    "contents": {
        "en": "A push ended this Live Activity"
    },
    "name": "Live Activity Ended"
}'
Outras formas de uma Live Activity terminar:
  • Use nosso método do SDK exit().
  • Usuário desliza manualmente a Live Activity para removê-la.
  • Usuário revoga permissão para Live Activities em suas Configurações do iOS.

Live Activity Encerrada

Você encerrou com sucesso a Live Activity e completou o exemplo!

Melhores práticas e recomendações

Considerações de design

  • Siga as Diretrizes de Interface Humana de Live Activities da Apple.
    • Priorize informações importantes para facilitar o entendimento em uma olhada rápida.
    • Não adicione elementos ao seu aplicativo que chamem atenção para a Dynamic Island.
    • Use margens e mantenha espaço entre elementos.
    • Use uma cor forte para o fundo. Projete para os modos Light e Dark.

Funcionalidade

Definir uma mensagem de fallback

  • Em certos casos onde o usuário não consegue receber uma atualização para sua live activity, depois que uma foi iniciada, abrir o aplicativo deve atualizá-los para continuar
    • Para explicar isso, você definiria a data de obsolescência para uma data e hora no futuro, depois que você sabe que teria enviado sua primeira atualização para o usuário, e aqueles que não receberam a atualização veriam a mensagem de fallback.
    • Você pode escutar este estado “stale” em sua UI de widget para mostrar uma mensagem de fallback:
    swift
      struct ptsLiveActivity: Widget {
      var body: some WidgetConfiguration {
          ActivityConfiguration(for: ptsAttributes.self) { context in
              //This will flip to true after the stale date
              let isStale = context.isStale 
              if !isStale{
                  VStack {
                      Text("\(context.attributes.name) \(context.state.emoji)")
                          .activityBackgroundTint(Color.cyan)
                          .activitySystemActionForegroundColor(Color.black)
                  }
              }  else {
              //If the message is stale, we request the user clicks the widget to open the app
                  VStack {
                      Text("Something went wrong, please click to refresh")
                  }
              }
      //... Rest of the widget UI
      }
    
}



---

## FAQ

### Qual é o orçamento para atualizações de alta prioridade?

A Apple não fornece um limite fixo para atualizações de alta prioridade (`priority: 10`), mas eles aplicam um orçamento dinâmico no nível do sistema. Enviar muitas atualizações de alta prioridade em um curto período pode resultar em limitação, onde atualizações são atrasadas ou descartadas.

Para reduzir o risco de limitação:
- Use uma mistura de níveis de prioridade: A Apple recomenda usar tanto `priority: 5` (padrão) quanto `priority: 10` (alta) para equilíbrio.
- Reserve `priority: 10` apenas para atualizações sensíveis ao tempo ou críticas (por exemplo, mudanças de status de pedido, placares de jogos).

Se seu caso de uso requer atualizações frequentes:
- Adicione a chave `NSSupportsLiveActivitiesFrequentUpdates` ao arquivo `Info.plist` do seu aplicativo, definida como Boolean `YES`.
- Quando este orçamento é excedido, o iOS pode solicitar ao usuário que permita atualizações adicionais. Se o usuário concordar, a Apple expandirá automaticamente o limite de atualização permitido para manter uma experiência sem problemas.

Para mais detalhes, consulte a [Documentação de Desenvolvedor da Apple](https://developer.apple.com/documentation/activitykit/starting-and-updating-live-activities-with-activitykit-push-notifications#Determine-the-update-frequency).

### Posso ler atualizações de Live Activity do aplicativo principal?

Sim. Você pode observar atualizações para depuração ou sincronização de UI:

```swift
Task {
    for await content in activity.contentUpdates {
        print("LA activity id: \(activity.id), content update: \(content.state)")
    }
}
// Example output:
// LA activity id: EFE6D54D-F7E1-45EF-9514-4C2598F8DED2, content update: ContentState(message: "My message from payload")
Rastreie mudanças de ciclo de vida:
Task {
    for await state in activity.activityStateUpdates {
        print("LA state update: \(state)")
        //Se você quiser fazer algo baseado no estado, você usaria isso:
      	if state != ActivityState.active {
            //Faça algo aqui
        }
    }
}

// Exemplo de saída 1 - LA encerrada, mas ainda visível
// LA state update: active

/* Estado pode ser igual a 4 valores possíveis no enum ActivityState
active, dismissed, ended, e stale
*/

A API retornou um 400 com uma mensagem de erro dizendo que estou acima do limite de assinantes. O que fazer?

Se sua contagem de assinantes push for maior que os Assinantes Push do seu plano, por favor atualize sua conta para o próximo plano, ou entre em contato com support@onesignal.com. Para os detalhes de plano mais recentes, veja aqui.

Como evito enviar tanto push quanto Live Activities?

Seu aplicativo pode já enviar uma série de Notificações Push, onde sua Live Activity projetada substitui a necessidade dessas Notificações Push. Por exemplo, se você envia atualizações de placar via Push, você poderia substituir isso através de uma Live Activity. Para garantir que seus usuários não estejam recebendo muitas mensagens, recomendamos que, quando seu usuário opta por uma Live Activity, adicione uma data tag. Ao adicionar esta data tag, você pode excluir usuários com esta data tag de mensagens push que possam conter o mesmo conteúdo ou similar. Leia mais sobre Data Tags e Segmentos.

Solução de problemas

Sem destinatários

Para que seus usuários sejam encontrados ao tentar iniciar ou atualizar uma Live Activity, você deve garantir que o tipo de atividade, widget e requisição cURL tenham valores correspondentes.
  1. Verifique os parâmetros de caminho em sua requisição para garantir que você está enviando uma requisição formatada corretamente para o servidor. O App ID deve corresponder ao seu App ID usado no método OneSignal.Initialize e o tipo de atividade deve corresponder ao tipo que você definiu em seu arquivo de Live Activity.
  2. No corpo da requisição da API Push To Start, você deve ter os seguintes parâmetros:
  • event: "start"
  • event_updates: Os dados dinâmicos que você definiu em sua estrutura sob o tipo de atividade e que são usados em seu widget. Garanta que o uso de maiúsculas/minúsculas e variáveis correspondam entre a requisição, o tipo e o widget.
  • event_attributes: Dados estáticos seguem a mesma lógica que Event Updates e devem incluir todas as variáveis em uso, e devem corresponder em todas as partes da live activity e da requisição
  • activity_id: Isso atribuirá um ID ao widget e é o que será usado para atualizar a atividade depois que ela for lançada no dispositivo do usuário.
  • name: O Nome da Live Activity.
  • contents: O conteúdo da mensagem necessário para enviar push.
  • headings: O cabeçalho da mensagem necessário para enviar push.
  • Um parâmetro de direcionamento como included_segments. Opções disponíveis.

Atividade enviada, mas não recebida

  1. Garanta que a requisição está formatada corretamente. Se algum campo que é usado no Widget for omitido, a atividade pode não iniciar ou atualizar como esperado.
  2. Em sua requisição da API, determine o nível de priority que você está definindo. Se você está definindo isso para 10 (prioridade mais alta), tente reduzir para 5 e teste novamente. A Apple limitará requisições sendo enviadas com muita frequência de acordo com seus próprios limites de taxa internos.
Se seu caso de uso depende de atualizações mais frequentes, adicione a chave NSSupportsLiveActivitiesFrequentUpdates ao seu Info.plist como um tipo Boolean definido para YES conforme instruído na Documentação de Desenvolvedor da Apple. O usuário verá um diálogo quando a Live Activity exceder seu orçamento de push, e se eles permitirem que a Live Activity continue, o orçamento será automaticamente aumentado para uma experiência do usuário sem problemas.
Precisa de ajuda?Converse com nossa equipe de Suporte ou envie email para support@onesignal.comPor favor inclua:
  • Detalhes do problema que você está enfrentando e passos para reproduzir se disponível
  • Seu OneSignal App ID
  • O External ID ou Subscription ID se aplicável
  • A URL para a mensagem que você testou no Dashboard OneSignal se aplicável
  • Quaisquer logs ou mensagens de erro relevantes
Estamos felizes em ajudar!