Diretrizes de publicação de clusters do Engage SDK

Este guia inclui um conjunto de diretrizes para a publicação de clusters que os desenvolvedores podem usar ao fazer a integração com o SDK Engage.

Clusters de recomendação

Título do cluster

Recomendamos que o cluster tenha um título exclusivo e relevante que ofereça aos usuários mais informações sobre o conteúdo dele.

Confira alguns exemplos de bons títulos de clusters com base no conteúdo:

  • Clusters relacionados a compras
    • Ofertas relâmpago
    • Promoções imperdíveis da semana
    • Relacionados à sua compra de Pixel Buds
    • Galochas femininas
  • Clusters de livros sobre saúde
    • Saúde, mente e corpo
    • Recomendados para você na área da saúde
    • Mais vendidos de fitness

Conteúdo do cluster

Ao publicar clusters de recomendação, os desenvolvedores precisam considerar se o usuário está ou não conectado ao aplicativo deles.

Quando o usuário está conectado

Se o usuário estiver conectado ao app do desenvolvedor, é recomendável publicar clusters de conteúdo personalizado ou gerado pelo usuário. Como o conteúdo personalizado e gerado pelo usuário é mais relevante, o usuário fica mais motivado a visitar o app do desenvolvedor na plataforma do Google.

  • É possível publicar recomendações personalizadas.
    • Confira a seguir alguns exemplos dessas recomendações:
      • Principais recomendações com base no histórico de exibição do usuário.
      • Livros semelhantes aos que estão no histórico de leitura do usuário.
      • Músicas dos artistas favoritos do usuário.
  • Bibliotecas de conteúdo gerado pelo usuário podem ser publicadas.
    • Abaixo estão alguns exemplos de bibliotecas de conteúdo gerado pelo usuário:
      • Lista de interesses do usuário no app do desenvolvedor.
      • Uma lista dos artistas favoritos do usuário, informada por ele mesmo, no app do desenvolvedor.
Tipo de recomendação Estratégia de atualização de conteúdo Diretriz de atualização de conteúdo
Recomendações personalizadas

Flexível

É importante atualizar e disponibilizar as recomendações aos usuários uma vez por dia.

Como os usuários não têm uma expectativa exata de qual será o conteúdo da recomendação, a estratégia de atualização de conteúdo pode ser flexível.
Bibliotecas de conteúdo gerado pelo usuário

Rigorosa

É recomendável atualizar a biblioteca de conteúdo quando os usuários saem do app do desenvolvedor.

É importante que esse conteúdo seja sincronizado com os dados mostrados nas plataformas do Google. Isso porque, ao contrário das recomendações personalizadas, o usuário espera um conjunto exato de conteúdo. Qualquer atraso significativo na publicação vai confundir os usuários. Portanto, a estratégia de atualização de conteúdo precisa ser rigorosa.

Quando o usuário não está conectado

Mesmo que um usuário não esteja conectado ao app do desenvolvedor, recomendamos publicar clusters para que ele seja incentivado a acessar o app na plataforma do Google.

  • Clusters de recomendação não personalizados precisam ser publicados.
    • Confira alguns exemplos de recomendações não personalizadas:
      • Os 10 principais livros lidos neste ano.
      • Filmes lançados recentemente.
      • Podcasts em alta.
  • Publique um cartão de login.
    • Para incentivar os usuários a fazer login no app, os desenvolvedores podem publicar um card de login com o cluster de recomendações não personalizadas. Confira a seção abaixo para mais detalhes sobre como publicar um Card de login.
Tipo de recomendação Estratégia de atualização de conteúdo Diretriz de atualização de conteúdo
Recomendações não personalizadas

Flexível

É importante atualizar as recomendações uma vez por dia.

Como os usuários não têm uma expectativa exata de qual será o conteúdo da recomendação, a estratégia de atualização de conteúdo pode ser flexível.
Card de login nas recomendações

Rigorosa

Recomendamos atualizar o estado do card de login à medida que os usuários saem app do desenvolvedor.

Depois que os usuários fizerem login, os desenvolvedores precisarão excluir o cartão chamando API deleteUserManagementCluster().

É importante que o estado de login seja sincronizado com a plataforma do Google. O usuário pode ficar confuso se receber um cartão de login na plataforma do Google quando já estiver conectado. Portanto, a estratégia de atualização de conteúdo precisa ser rigorosa.

Clusters de continuação

Ao publicar clusters de continuação, os desenvolvedores precisam considerar se o usuário está ou não conectado ao aplicativo deles.

Quando o usuário está conectado

  • Clusters de continuação gerados pelo usuário precisam ser publicados.
    • Consulte alguns exemplos de clusters de continuação gerados pelo usuário:
      • Continuar assistindo de onde o usuário parou.
      • Continuar lendo de onde o usuário parou.
Tipo de continuação Estratégia de atualização de conteúdo Diretriz de atualização de conteúdo
Clusters de continuação gerados pelo usuário

Rigorosa

É recomendável atualizar a biblioteca de conteúdo quando os usuários saem do app do desenvolvedor.

É importante que esse conteúdo seja sincronizado com os dados mostrados nas plataformas do Google. Isso porque, ao contrário das recomendações personalizadas, o usuário espera um conjunto exato de conteúdo. Qualquer atraso significativo na publicação vai confundir os usuários. Portanto, a estratégia de atualização de conteúdo precisa ser rigorosa.

Quando o usuário não está conectado

As jornadas de continuação são destinadas principalmente a usuários que fizeram login. No entanto, você também pode publicar clusters de continuação para usuários não conectados caso o app tenha suporte a sessões de visitante.

Cluster de Gerenciamento de usuários

O principal objetivo do cluster de Gerenciamento de usuários é incentivar a execução de ações específicas no app do provedor. Por exemplo, a ação de login direciona o usuário à página de login para que o app possa publicar ou oferecer conteúdo mais personalizado.

Card de login

Atributo Requisito Descrição
Action Uri Obrigatório Link direto para a ação (ou seja, leva à página de login do app)
Image Opcional: se não for fornecido, o título precisa ser fornecido

Imagem mostrada no card

Imagens com proporção de 16 x 9 e resolução de 1.264 x 712

Title Opcional: se não for fornecido, a imagem precisará ser fornecida Título do card
Action Text Opcional Texto mostrado no CTA (por exemplo, "Fazer login")
Subtitle Opcional Subtítulo opcional do card

Kotlin


var SIGN_IN_CARD_ENTITY =
      SignInCardEntity.Builder()
          .addPosterImage(
              Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build()

appEngagePublishClient.publishUserAccountManagementRequest(
            PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Java


SignInCardEntity SIGN_IN_CARD_ENTITY =
      new SignInCardEntity.Builder()
          .addPosterImage(
              new Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build();

appEngagePublishClient.publishUserAccountManagementRequest(
            new PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Depois que os usuários fizerem login, os desenvolvedores precisarão excluir o cartão chamando API deleteUserManagementCluster().

Atualizar o status de publicação

Se, por qualquer motivo interno, nenhum dos clusters for publicado, é altamente recomendável atualizar o status de publicação usando a API updatePublishStatus. Isso é importante pelos seguintes motivos:

  • Informar o status em todos os casos possíveis, mesmo quando o conteúdo é publicado (STATUS == PUBLISHED), é fundamental para preencher painéis que usam o status explícito para transmitir informações de integridade e outras métricas da integração.
  • Se nenhum conteúdo for publicado, mas o status da integração não estiver corrompido (STATUS == NOT_PUBLISHED), o Google poderá evitar o acionamento de alertas nos painéis de integridade do app. Isso confirma que o conteúdo não foi publicado devido a uma situação esperada pelo provedor.
  • Ajuda os desenvolvedores a oferecer insights sobre quando os dados foram publicados ou não.
  • O Google pode usar os códigos de status para incentivar o usuário a executar ações específicas no app, como acessar o conteúdo ou resolver o problema.

Lista de códigos de status de publicação que podem ser usados:

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,

// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,

// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,

// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,

// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,

// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,

// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,

// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER

Se o conteúdo não for publicado porque o usuário não estava conectado, recomendamos publicar o card de login. Se, por algum motivo, os provedores não conseguirem publicar o card de login, recomendamos chamar a API updatePublishStatus usando o código de status NOT_PUBLISHED_REQUIRES_SIGN_IN.

Kotlin


client.updatePublishStatus(
   PublishStatusRequest.Builder()
     .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
     .build())

Java


client.updatePublishStatus(
    new PublishStatusRequest.Builder()
        .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
        .build());

WorkManager para publicação de clusters

É importante usar o WorkManager para publicar clusters, porque essa é a solução recomendada para trabalhos em segundo plano em que a execução precisa ser oportuna e garantida.

  • O WorkManager executa o trabalho em segundo plano o mais rápido possível.
  • Ele processa a lógica para iniciar o trabalho em várias condições, mesmo que um usuário saia do app.

Quando o usuário sai do app, recomendamos iniciar um job em segundo plano que publique clusters de continuação com clusters de recomendação. Um bom local para processar essa lógica é o Activity.onStop(), que é chamado quando o usuário sai do app.

Sugerimos usar PeriodicWorkRequest para programar um job recorrente que publique clusters a cada 24 horas. Os desenvolvedores podem garantir que o WorkManager envie dados atualizados sempre que um usuário sair do app usando uma política CANCEL_AND_REENQUEUE para acionar o trabalho. Isso ajuda a evitar que os usuários acessem dados desatualizados.

O exemplo a seguir demonstra isso:

// Define the PublishClusters Worker requiring input
public class PublishClusters extends Worker {

   public PublishClusters(Context appContext, WorkerParameters workerParams) {
       super(appContext, workerParams);
   }

   @NonNull
   @Override
   public Result doWork() {
       // publish clusters
   }
   ...
}

public static void schedulePublishClusters(Context appContext) {
// Create a PeriodicWorkRequest to schedule a recurring job to update
// clusters at a regular interval
PeriodicWorkRequest publishClustersEntertainmentSpace =
// Define the time for the periodic job
       new PeriodicWorkRequest.Builder(PublishClusters.class, 24, TimeUnit.HOURS)
// Set up a tag for the worker.
// Tags are Unique identifier, which can be used to identify that work
// later in order to cancel the work or observe its progress.
          .addTag("Publish Clusters to Entertainment Space")
          .build();

// Trigger Periodic Job, this will ensure that the periodic job is triggered
// only once since we have defined a uniqueWorkName
WorkManager.getInstance(appContext).enqueueUniquePeriodicWork(
// uniqueWorkName
     "publishClustersEntertainmentSpace",
// If a work with the uniqueWorkName is already running, it will cancel the
// existing running jobs and replace it with the new instance.
// ExistingPeriodicWorkPolicy#CANCEL_AND_REENQUEUE
     ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
// Recurring Work Request
publishClustersEntertainmentSpace);

}

Processar intents de transmissão

Além de fazer chamadas de API de conteúdo de publicação usando um job, também é necessário configurar um BroadcastReceiver para receber a solicitação de publicação de conteúdo.

No entanto, os desenvolvedores precisam ter cuidado para não depender apenas de transmissões, porque elas são acionadas apenas em determinadas situações, principalmente para reativar apps e para forçar uma sincronização de dados. Elas são acionadas somente quando o serviço Engage determina que o conteúdo pode estar desatualizado. Dessa forma, há mais confiança de que o usuário terá uma experiência de conteúdo atualizada, mesmo que o aplicativo não tenha sido aberto há muito tempo.

O BroadcastReceiver precisa ser configurado de duas maneiras:

  • Registre dinamicamente uma instância da classe BroadcastReceiver usando Context.registerReceiver(). Isso permite a comunicação de aplicativos que ainda estão ativos na memória.
  • Declare estaticamente uma implementação com a tag <receiver> no arquivo AndroidManifest.xml. Isso permite que o aplicativo receba intents de transmissão quando não está em execução e também permite que ele publique o conteúdo.