SDK Engage Shopping: instruções técnicas de integração de terceiros

O Google está criando uma plataforma no dispositivo que organiza os apps dos usuários por categoria e possibilita uma nova experiência imersiva para consumo e descoberta de conteúdo personalizado de apps. Essa experiência em tela cheia oferece aos parceiros dos desenvolvedores uma oportunidade de mostrar o melhor conteúdo avançado em um canal dedicado fora do app.

Este guia contém instruções para que os parceiros dos desenvolvedores integrem o conteúdo de compras deles, usando o SDK Engage para preencher essa nova área e as plataformas do Google, como a Entertainment Space.

Detalhe de integração

Terminologia

Essa integração inclui os cinco tipos de cluster a seguir: recomendação, destaque, carrinho de compras, lista de compras, pedir de novo e rastreamento de pedidos de compras.

  • Os clusters de recomendação mostram sugestões de compras personalizadas de um parceiro de desenvolvimento. Essas recomendações podem ser personalizadas para o usuário ou generalizadas (por exemplo, itens em alta). Use-as para mostrar produtos, eventos, vendas, promoções e assinaturas conforme achar adequado.

    As recomendações têm esta estrutura:

    • Cluster de recomendação: uma visualização de interface que contém um grupo de recomendações do mesmo parceiro do desenvolvedor.

    • ShoppingEntity: um objeto que representa um único item em um cluster.

  • O cluster de destaque mostra uma seleção de entidades de vários parceiros de desenvolvimento em um único grupo de interfaces. Há um único cluster de destaque, exibido perto da parte de cima da interface, com um posicionamento prioritário acima de todos os clusters de recomendação. Cada parceiro de desenvolvedor pode transmitir até 10 entidades no cluster de destaque.

  • O cluster de carrinho de compras mostra uma prévia dos carrinhos de compras de vários parceiros de desenvolvedores em um grupo de interfaces, incentivando os usuários a concluir os carrinhos pendentes. Há um único cluster de "carrinho de compras", mostrado perto da parte de cima da interface, com um posicionamento prioritário acima de todos os clusters de "Recomendação". Cada parceiro de desenvolvedor pode transmitir até três instâncias de ShoppingCart no cluster de carrinho de compras.

    Seu carrinho de compras tem a seguinte estrutura:

    • Cluster de carrinho de compras: uma visualização da interface que contém um grupo de carrinho de compras de vários parceiros de desenvolvedores.

    • ShoppingCart: um objeto que representa a visualização do carrinho de compras de um único parceiro de desenvolvedores. O ShoppingCart precisa mostrar o número total de itens no carrinho do usuário e também pode incluir imagens de alguns deles.

  • O cluster de lista de compras mostra uma prévia das listas de compras de vários parceiros desenvolvedores em um grupo de interfaces, solicitando que os usuários retornem ao app correspondente para atualizar e concluir as listas. Há um único cluster de lista de compras.

  • O cluster de pedir de novo mostra uma prévia dos pedidos anteriores de vários parceiros para desenvolvedores em um grupo de interfaces, pedindo que os usuários façam pedidos novamente. Há um único cluster de "pedir de novo".

    • O cluster de pedir de novo precisa mostrar o número total de itens no pedido anterior do usuário e incluir uma das opções abaixo:

      • Imagens de alguns itens do pedido anterior do usuário.
      • Rótulos de alguns itens do pedido anterior do usuário.
  • O cluster de rastreamento de pedidos de compras mostra uma prévia dos pedidos de compras pendentes ou concluídos recentemente de vários parceiros de desenvolvedores em um grupo de interfaces, permitindo que os usuários rastreiem os pedidos.

    Há um único cluster de rastreamento de pedidos de compras exibido perto da parte de cima da interface, com um posicionamento prioritário acima de todos os clusters de recomendação. Cada parceiro de desenvolvedor pode transmitir vários itens de ShoppingOrderTrackingEntity no cluster de rastreamento de pedidos do Shopping.

    • O ShoppingOrderTrackingCluster tem a seguinte estrutura:

      • Cluster de rastreamento de pedidos de compras: uma visualização de interface que contém um grupo de visualizações de rastreamento de pedidos de vários parceiros de desenvolvimento.
      • ShoppingOrderTrackingEntity: um objeto que representa uma prévia de rastreamento de pedido de compra de um único parceiro de desenvolvedor, para ser exibido no cluster de rastreamento de pedidos de compras. A ShoppingOrderTrackingEntity precisa mostrar o status e o horário do pedido. É altamente recomendável preencher o tempo de entrega esperado para ShoppingOrderTrackingEntity, porque ele é exibido aos usuários quando fornecido.

Pré-trabalho

Nível mínimo da API: 19

Adicione a biblioteca com.google.android.engage:engage-core ao app:

dependencies {
    // Make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.engage:engage-core:1.5.2'
}

Para mais informações, consulte Visibilidade de pacotes no Android 11.

Resumo

O design é baseado na implementação de um serviço vinculado.

Os dados que um cliente pode publicar estão sujeitos aos seguintes limites para diferentes tipos de clusters:

Tipo de cluster Limites de cluster Limites máximos de entidades em um cluster
Clusters de recomendação No máximo 5 No máximo 25 ShoppingEntity
Cluster de destaque No máximo 1 No máximo 10 ShoppingEntity
Cluster de carrinho de compras No máximo 1 No máximo 3 ShoppingCart

Vários carrinhos são esperados apenas para apps com carrinhos separados por comerciante.

Cluster de lista de compras No máximo 1 No máximo 1 ShoppingListEntity
Cluster de pedir de novo No máximo 1 No máximo 1 ReorderEntity
Cluster de rastreamento de pedidos de compras No máximo 3 No máximo 3 ShoppingOrderTrackingEntity

Etapa 1: fornecer dados da entidade

O SDK definiu entidades diferentes para representar cada tipo de item. As entidades abaixo oferecem suporte à categoria "Compras":

  1. ShoppingEntity
  2. ShoppingCart
  3. ShoppingList
  4. Reorder
  5. ShoppingOrderTracking

As tabelas abaixo descrevem os atributos e os requisitos disponíveis para cada tipo.

ShoppingEntity

O objeto ShoppingEntity representa um produto, promoção, transação, assinatura ou evento que os parceiros de desenvolvedores querem publicar.

ShoppingEntity
Atributo Requisito Descrição Formato
Poster images Obrigatório É necessário fornecer pelo menos uma imagem. Consulte as orientações em Especificações de imagem.
Action Uri Obrigatório

O link direto para a página no app que mostra detalhes sobre a entidade.

Observação: é possível usar links diretos para atribuição. Consulte as perguntas frequentes

URI
Title Opcional É o nome da entidade.

Texto livre

Tamanho de texto recomendado: menos de 90 caracteres (um texto muito longo será mostrado com reticências)

Price - current Obrigatório sob certas condições

É o preço atual da entidade.

Precisa ser fornecido se o preço tachado for informado.

Texto livre
Price - strikethrough Opcional O preço original da entidade, que aparece com desconto na interface. Texto livre
Callout Opcional Frase de destaque para apresentar uma promoção, evento ou atualização da entidade, se disponível.

Texto livre

Tamanho de texto recomendado: menos de 45 caracteres (um texto muito longo será mostrado com reticências)

Callout fine print Opcional Texto com os termos da frase de destaque.

Texto livre

Tamanho de texto recomendado: menos de 45 caracteres (um texto muito longo será mostrado com reticências)

Classificação (opcional): todas as classificações são mostradas usando nosso sistema padrão de avaliação com estrelas.
Classificação - Valor máximo Opcional

O valor máximo da escala de avaliação.

Precisa ser fornecido se o valor atual da classificação também for informado.

Número maior ou igual a 0,0
Rating - Current value Opcional

O valor atual da escala de avaliação.

Precisa ser fornecido se o valor máximo de avaliação também for fornecido.

Número maior ou igual a 0,0
Rating - Count Opcional

O número de classificações da entidade.

Observação: forneça esse campo se o app controlar como a contagem é exibida para os usuários. Use uma string concisa. Por exemplo, se a contagem for 1.000.000, use uma abreviação, como 1M, para que a contagem não seja truncada em tamanhos de exibição menores.

String
Rating - Count Value Opcional

A contagem das classificações da entidade.

Observação: forneça este campo se você não processar a lógica de exibição de abreviação. Se o valor de contagem e a contagem estiverem presentes, a contagem será mostrada aos usuários.

Longo
DisplayTimeWindow (opcional): define uma janela de tempo para que um conteúdo seja mostrado na plataforma
Start Timestamp Opcional

Carimbo de data/hora da época depois da qual o conteúdo será mostrado na plataforma.

Se não for definido, o conteúdo poderá ser mostrado na plataforma.

Carimbo de data/hora da época em milissegundos
End Timestamp Opcional

Carimbo de data/hora da época depois da qual o conteúdo não é mais mostrado na plataforma.

Se não for definido, o conteúdo poderá ser mostrado na plataforma.

Carimbo de data/hora da época em milissegundos

ShoppingCart

Atributo Requisito Descrição Formato
Action Uri Obrigatório

O link direto para o carrinho de compras no app do parceiro.

Observação: é possível usar links diretos para atribuição. Consulte as perguntas frequentes

URI
Number of items Obrigatório

Número de itens (não apenas o número de produtos) no carrinho de compras.

Por exemplo: se houver três camisetas idênticas e um chapéu no carrinho, esse número precisa ser 4.

Número inteiro: a partir de 1
Action Text Opcional

O texto de call-to-action do botão no carrinho de compras (por exemplo, Sua sacola de compras).

Se o desenvolvedor não fornecer um texto de ação, View Cart (conferir carrinho) será o padrão.

Esse atributo tem suporte na versão 1.1.0 ou mais recente.

String
Title Opcional

O título do carrinho (por exemplo, Sua sacola de compras).

Se o desenvolvedor não fornecer nenhum título, Seu carrinho será o padrão.

Se o parceiro de desenvolvimento publicar um carrinho separado por comerciante, inclua o nome do comerciante no título.

Texto livre

Tamanho de texto recomendado: menos de 25 caracteres (um texto muito longo será mostrado com reticências)

Cart images Opcional

Imagens de cada produto no carrinho.

É possível fornecer até 10 imagens em ordem de prioridade. O número real de imagens exibidas depende do formato do dispositivo.

Consulte as orientações em Especificações de imagem.
Item labels Opcional

Lista de rótulos para itens na lista de compras.

O número real de rótulos mostrados depende do formato do dispositivo.

Lista de rótulos de texto livre

Tamanho de texto recomendado: menos de 20 caracteres (um texto muito longo será mostrado com reticências)

Carimbo de data/hora da última interação do usuário Opcional Número de milissegundos decorridos desde a época, identificando a última vez que o usuário interagiu com o carrinho.

Isso será transmitido como entrada pelos parceiros de desenvolvedores que publicam carrinhos separados por comerciante e pode ser usado para classificação.

Carimbo de data/hora da época em milissegundos
DisplayTimeWindow (opcional): define uma janela de tempo para que um conteúdo seja mostrado na plataforma
Start Timestamp Opcional

Carimbo de data/hora da época depois da qual o conteúdo será mostrado na plataforma.

Se não for definido, o conteúdo poderá ser mostrado na plataforma.

Carimbo de data/hora da época em milissegundos
End Timestamp Opcional

Carimbo de data/hora da época depois da qual o conteúdo não é mais mostrado na plataforma.

Se não for definido, o conteúdo poderá ser mostrado na plataforma.

Carimbo de data/hora da época em milissegundos

ShoppingList

Atributo Requisito Descrição Formato
Action Uri Obrigatório

O link direto para a lista de compras no app do parceiro.

Observação: é possível usar links diretos para atribuição. Consulte as perguntas frequentes

URI
Number of items Obrigatório Número de itens na lista de compras. Número inteiro: a partir de 1
Title Opcional

O título da lista (por exemplo, Sua lista de compras).

Se o desenvolvedor não fornecer um título, lista de compras será o padrão.

Texto livre

Tamanho de texto recomendado: menos de 25 caracteres (um texto muito longo será mostrado com reticências)

Item labels Obrigatório

Lista de rótulos para itens na lista de compras.

Pelo menos um rótulo precisa ser fornecido, com até 10 rótulos em ordem de prioridade. O número real de rótulos exibidos depende do formato do dispositivo.

Lista de rótulos de texto livre

Tamanho de texto recomendado: menos de 20 caracteres (um texto muito longo será mostrado com reticências)

ShoppingReorderCluster

Atributo Requisito Descrição Formato
Action Uri Obrigatório

O link direto para fazer um novo pedido no app do parceiro.

Observação: é possível usar links diretos para atribuição. Consulte as perguntas frequentes

URI
Action Text Opcional

O texto de call-to-action do botão para fazer o pedido novamente (por exemplo, Pedir de novo).

Se o desenvolvedor não fornecer um texto de ação, Reordenar será o padrão.

Esse atributo tem suporte na versão 1.1.0 ou mais recente.

String
Number of items Obrigatório

O número de itens (não apenas o número de produtos) no pedido anterior.

Por exemplo: se houver três cafés pequenos e um croissant no pedido anterior, esse número deverá ser 4.

Número inteiro: a partir de 1
Title Obrigatório O título do item do novo pedido.

Texto livre

Tamanho de texto recomendado: menos de 40 caracteres (um texto muito longo será mostrado com reticências)

Item labels

Opcional

Se não forem fornecidos, as imagens do pôster precisam ser fornecidas.

Lista de rótulos de itens para o pedido anterior.

É possível fornecer até 10 rótulos em ordem de prioridade. O número real de rótulos exibidos depende do formato do dispositivo.

Lista de texto livre

Tamanho de texto recomendado por rótulo: menos de 20 caracteres (um texto muito longo será mostrado com reticências)

Poster images

Opcional

Se não forem fornecidos, os rótulos de item devem ser fornecidos.

Imagens dos itens no pedido anterior.

É possível fornecer até 10 imagens em ordem de prioridade. O número real de imagens exibidas depende do formato do dispositivo.

Consulte as orientações em Especificações de imagem.

ShoppingOrderTrackingCluster

Atributo Requisito Descrição Formato
Título Obrigatório

Um título breve do pacote/item que está sendo rastreado ou o número de rastreamento.

Texto livre

Tamanho de texto recomendado: 50 caracteres (um texto muito longo será mostrado com reticências)

Tipo de pedido Obrigatório

Um título curto dos pacotes/itens que estão sendo rastreados ou o número de rastreamento.

Enum: IN_STORE_PICKUP, SAME_DAY_DELIVERY, MULTI_DAY_DELIVERY

Status Obrigatório

O status atual do pedido.

Por exemplo: "Atraso", "Em trânsito", "Atrasado", "Enviado", "Entregue", "Fora de estoque", "Pedido pronto"

Texto livre

Tamanho de texto recomendado: 25 caracteres (um texto muito longo será exibido com reticências)

Horário do pedido Obrigatório

O carimbo de data/hora da época em milissegundos em que o pedido foi feito.

O horário do pedido será exibido se a janela de tempo de entrega esperada não estiver presente

Carimbo de data/hora da época em milissegundos
Action Uri Obrigatório

Link direto para o rastreamento de pedidos no app do parceiro.

URI
OrderDeliveryTimeWindow (opcional): define uma janela de tempo para o pedido que está sendo rastreado desde o momento em que ele foi feito até o momento da entrega esperada/real.
OrderDeliveryTimeWindow - Start Time Opcional

O carimbo de data/hora da época em milissegundos em que o pedido será entregue ou estará pronto para retirada.

Carimbo de data/hora da época em milissegundos
OrderDeliveryTimeWindow - Horário de término Opcional

O carimbo de data/hora da época em milissegundos em que o pedido será entregue ou estará pronto para retirada.

Carimbo de data/hora da época em milissegundos
Poster images Opcional

Imagem de um item/produto que faz parte do pedido.

A proporção recomendada é 1:1

Consulte as orientações em Especificações de imagem.
Number of items Opcional O número de itens no pedido. Número inteiro: a partir de 1
Descrição Opcional

Um único parágrafo de texto para descrever os itens do pedido.

Observação:a lista de legendas ou de descrição será exibida para o usuário, não ambos.

Texto livre

Tamanho de texto recomendado: 180 caracteres

Lista de legendas Opcional

Até três legendas, cada uma sendo uma linha de texto.

Observação: a descrição ou a lista de subtítulos será exibida para o usuário, não as duas.

Texto livre

Tamanho de texto recomendado para cada legenda: no máximo 50 caracteres

Valor do pedido - CurrentPrice Opcional O valor atual do pedido. Texto livre
Número do pedido Opcional O número/ID do pedido que pode ser usado para identificar exclusivamente o pedido.

Texto livre

Tamanho de texto recomendado: no máximo 25 caracteres

Número de rastreamento Opcional O número de rastreamento para a entrega do pedido/pacote, caso o pedido exija uma entrega.

Texto livre

Tamanho de texto recomendado: no máximo 25 caracteres

Especificações da imagem

Consulte abaixo as especificações necessárias para recursos de imagem:

Proporção Mínimo de pixels Pixels recomendados

Quadrada (1 x 1)

Preferível para clusters que não estão em destaque

300 x 300 1.200 x 1.200

Paisagem (1,91 x 1)

Preferível para clusters em destaque

600 x 314 1.200 x 628
Retrato (4 x 5) 480 x 600 960 x 1.200

Formatos de arquivo

PNG, JPG, GIF estático, WebP

Tamanho máximo do arquivo

5.120 KB

Recomendações adicionais

  • Área de segurança da imagem: posicione o conteúdo importante no centro da imagem, ocupando 80% do espaço.
  • Use um plano de fundo transparente para que a imagem possa ser exibida corretamente nas configurações do tema claro e escuro.

Etapa 2: fornecer dados do cluster

É recomendável executar o job de publicação de conteúdo em segundo plano (por exemplo, usando o WorkManager) e o programar com frequência ou por evento (por exemplo, toda vez que o usuário abrir o app ou adicionar algo ao carrinho).

AppEngageShoppingClient é responsável pela publicação de clusters de compras.

Estas APIs são expostas para publicar clusters no cliente:

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishShoppingCart
  • publishShoppingCarts
  • publishShoppingList
  • publishShoppingReorderCluster
  • publishShoppingOrderTrackingCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteShoppingCartCluster
  • deleteShoppingListCluster
  • deleteShoppingReorderCluster
  • deleteShoppingOrderTrackingCluster
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

Essa API é usada para conferir se o serviço está disponível para integração e se o conteúdo pode ser apresentado no dispositivo.

Kotlin

client.isServiceAvailable.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // Handle IPC call success
        if(task.result) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
}

Java

client.isServiceAvailable().addOnCompleteListener(task - > {
    if (task.isSuccessful()) {
        // Handle success
        if(task.getResult()) {
          // Service is available on the device, proceed with content
          // publish calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
});

publishRecommendationClusters

Essa API é usada para publicar uma lista de objetos RecommendationCluster.

Um objeto RecommendationCluster pode ter os seguintes atributos:

Atributo Requisito Descrição
List of ShoppingEntity Obrigatório Uma lista de objetos ShoppingEntity que compõem as recomendações desse cluster de recomendação.
Title Obrigatório

O título do cluster de recomendação.

Tamanho de texto recomendado: menos de 25 caracteres (um texto muito longo será mostrado com reticências)

Subtítulo Opcional O subtítulo do cluster de recomendação.
Action Uri Opcional

O link direto para a página no app do parceiro em que os usuários podem acessar a lista completa de recomendações.

Observação: é possível usar links diretos para atribuição. Consulte as perguntas frequentes

Kotlin

client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Black Friday Deals")
                        .build())
                .build())

Java

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Black Friday Deals")
                        .build())
                .build());

Quando o serviço recebe a solicitação, as ações abaixo ocorrem em uma transação:

  • Todos os dados do cluster de recomendação são removidos.
  • Os dados da solicitação são analisados e armazenados em novos clusters de recomendação.

Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

publishFeaturedCluster

Essa API é usada para publicar um objeto FeaturedCluster.

Kotlin

client.publishFeaturedCluster(
            PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    FeaturedCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishFeaturedCluster(
            new PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    new FeaturedCluster.Builder()
                        ...
                        .build())
                .build());

Quando o serviço recebe a solicitação, as ações abaixo ocorrem em uma transação:

  • Os dados do FeaturedCluster do parceiro do desenvolvedor são removidos.
  • Os dados da solicitação são analisados e armazenados no cluster de destaque atualizado.

Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

publishShoppingCart

Essa API é usada para publicar um objeto ShoppingCartCluster.

Kotlin

client.publishShoppingCart(
            PublishShoppingCartRequest.Builder()
                .setShoppingCart(
                    ShoppingCart.Builder()
                        ...
                        .build())
                .build())

Java

client.publishShoppingCart(
            new PublishShoppingCartRequest.Builder()
                .setShoppingCart(
                    new ShoppingCart.Builder()
                        ...
                        .build())
                .build())

Quando o serviço recebe a solicitação, as ações abaixo ocorrem em uma transação:

  • Os dados do ShoppingCart do parceiro do desenvolvedor são removidos.
  • Os dados da solicitação são analisados e armazenados no cluster de carrinho de compras atualizado.

Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

publishShoppingCarts

Essa API é usada para publicar vários objetos ShoppingCart. Isso se aplica a parceiros de desenvolvedores que publicam carrinhos separados por comerciante. Inclua o nome do comerciante no título ao usar essa API.

Kotlin

client.publishShoppingCarts(
            PublishShoppingCartClustersRequest.Builder()
                .addShoppingCart(
                    ShoppingCart.Builder()
                        ...
                        .build())
                .build())

Java

client.publishShoppingCarts(
            new PublishShoppingCartClustersRequest.Builder()
                .addShoppingCart(
                    new ShoppingCart.Builder()
                        ...
                        .build())
                .build())

Quando o serviço recebe a solicitação, as ações abaixo ocorrem em uma transação:

  • Os dados do ShoppingCart do parceiro do desenvolvedor são removidos.
  • Os dados da solicitação são analisados e armazenados no cluster de carrinho de compras atualizado.

Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

publishShoppingList

Essa API é usada para publicar um objeto FoodShoppingList.

Kotlin

client.publishFoodShoppingList(
            PublishFoodShoppingListRequest.Builder()
                .setFoodShoppingList(
                    FoodShoppingListEntity.Builder()
                        ...
                        .build())
                .build())

Java

client.publishFoodShoppingList(
            new PublishFoodShoppingListRequest.Builder()
                .setFoodShoppingList(
                    new FoodShoppingListEntity.Builder()
                        ...
                        .build())
                .build());

Quando o serviço recebe a solicitação, as ações abaixo ocorrem em uma transação:

  • Os dados do FoodShoppingList do parceiro do desenvolvedor são removidos.
  • Os dados da solicitação são analisados e armazenados no cluster de lista de compras atualizado.

Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

publishShoppingReorderCluster

Essa API é usada para publicar um objeto ShoppingReorderCluster.

Kotlin

client.publishShoppingReorderCluster(
            PublishShoppingReorderClusterRequest.Builder()
                .setReorderCluster(
                    ShoppingReorderCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishShoppingReorderCluster(
            new PublishShoppingReorderClusterRequest.Builder()
                .setReorderCluster(
                    new ShoppingReorderCluster.Builder()
                        ...
                        .build())
                .build());

Quando o serviço recebe a solicitação, as ações abaixo ocorrem em uma transação:

  • Os dados do ShoppingReorderCluster do parceiro do desenvolvedor são removidos.
  • Os dados da solicitação são analisados e armazenados no cluster de novo pedido atualizado.

Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

publishShoppingOrderTrackingCluster

Essa API é usada para publicar um objeto ShoppingOrderTrackingCluster.

Kotlin

client.publishShoppingOrderTrackingCluster(
            PublishShoppingOrderTrackingClusterRequest.Builder()
                .setShoppingOrderTrackingCluster(
                    ShoppingOrderTrackingCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishShoppingOrderTrackingCluster(
            new PublishShoppingOrderTrackingClusterRequest.Builder()
                .setShoppingOrderTrackingCluster(
                    new ShoppingOrderTrackingCluster.Builder()
                        ...
                        .build())
                .build());

Quando o serviço recebe o pedido, as seguintes ações ocorrem em uma transação:

  • Os dados do ShoppingOrderTrackingCluster do parceiro do desenvolvedor são removidos.
  • Os dados da solicitação são analisados e armazenados no cluster de rastreamento de pedidos de compras atualizado.

Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

publishUserAccountManagementRequest

Essa API é usada para publicar um card de login. A ação de login direciona os usuários à página de login do app para que ele possa publicar ou oferecer conteúdo mais personalizado.

Os metadados abaixo fazem parte do 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()

client.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();

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

Quando o serviço recebe o pedido, as seguintes ações ocorrem em uma transação:

  • Os dados do UserAccountManagementCluster do parceiro do desenvolvedor são removidos.
  • Os dados do pedido são analisados e armazenados no cluster UserAccountManagementCluster atualizado.

Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

updatePublishStatus

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, o Google recomenda 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());

deleteRecommendationClusters

Essa API é usada para excluir o conteúdo dos clusters de recomendação.

Kotlin

client.deleteRecommendationClusters()

Java

client.deleteRecommendationClusters();

Quando o serviço recebe o pedido, ele remove os dados atuais dos clusters de recomendação. Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

deleteFeaturedCluster

Essa API é usada para excluir o conteúdo do cluster de destaque.

Kotlin

client.deleteFeaturedCluster()

Java

client.deleteFeaturedCluster();

Quando o serviço recebe o pedido, ele remove os dados atuais do cluster de destaque. Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

deleteShoppingCartCluster

Essa API é usada para excluir o conteúdo do cluster de carrinho de compras.

Kotlin

client.deleteShoppingCartCluster()

Java

client.deleteShoppingCartCluster();

Quando o serviço recebe a solicitação, ele remove os dados atuais do cluster de carrinho de compras. Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

deleteShoppingListCluster

Essa API é usada para excluir o conteúdo do cluster de lista de compras.

Kotlin

client.deleteShoppingListCluster()

Java

client.deleteShoppingListCluster();

Quando o serviço recebe a solicitação, ele remove os dados atuais do cluster de "lista de compras". Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

deleteShoppingReorderCluster

Essa API é usada para excluir o conteúdo do cluster de pedir de novo.

Kotlin

client.deleteShoppingReorderCluster()

Java

client.deleteShoppingReorderCluster();

Quando o serviço recebe a solicitação, ele remove os dados atuais do cluster de "pedir de novo". Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

deleteShoppingOrderTrackingCluster

Essa API é usada para excluir o conteúdo do cluster de rastreamento de pedidos de compras.

Kotlin

client.deleteShoppingOrderTrackingCluster()

Java

client.deleteShoppingOrderTrackingCluster();

Quando o serviço recebe a solicitação, ele remove os dados atuais do cluster de rastreamento de pedidos de compras. Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

deleteUserManagementCluster

Essa API é usada para excluir o conteúdo do cluster UserAccountManagement.

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

Quando o serviço recebe o pedido, ele remove os dados atuais do cluster UserAccountManagement. Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

deleteClusters

Essa API é usada para excluir o conteúdo de determinado tipo de cluster.

Kotlin

client.deleteClusters(
    DeleteClustersRequest.Builder()
      .addClusterType(ClusterType.TYPE_FEATURED)
      .addClusterType(ClusterType.TYPE_RECOMMENDATION)
      ...
      .build())

Java

client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .addClusterType(ClusterType.TYPE_FEATURED)
                .addClusterType(ClusterType.TYPE_RECOMMENDATION)
                ...
                .build());

Quando o serviço recebe a solicitação, ele remove os dados de todos os clusters que correspondem aos tipos especificados. Os clientes podem transmitir um ou vários tipos de clusters. Em caso de erro, a solicitação inteira é rejeitada e o estado existente é mantido.

Tratamento de erros

É recomendável detectar o resultado da tarefa nas APIs de publicação. Com isso, uma ação de acompanhamento pode ser realizada para extrair e reenviar uma tarefa bem-sucedida.

Kotlin

client.publishRecommendationClusters(
        PublishRecommendationClustersRequest.Builder()
          .addRecommendationCluster(..)
          .build())
      .addOnCompleteListener { task ->
        if (task.isSuccessful) {
          // do something
        } else {
          val exception = task.exception
          if (exception is AppEngageException) {
            @AppEngageErrorCode val errorCode = exception.errorCode
            if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
              // do something
            }
          }
        }
      }

Java

client.publishRecommendationClusters(
              new PublishRecommendationClustersRequest.Builder()
                  .addRecommendationCluster(...)
                  .build())
          .addOnCompleteListener(
              task -> {
                if (task.isSuccessful()) {
                  // do something
                } else {
                  Exception exception = task.getException();
                  if (exception instanceof AppEngageException) {
                    @AppEngageErrorCode
                    int errorCode = ((AppEngageException) exception).getErrorCode();
                    if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
                      // do something
                    }
                  }
                }
              });

O erro é retornado como AppEngageException e a causa é incluída como um código de erro.

Código do erro Nome do erro Observação
1 SERVICE_NOT_FOUND O serviço não está disponível no dispositivo.
2 SERVICE_NOT_AVAILABLE O serviço está disponível no dispositivo em questão, mas não no momento da chamada (por exemplo, está desativado).
3 SERVICE_CALL_EXECUTION_FAILURE A execução da tarefa falhou devido a problemas de linha de execução. Nesse caso, ela pode ser repetida.
4 SERVICE_CALL_PERMISSION_DENIED O autor da chamada não tem permissão para fazer a chamada de serviço.
5 SERVICE_CALL_INVALID_ARGUMENT A solicitação contém dados inválidos (por exemplo, tem um número de clusters maior do que o permitido).
6 SERVICE_CALL_INTERNAL Há um erro no serviço.
7 SERVICE_CALL_RESOURCE_EXHAUSTED A chamada de serviço é feita com muita frequência.

Etapa 3: 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.

O objetivo principal das intents de transmissão é reativar o app e forçar a sincronização de dados. As intents de transmissão não são projetadas para envio muito frequente. Elas só são acionadas quando o serviço do Engage determina que o conteúdo pode estar desatualizado (por exemplo, é de uma semana atrás). Dessa forma, há mais confiança de que o usuário poderá ter uma nova experiência de conteúdo, mesmo que o aplicativo não tenha sido executado por um longo período.

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.

Kotlin

class AppEngageBroadcastReceiver : BroadcastReceiver(){
  // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION
  // broadcast is received
  // Trigger featured cluster publish when PUBLISH_FEATURED broadcast is
  // received
  // Trigger shopping cart cluster publish when PUBLISH_SHOPPING_CART broadcast
  // is received
  // Trigger shopping list cluster publish when PUBLISH_SHOPPING_LIST broadcast
  // is received
  // Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER broadcast is
  // received
  // Trigger shopping order tracking cluster publish when
  // PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER broadcast is received
}

fun registerBroadcastReceivers(context: Context){
  var  context = context
  context = context.applicationContext

// Register Recommendation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_RECOMMENDATION))

// Register Featured Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_FEATURED))

// Register Shopping Cart Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_CART))

// Register Shopping List Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_LIST))

// Register Reorder Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_REORDER_CLUSTER))

// Register Shopping Order Tracking Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER))
}

Java

class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received

// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received

// Trigger shopping cart cluster publish when PUBLISH_SHOPPING_CART broadcast is
// received

// Trigger shopping list cluster publish when PUBLISH_SHOPPING_LIST broadcast is
// received

// Trigger reorder cluster publish when PUBLISH_REORDER_CLUSTER broadcast is
// received

// Trigger reorder cluster publish when PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER
// broadcast is received
}

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION));

// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED));

// Register Shopping Cart Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_CART));

// Register Shopping List Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_LIST));

// Register Reorder Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_REORDER_CLUSTER));

// Register Shopping Order Tracking Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.shopping.service.Intents.ACTION_PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER));

}
  • 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.
<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:exported="true"
      android:enabled="true">
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_CART" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_LIST" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_REORDER_CLUSTER" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.shopping.PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER" />
      </intent-filter>
   </receiver>
</application>

As intents abaixo são enviadas pelo serviço:

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION É recomendável iniciar uma chamada publishRecommendationClusters quando essa intent for recebida.
  • com.google.android.engage.action.PUBLISH_FEATURED É recomendável iniciar uma chamada publishFeaturedCluster quando essa intent for recebida.
  • com.google.android.engage.action.shopping.PUBLISH_SHOPPING_CART É recomendável iniciar uma chamada publishShoppingCart quando essa intent for recebida.
  • com.google.android.engage.action.shopping.PUBLISH_SHOPPING_LIST É recomendável iniciar uma chamada publishShoppingList quando essa intent for recebida.
  • com.google.android.engage.action.shopping.PUBLISH_REORDER_CLUSTER É recomendável iniciar uma chamada publishReorderCluster quando essa intent for recebida.
  • com.google.android.engage.action.shopping.PUBLISH_SHOPPING_ORDER_TRACKING_CLUSTER É recomendável iniciar uma chamada publishShoppingOrderTrackingCluster quando essa intent for recebida.

Fluxo de trabalho de integração

Para acessar um guia explicativo sobre como verificar a integração após a conclusão, consulte Fluxo de trabalho de integração de desenvolvedor.

Perguntas frequentes

Consulte as Perguntas frequentes sobre o SDK Engage para acessar as perguntas frequentes.

Contato

Entre em contato com engagement-developers@google.com se tiver perguntas durante o processo de integração. Nossa equipe responderá assim que possível.

Próximas etapas

Depois de concluir essa integração, as próximas etapas serão as seguintes:

  • Envie um e-mail para engage-developers@google.com e anexe seu APK integrado pronto para ser testado pelo Google.
  • O Google realiza uma verificação e revisão interna para garantir que a integração funcione como esperado. Se for necessário fazer mudanças, o Google vai entrar em contato informando todos os detalhes necessários.
  • Quando o teste estiver concluído e nenhuma mudança for necessária, o Google vai entrar em contato para informar que você pode começar a publicar o APK atualizado e integrado na Play Store.
  • Depois que o Google confirmar a publicação do APK atualizado na Play Store, seus clusters de recomendação, destaque, carrinho de compras, lista de compras, cluster de reordenação e cluster de rastreamento de pedidos de compra serão publicados e ficarão visíveis aos usuários.