Redes sociales con el SDK de Engage: Instrucciones de integración técnica de terceros

Google está compilando una plataforma integrada en el dispositivo que organiza las apps de los usuarios por verticales y que permite ofrecer una nueva experiencia envolvente para el descubrimiento y el consumo de contenido personalizado en las apps. Esta experiencia de pantalla completa brinda a los socios desarrolladores la oportunidad de mostrar su mejor contenido enriquecido en un canal dedicado fuera de su app.

Este documento contiene instrucciones para que los socios desarrolladores integren su contenido social usando el SDK de Engage para propagar esta nueva área de superficie.

Información detallada sobre la integración

En la siguiente sección, se capturan los detalles de la integración.

Terminología

Los clústeres de Recommendation muestran sugerencias personalizadas de un socio desarrollador individual.

Tus recomendaciones tienen la siguiente estructura:

Clúster de Recommendation: Es una vista de la IU que contiene un grupo de recomendaciones del mismo socio desarrollador.

Cada clúster de Recommendation consta de uno de los siguientes tipos de entidades:

  • PortraitMediaEntity
  • SocialPostEntity

PortraitMediaEntity debe contener 1 imagen vertical para la publicación. Los metadatos relacionados con el perfil y la interacción son opcionales.

  • Publicación

    • Imagen vertical y marca de tiempo, o
    • Imagen vertical + contenido de texto y marca de tiempo
  • Perfil

    • Avatar, nombre o identificador, imagen adicional
  • Interacción

    • Cantidad y etiqueta únicamente, o
    • Cantidad y recursos visuales (ícono)

SocialPostEntity contiene metadatos relacionados con el perfil, la publicación y la interacción.

  • Perfil

    • Avatar, nombre o identificador, texto adicional, imagen adicional
  • Publicación

    • Texto y marca de tiempo, o
    • Rich media (imagen o URL enriquecida) y marca de tiempo, o
    • Texto y rich media (imagen o URL enriquecida), y marca de tiempo
  • Interacciones

    • Cantidad y etiqueta únicamente, o
    • Cantidad y recursos visuales (ícono)

Trabajo previo

Nivel de API mínimo: 19

Agrega la biblioteca com.google.android.play:engage a tu app:

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

Resumen

El diseño se basa en una implementación de un servicio vinculado.

Los datos que un cliente puede publicar están sujetos a los siguientes límites para diferentes tipos de clústeres:

Tipo de clúster Límites del clúster Límites mínimos de entidades en un clúster Límites máximos de entidades en un clúster
Clústeres de Recommendation 5 como máximo Al menos 5 (PortraitMediaEntity o SocialPostEntity) 25 como máximo (PortraitMediaEntity o SocialPostEntity)

Paso 1: Proporciona los datos de la entidad

El SDK definió distintas entidades para representar cada tipo de elemento. El SDK admite las siguientes entidades para la categoría Redes Sociales:

  1. PortraitMediaEntity
  2. SocialPostEntity

En los gráficos siguientes, se describen los atributos y requisitos disponibles para cada tipo.

PortraitMediaEntity

Atributo Requisito Descripción Formato
URI de acción Obligatorio

Vínculo directo a la entidad en la app del proveedor.

Nota: Puedes usar vínculos directos para la atribución. Consulta estas Preguntas frecuentes

URI
Metadatos relacionados con la publicación (obligatorio)
Imágenes Obligatorio

Las imágenes deben tener una relación de aspecto vertical.

Es posible que la IU muestre solo 1 imagen cuando se proporcionan varias. Sin embargo, la IU puede brindar una indicación visual de que hay más imágenes en la app.

Si la publicación es un video, el proveedor debe ofrecer una miniatura del video para que se muestre como una imagen.

Consulta la sección Especificaciones de imagen para obtener más información.
Contenido de texto Opcional Texto principal de una publicación, una actualización, etcétera. Cadena (se recomiendan 140 caracteres como máximo)
Marca de tiempo Opcional Hora en la que se publicó la publicación. Marca de tiempo de época en milisegundos
Metadatos relacionados con el perfil (opcional)
Nombre Obligatorio Nombre de perfil, ID o identificador (p. ej., "Juan Pérez", "@EquipoPixel") Cadena (se recomiendan 25 caracteres como máximo)
Avatar Obligatorio

Foto de perfil o avatar del usuario.

Imagen cuadrada (1:1)

Consulta la sección Especificaciones de imagen para obtener más información.
Imagen adicional Opcional

Insignia de perfil; por ejemplo: insignia de verificación.

Imagen cuadrada (1:1)

Consulta la sección Especificaciones de imagen para obtener más información.
Metadatos relacionados con interacciones (opcional)
Recuento Obligatorio Indica la cantidad de interacciones, por ejemplo, "3.7 M". Cadena (se recomiendan 20 caracteres como máximo para la cantidad y la etiqueta combinados)
Sello discográfico

Opcional

Si no se proporciona, se debe ofrecer un Recurso visual.

Indica para qué sirve la interacción (p. ej., indicaciones de "Me gusta"). Cadena (se recomiendan 20 caracteres como máximo para la cantidad y la etiqueta combinados)
Recurso visual

Opcional

Si no se proporciona, se debe ofrecer una Etiqueta.

Indica para qué sirve la interacción. Por ejemplo, una imagen que muestra un ícono de “me gusta” o emojis.

Se puede proporcionar más de 1 imagen, aunque es posible que no se muestren todas en todos los factores de forma.

Imagen cuadrada (1:1)

Consulta la sección Especificaciones de imagen para obtener más información.
DisplayTimeWindow (opcional): Establece un período para que un contenido se muestre en la superficie
Fecha y hora de inicio Opcional

Es la marca de tiempo de época a partir de la cual se debe mostrar el contenido en la superficie.

Si no la estableces, el contenido será apto para mostrarse en la superficie.

Marca de tiempo de época en milisegundos
Fecha y hora de finalización Opcional

Es la marca de tiempo de época a partir de la cual el contenido ya no se muestra en la superficie.

Si no la estableces, el contenido será apto para mostrarse en la superficie.

Marca de tiempo de época en milisegundos

SocialPostEntity

Atributo Requisito Descripción Formato
URI de acción Obligatorio

Vínculo directo a la entidad en la app del proveedor.

Nota: Puedes usar vínculos directos para la atribución. Consulta estas Preguntas frecuentes

URI

Metadatos relacionados con la publicación (obligatorio)

TextContent, Image o WebContent (se requiere, al menos, uno).

Imágenes Opcional

Las imágenes deben tener una relación de aspecto vertical.

Es posible que la IU muestre solo 1 imagen cuando se proporcionan varias. Sin embargo, la IU puede brindar una indicación visual de que hay más imágenes en la app.

Si la publicación es un video, el proveedor debe ofrecer una miniatura del video para que se muestre como una imagen.

Consulta la sección Especificaciones de imagen para obtener más información.
Contenido de texto Opcional Texto principal de una publicación, una actualización, etcétera. Cadena (se recomiendan 140 caracteres como máximo)
Vista previa del vínculo (opcional)
Vista previa del vínculo: Título Obligatorio Texto que indica el título del contenido de la página web Cadena
Vista previa del vínculo: Nombre de host Obligatorio Texto que indica el propietario de la página web (p. ej., "INSIDER") Cadena
Vista previa del vínculo: Imagen Opcional Hero image del contenido web. Consulta la sección Especificaciones de imagen para obtener más información.
Marca de tiempo Opcional Hora en la que se publicó la publicación. Marca de tiempo de época en milisegundos
Metadatos relacionados con el perfil (opcional)
Nombre Obligatorio Nombre de perfil, ID o identificador (p. ej., "Juan Pérez", "@EquipoPixel"). Cadena (se recomiendan 25 caracteres como máximo)
Texto adicional Opcional

Podría usarse como identificador o ID de perfil, o bien metadatos adicionales

Por ejemplo: "@Juan Pérez", "5 millones de seguidores", "Quizás te guste", "Tendencias", "5 publicaciones nuevas"

Cadena (se recomiendan 40 caracteres como máximo)
Avatar Obligatorio

Foto de perfil o avatar del usuario.

Imagen cuadrada (1:1)

Consulta la sección Especificaciones de imagen para obtener más información.
Imagen adicional Opcional

Insignia de perfil; por ejemplo: insignia de verificación.

Imagen cuadrada (1:1)

Consulta la sección Especificaciones de imagen para obtener más información.
Metadatos relacionados con interacciones (opcional)
Recuento Obligatorio Indica la cantidad de interacciones, por ejemplo, "3.7 M". Cadena (se recomiendan 20 caracteres como máximo para la cantidad y la etiqueta combinados)
Sello discográfico

Opcional

Si no se proporciona, se debe ofrecer un Recurso visual.

Indica para qué sirve la interacción. Por ejemplo, indicaciones de "Me gusta". Cadena (se recomiendan 20 caracteres como máximo para la cantidad y la etiqueta combinados)
Recurso visual

Opcional

Si no se proporciona, se debe ofrecer una Etiqueta.

Indica para qué sirve la interacción. Por ejemplo, una imagen que muestra un ícono de “me gusta” o emojis.

Se puede proporcionar más de 1 imagen, aunque es posible que no se muestren todas en todos los factores de forma.

Imagen cuadrada (1:1)

Consulta la sección Especificaciones de imagen para obtener más información.
DisplayTimeWindow (opcional): Establece un período para que un contenido se muestre en la superficie
Fecha y hora de inicio Opcional

Es la marca de tiempo de época a partir de la cual se debe mostrar el contenido en la superficie.

Si no la estableces, el contenido será apto para mostrarse en la superficie.

Marca de tiempo de época en milisegundos
Fecha y hora de finalización Opcional

Es la marca de tiempo de época a partir de la cual el contenido ya no se muestra en la superficie.

Si no la estableces, el contenido será apto para mostrarse en la superficie.

Marca de tiempo de época en milisegundos

Especificaciones de imagen

Las imágenes deben estar alojadas en CDN públicas para que Google pueda acceder a ellas.

Formatos de archivo

PNG, JPG, GIF estático, WebP

Tamaño máximo de los archivos

5120 KB

Recomendaciones adicionales

  • Área segura para la imagen: Coloca el contenido importante en el 80% central de la imagen.
  • Usa un fondo transparente para que la imagen se muestre correctamente cuando se configure el tema oscuro o claro.

Paso 2: Proporciona los datos de los clústeres

Se recomienda que el trabajo de publicación de contenido se ejecute en segundo plano (por ejemplo, con WorkManager) y se programe con frecuencia o en eventos (por ejemplo, cada vez que el usuario abre la app o cuando acaba de seguir una cuenta nueva).

AppEngageSocialClient es responsable de publicar clústeres de redes sociales.

Hay cinco APIs para publicar clústeres en el cliente:

  • isServiceAvailable
  • publishRecommendationClusters
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

Esta API se usa para verificar si el servicio está disponible para la integración y si el contenido se puede presentar en el 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

Esta API se usa para publicar una lista de objetos RecommendationCluster.

Un objeto RecommendationCluster puede tener los siguientes atributos:

Atributo Requisito Descripción
Lista de SocialPostEntity o PortraitMediaEntity Obligatorio Es una lista de las entidades que conforman las recomendaciones para este clúster de Recommendation. Las entidades en un solo clúster deben ser del mismo tipo.
Títulos Obligatorio

Es el título del clúster de Recommendation (por ejemplo, Novedades de tus amigos).

Tamaño de texto recomendado: Menos de 25 caracteres (el texto demasiado largo puede mostrar puntos suspensivos)

URI de acción Opcional

Es el vínculo directo a la página en la app del socio en la que los usuarios pueden ver la lista completa de recomendaciones.

Nota: Puedes usar vínculos directos para la atribución. Consulta estas Preguntas frecuentes

Kotlin


client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Latest from your friends")
                        .build())
                .build())

Java


client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Latest from your friends")
                        .build())
                .build());

Cuando el servicio recibe la solicitud, se realizan las siguientes acciones en una transacción:

  • Se quitan todos los datos existentes del clúster de Recommendation.
  • Los datos de la solicitud se analizan y se almacenan en clústeres de Recomendación nuevos.

En caso de error, se rechaza la solicitud completa y se mantiene el estado existente.

publishUserAccountManagementRequest

Esta API se usa para publicar una tarjeta de acceso. La acción de acceso dirige a los usuarios a la página de acceso de la app para que esta pueda publicar contenido (o proporcionar contenido más personalizado).

Los siguientes metadatos forman parte de la tarjeta de acceso:

Atributo Requisito Descripción
URI de acción Obligatorio Vínculo directo a la acción (p. ej., navega a la página de acceso de la app)
Imagen Opcional: En caso de que no se proporcione el título, debes brindar uno.

Imagen que se muestra en la tarjeta

Imágenes con una relación de aspecto de 16 × 9, con una resolución de 1264 × 712

Títulos Opcional: En caso de que no se proporcione la imagen, debes brindar una. Título en la tarjeta
Texto de acción Opcional Texto que se muestra en la CTA (p. ej., Acceder)
Subtítulo Opcional Subtítulo opcional en la tarjeta

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

Cuando el servicio recibe la solicitud, se realizan las siguientes acciones en una transacción:

  • Se quitan los datos existentes de UserAccountManagementCluster del socio desarrollador.
  • Los datos de la solicitud se analizan y se almacenan en el clúster de UserAccountManagementCluster actualizado.

En caso de error, se rechaza la solicitud completa y se mantiene el estado existente.

updatePublishStatus

Si, por algún motivo empresarial interno, no se publica ninguno de los clústeres, te recomendamos que actualices el estado de publicación a través de la API de updatePublishStatus. A continuación, explicamos por qué es importante:

  • Proporcionar el estado en todas las situaciones, incluso cuando el contenido está publicado (STATUS == PUBLISHED), es fundamental para propagar los paneles que usan este estado explícito para transmitir el estado y otras métricas de tu integración.
  • Si no se publica contenido pero el estado de integración no está roto (STATUS == NOT_PUBLISHED), Google puede evitar activar alertas en los paneles de estado de la app. Confirma que el contenido no se publicó debido a una situación prevista desde el punto de vista del proveedor.
  • Ayuda a los desarrolladores a proporcionar estadísticas sobre cuándo se publican los datos y cuándo no.
  • Google puede usar los códigos de estado para sugerir al usuario que realice determinadas acciones en la app de modo que pueda ver el contenido de la app o superarlo.

La lista de códigos de estado de publicación aptos es la siguiente:

// 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

Si el contenido no se publica debido a que un usuario no accedió, te recomendamos que publiques la tarjeta de acceso. Si, por algún motivo, los proveedores no pueden publicar la tarjeta de acceso, recomendamos que llames a la API de updatePublishStatus con el código de estado 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

Esta API se usa para borrar el contenido de los clústeres de Recommendation.

Kotlin


client.deleteRecommendationClusters()

Java


client.deleteRecommendationClusters();

Cuando el servicio recibe la solicitud, quita los datos existentes de los clústeres de Recommendation. En caso de error, se rechaza la solicitud completa y se mantiene el estado existente.

deleteUserManagementCluster

Esta API se usa para borrar el contenido del clúster de UserAccountManagement.

Kotlin


client.deleteUserManagementCluster()

Java


client.deleteUserManagementCluster();

Cuando el servicio recibe la solicitud, quita los datos existentes del clúster de UserAccountManagement. En caso de error, se rechaza la solicitud completa y se mantiene el estado existente.

deleteClusters

Esta API se usa para borrar el contenido de un tipo de clúster determinado.

Kotlin


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

Java


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

Cuando el servicio recibe la solicitud, quita los datos existentes de todos los clústeres que coincidan con los tipos de clúster especificados. Los clientes pueden optar por pasar uno o varios tipos de clústeres. En caso de error, se rechaza la solicitud completa y se mantiene el estado existente.

Manejo de errores

Te recomendamos que escuches el resultado de la tarea de las APIs de publicación, de manera que se pueda realizar una acción de seguimiento para recuperar y volver a enviar una tarea con éxito.

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
                    }
                  }
                }
              });

El error se muestra como una AppEngageException con la causa incluida como un código de error.

Código de error Nota
SERVICE_NOT_FOUND El servicio no está disponible en el dispositivo determinado.
SERVICE_NOT_AVAILABLE El servicio está disponible en el dispositivo determinado, pero no en el momento de la llamada (por ejemplo, está inhabilitado explícitamente).
SERVICE_CALL_EXECUTION_FAILURE No se pudo ejecutar la tarea debido a problemas con los subprocesos. En este caso, se puede volver a intentar.
SERVICE_CALL_PERMISSION_DENIED El llamador no tiene permiso para realizar la llamada de servicio.
SERVICE_CALL_INVALID_ARGUMENT La solicitud contiene datos no válidos (por ejemplo, una cantidad de clústeres mayor que la permitida).
SERVICE_CALL_INTERNAL Hay un error en el servicio.
SERVICE_CALL_RESOURCE_EXHAUSTED La llamada de servicio se realiza con demasiada frecuencia.

Paso 3: Controla los intents de transmisión

Además de realizar llamadas a las APIs de publicación de contenido a través de un trabajo, también se requiere configurar un BroadcastReceiver para recibir la solicitud de publicación de contenido.

El objetivo de los intents de transmisión es principalmente reactivar apps y forzar la sincronización de datos. Los intents de transmisión no están diseñados para enviarse con mucha frecuencia. Solo se activan cuando el servicio de Engage determina que el contenido puede estar inactivo (por ejemplo, si es de hace una semana). De esa manera, será más probable que el usuario tenga una experiencia de contenido actualizada, incluso si la aplicación no se ejecutó durante un período prolongado.

El BroadcastReceiver debe configurarse de las siguientes dos maneras:

  • Registra de forma dinámica una instancia de la clase BroadcastReceiver con Context.registerReceiver(). Esto permite la comunicación desde aplicaciones que aún están activas en la memoria.
class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION 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));

}

  • Declara de forma estática una implementación con la etiqueta <receiver> en tu archivo AndroidManifest.xml. Esto permite que la aplicación reciba intents de transmisión cuando no está en ejecución y que la aplicación publique el contenido.
<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>
   </receiver>
</application>

El servicio enviará los siguientes intents:

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION Te recomendamos que inicies una llamada a publishRecommendationClusters cuando recibas este intent.

Flujo de trabajo de integración

Si deseas obtener una guía paso a paso para verificar la integración una vez que esta se complete, consulta Flujo de trabajo de integración para desarrolladores de Engage.

Preguntas frecuentes

Consulta Preguntas frecuentes sobre el SDK de Engage para ver preguntas frecuentes.

Contacto

Comunícate con engage-developers@google.com si tienes preguntas durante el proceso de integración. Nuestro equipo te responderá lo antes posible.

Próximos pasos

Después de completar esta integración, sigue estos pasos:

  • Envía un correo electrónico a engage-developers@google.com y adjunta el APK integrado que está listo para que Google lo pruebe.
  • Google realiza una verificación y revisiones internas para asegurarse de que la integración funcione según lo previsto. Si se necesitan cambios, Google se comunica contigo con los detalles necesarios.
  • Cuando se completen las pruebas y no se necesiten cambios, Google se comunicará contigo para notificarte que puedes comenzar a publicar el APK integrado y actualizado en Play Store.
  • Después de que Google confirme que el APK actualizado se publicó en Play Store, tus clústeres de Recommendation se publicarán y serán visibles para los usuarios.