Obtener flows y paywalls - Android

Lo que devuelve getFlow
✦
Flows Creados en el Flow & Paywall Builder — se renderizan de forma nativa en el dispositivo, sin WebView
✦
Paywalls del antiguo Paywall Builder Todo el contenido creado en el antiguo Paywall Builder

Después de diseñar tu flow, puedes mostrarlo en tu aplicación móvil. El primer paso es obtener el flow o paywall asociado al placement y su configuración de vista, tal como se describe a continuación.

Tip

¿Quieres ver un ejemplo real de cómo se integra el SDK de Adapty en una app móvil? Echa un vistazo a nuestras apps de ejemplo, que muestran la configuración completa, incluyendo la visualización de paywalls, la realización de compras y otras funcionalidades básicas.

Antes de empezar

Necesitas:

Obtener un flow/paywall

Si has diseñado un flow o paywall en el builder, no tienes que preocuparte por renderizarlo en el código de tu app para mostrárselo al usuario. Un flow o paywall así contiene tanto lo que debe mostrarse como la forma en que debe hacerlo. Aun así, necesitas obtener su ID a través del placement, su configuración de vista y, después, presentarlo en tu app.

Para garantizar un rendimiento óptimo, es fundamental obtener el flow o paywall y su configuración de vista lo antes posible, dejando tiempo suficiente para que las imágenes se descarguen antes de mostrárselas al usuario.

Tip

Para precalentar varios placements a la vez, llama a preloadFlows (Android SDK 4.1+). Solo almacena en caché el JSON del placement, por lo que igualmente debes obtener la configuración de vista para cargar el diseño y las imágenes.

Para obtener un flow o paywall, usa el método getFlow:

(no translatable prose — no output needed)

ParámetroPresenciaDescripción
placementIdobligatorioEl identificador del Placement deseado. Es el valor que especificaste al crear un placement en el Adapty Dashboard.
fetchPolicypor defecto: AdaptyPlacementFetchPolicy.Default

fetchPolicy define qué capa lee primero el SDK, no si puede usar la caché. Por defecto, el SDK va primero al servidor y devuelve los datos en caché si esa solicitud falla. Recomendamos esta opción porque garantiza que los usuarios siempre reciban los datos más actualizados.

Sin embargo, si crees que tus usuarios tienen una conexión a internet inestable, considera AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad, que invierte ese orden: lee primero la caché y va al servidor solo cuando no hay nada en caché. Es posible que los usuarios no obtengan los datos más recientes, pero experimentarán tiempos de carga más rápidos, independientemente de lo inestable que sea su conexión. La caché se actualiza con regularidad, por lo que es seguro usarla durante la sesión para evitar solicitudes de red.

Una tercera política, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), se sitúa entre las dos: lee primero la caché mientras la copia en caché es más reciente que maxAgeMillis, y va al servidor una vez que es más antigua.

Ten en cuenta que la caché permanece intacta al reiniciar la aplicación y solo se borra cuando se reinstala la app o mediante una limpieza manual.

El SDK de Adapty almacena flows y paywalls localmente en dos capas: la caché de actualización periódica descrita anteriormente y los paywalls de respaldo. También usamos CDN para obtenerlos más rápido y un servidor de respaldo independiente en caso de que el CDN no esté disponible. Este sistema está diseñado para garantizar que siempre obtengas la versión más reciente, asegurando la fiabilidad incluso cuando la conexión a internet es escasa.

loadTimeoutpor defecto: 5 seg

Este valor limita el tiempo de espera para este método. Si se alcanza el timeout, se devolverán los datos en caché o el fallback local.

Ten en cuenta que, en casos excepcionales, este método puede superar ligeramente el timeout especificado en loadTimeout, ya que la operación puede estar compuesta por distintas solicitudes internamente.

Para Android: puedes crear TimeInterval con funciones de extensión (como 5.seconds, donde .seconds proviene de import com.adapty.utils.seconds), o TimeInterval.seconds(5). Para no establecer ningún límite, usa TimeInterval.INFINITE.

Parámetros de respuesta:

ParámetroDescripción
FlowUn objeto AdaptyFlow que contiene el placement, los identificadores (id, variationId), el nombre de la variante (variationName, opcional, SDK 4.2+), el nombre, sus variantes de paywall (paywalls), los Remote Configs y un flag hasViewConfiguration que indica si el flow incluye una configuración de vista. Para obtener los productos reales para precarga, UI personalizada o comprobaciones programáticas, llama a getPaywallProducts(flow).

Obtener la configuración de vista

Tras obtener el flow o el paywall, comprueba si incluye una configuración de vista mediante flow.hasViewConfiguration. Este indicador distingue cómo se diseñó el placement en el Adapty Dashboard:

  • true — el placement fue diseñado en el Flow & Paywall Builder (un flow) o en el old Paywall Builder (un paywall). Adapty renderiza la UI por ti. Continúa con los pasos siguientes para obtener la configuración de vista y presentar el flow o el paywall.
  • false — el placement es un paywall personalizado sin UI del Builder. Gestiónalo como un paywall de Remote Config.
Important

Asegúrate de publicar el flow. Un flow con ediciones sin publicar tiene el estado Dirty, y su placement seguirá sirviendo la última versión publicada.

Note

Si usas varios idiomas, aprende cómo añadir una localización en el Builder y cómo usar los códigos de idioma correctamente aquí.

Una vez cargado, presenta el flow o el paywall.

Obtén un flow o paywall para la audiencia predeterminada y cárgalo más rápido

Normalmente, los flows y paywalls se cargan casi de forma instantánea, por lo que no necesitas preocuparte por acelerar este proceso. Sin embargo, si tienes muchas audiencias y placements, y tus usuarios tienen una conexión a internet lenta, puede que la carga tarde más de lo deseado. En esas situaciones, puede que quieras mostrar un flow o paywall predeterminado para garantizar una experiencia fluida en lugar de no mostrar nada.

Para solucionar esto, puedes usar el método getFlowForDefaultAudience, que obtiene el flow o paywall del placement indicado para la audiencia All Users. Sin embargo, es importante entender que el enfoque recomendado es obtener el flow o paywall mediante el método getFlow, tal como se describe en la sección Obtener flow/paywall anterior.

Warning

Por qué recomendamos usar getFlow

El método getFlowForDefaultAudience tiene algunos inconvenientes importantes:

  • Posibles problemas de compatibilidad hacia atrás: Si necesitas mostrar flows diferentes para distintas versiones de la app (la actual y las futuras), es posible que te encuentres con dificultades. Tendrás que diseñar flows que sean compatibles con la versión actual (legacy) o asumir que los usuarios con esa versión pueden tener problemas con flows que no se renderizan.
  • Pérdida de targeting: Todos los usuarios verán el mismo flow diseñado para la audiencia All Users, lo que significa que pierdes la personalización del targeting (incluyendo segmentación por país, atribución de marketing o atributos personalizados propios).

Si estás dispuesto a aceptar estos inconvenientes a cambio de una obtención más rápida del flow o el paywall, usa el método getFlowForDefaultAudience como se indica a continuación. De lo contrario, sigue usando getFlow descrito arriba.

ParámetroPresenciaDescripción
placementIdrequeridoEl identificador del Placement. Es el valor que especificaste al crear un placement en tu Adapty Dashboard.
fetchPolicypor defecto: AdaptyPlacementFetchPolicy.Default

fetchPolicy define qué capa lee primero el SDK, no si puede usar la caché. Por defecto, el SDK consulta primero el servidor y devuelve los datos en caché si esa solicitud falla. Recomendamos esta opción porque garantiza que tus usuarios siempre reciban los datos más actualizados.

Sin embargo, si crees que tus usuarios tienen una conexión inestable, considera AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad, que invierte ese orden: lee primero la caché y solo consulta el servidor cuando no hay nada almacenado. Es posible que los usuarios no obtengan los datos más recientes, pero la carga será más rápida independientemente de la calidad de su conexión. La caché se actualiza con regularidad, por lo que es seguro utilizarla durante la sesión para evitar solicitudes de red.

Una tercera política, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), se sitúa entre las dos: lee primero la caché mientras la copia almacenada tiene menos de maxAgeMillis, y consulta el servidor cuando es más antigua.

Ten en cuenta que la caché se mantiene al reiniciar la app y solo se borra cuando se desinstala la app o se realiza una limpieza manual.

Personalizar recursos

Para personalizar imágenes y vídeos en tu flow o paywall, implementa los recursos personalizados.

Las imágenes y vídeos hero tienen IDs predefinidos: hero_image y hero_video. En un bundle de recursos personalizados, apuntas a estos elementos por sus IDs y personalizas su comportamiento.

Para otras imágenes y vídeos, necesitas establecer un ID personalizado en el Adapty dashboard.

Por ejemplo, puedes:

  • Mostrar una imagen o vídeo diferente a algunos usuarios.
  • Mostrar una imagen de vista previa local mientras se carga la imagen principal remota.
  • Mostrar una imagen de vista previa antes de reproducir un vídeo.
  • Mostrar contenido multimedia incluido en la app, para que la primera pantalla se renderice sin necesidad de descarga. Consulta Mostrar el contenido multimedia de la primera pantalla desde el paquete de la app.

A continuación tienes un ejemplo de cómo proporcionar assets personalizados mediante un diccionario sencillo:

val customAssets = AdaptyCustomAssets.of(
    "hero_image" to
            AdaptyCustomImageAsset.remote(
                url = "https://example.com/image.jpg",
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromAsset("images/hero_image_preview.png"),
                )
            ),
    "hero_video" to
            AdaptyCustomVideoAsset.file(
                FileLocation.fromResId(requireContext(), R.raw.custom_video),
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromResId(requireContext(), R.drawable.video_preview),
                ),
            ),
)

val flowView = AdaptyUI.getFlowView(
    activity,
    flowConfiguration,
    products,
    eventListener,
    insets,
    customAssets,
)
Note

Si no se encuentra un asset, el flow utilizará su apariencia predeterminada.

Para vídeos, puedes pasar opcionalmente una resolution para reservar espacio en el layout y establecer la relación de aspecto (width / height) antes de que el vídeo cargue:

AdaptyCustomVideoAsset.file(
    FileLocation.fromResId(requireContext(), R.raw.custom_video),
    preview = AdaptyCustomImageAsset.file(
        FileLocation.fromResId(requireContext(), R.drawable.video_preview),
    ),
    resolution = AdaptyCustomVideoAsset.Resolution(width = 1080, height = 1920),
)

Después de diseñar la parte visual de tu paywall con el antiguo Paywall Builder en el Adapty Dashboard, puedes mostrarlo en tu aplicación móvil. El primer paso es obtener el paywall asociado al placement y su configuración de vista, como se describe a continuación.

Warning

Los paywalls creados con el Paywall Builder de SDK 3.x requieren la versión 3.0 o superior del SDK de Android.

Por favor, ten en cuenta que este tema hace referencia a paywalls personalizados con Paywall Builder. Si estás implementando tus paywalls manualmente, consulta el tema Obtener paywalls y productos para paywalls con Remote Config en tu app móvil.

Tip

¿Quieres ver un ejemplo real de cómo se integra el SDK de Adapty en una app móvil? Echa un vistazo a nuestras apps de ejemplo, que muestran la configuración completa, incluyendo la visualización de paywalls, la realización de compras y otras funcionalidades básicas.

Antes de empezar a mostrar paywalls en tu app móvil (haz clic para expandir)
  1. Crea tus productos en el Adapty Dashboard.
  2. Crea un paywall e incorpora los productos en él en el Adapty Dashboard.
  3. Crea placements e incorpora tu paywall en ellos en el Adapty Dashboard.
  4. Instala el SDK de Adapty en tu aplicación móvil.

Obtener un paywall diseñado con Paywall Builder

Si has diseñado un paywall con el Paywall Builder, no necesitas preocuparte por renderizarlo en el código de tu app para mostrárselo al usuario. Este tipo de paywall incluye tanto qué mostrar como cómo mostrarlo. Aun así, necesitas obtener su ID a través del placement, su configuración de vista y, después, presentarlo en tu app.

Para garantizar un rendimiento óptimo, es fundamental obtener el paywall y su configuración de vista lo antes posible, dejando tiempo suficiente para que las imágenes se descarguen antes de mostrárselas al usuario.

Para obtener un paywall, usa el método getPaywall:

Parámetros:

ParámetroPresenciaDescripción
placementIdobligatorioEl identificador del Placement deseado. Es el valor que especificaste al crear un placement en el Adapty Dashboard.
locale

opcional

predeterminado: en

El identificador de la localización del paywall. Se espera que este parámetro sea un código de idioma compuesto por uno o dos subetiquetas separadas por el carácter menos (-). La primera subetiqueta corresponde al idioma y la segunda a la región.

Ejemplo: en significa inglés, pt-br representa el portugués de Brasil.

Consulta Localizaciones y códigos de idioma para más información sobre los códigos de idioma y cómo recomendamos usarlos.

fetchPolicypredeterminado: AdaptyPlacementFetchPolicy.Default

fetchPolicy define qué capa lee primero el SDK, no si puede usar la caché. Por defecto, el SDK va primero al servidor y devuelve los datos en caché si esa solicitud falla. Recomendamos esta opción porque garantiza que tus usuarios siempre reciban los datos más actualizados.

Sin embargo, si crees que tus usuarios tienen conexión inestable, considera AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad, que invierte ese orden: lee primero la caché y va al servidor solo cuando no hay nada en caché. Es posible que los usuarios no obtengan los datos más recientes, pero experimentarán tiempos de carga más rápidos, independientemente de lo inestable que sea su conexión. La caché se actualiza con regularidad, por lo que es seguro usarla durante la sesión para evitar peticiones de red.

Una tercera política, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), se sitúa entre ambas: lee primero la caché mientras la copia en caché sea más reciente que maxAgeMillis, y va al servidor cuando es más antigua.

Ten en cuenta que la caché permanece intacta al reiniciar la app y solo se borra cuando se desinstala la app o mediante una limpieza manual.

El SDK de Adapty almacena los paywalls localmente en dos capas: la caché de actualización regular descrita anteriormente y los paywalls de respaldo. También utilizamos CDN para obtener los paywalls más rápido y un servidor de respaldo independiente en caso de que el CDN no sea accesible. Este sistema está diseñado para garantizar que siempre obtengas la versión más reciente de tus paywalls, asegurando la fiabilidad incluso cuando la conexión a internet es escasa.

loadTimeoutpredeterminado: 5 seg

Este valor limita el tiempo de espera de este método. Si se alcanza el timeout, se devolverán los datos en caché o el fallback local.

Ten en cuenta que en casos excepcionales este método puede superar ligeramente el tiempo especificado en loadTimeout, ya que la operación puede estar compuesta por diferentes solicitudes internamente.

Para Android: Puedes crear TimeInterval con funciones de extensión (como 5.seconds, donde .seconds proviene de import com.adapty.utils.seconds), o TimeInterval.seconds(5). Para no establecer ningún límite, usa TimeInterval.INFINITE.

Parámetros de respuesta:

ParámetroDescripción
PaywallUn objeto AdaptyPaywall con una lista de IDs de producto, el identificador del paywall, Remote Config y varias otras propiedades.

Obtener la configuración de vista de un paywall diseñado con Paywall Builder

Important

Asegúrate de activar el interruptor Show on device en el Paywall Builder. Si esta opción no está activada, la configuración de vista no estará disponible para recuperar.

Tras obtener el paywall, comprueba si incluye un ViewConfiguration, lo que indica que fue creado con Paywall Builder. Esto te guiará sobre cómo mostrar el paywall. Si el ViewConfiguration está presente, trátalo como un paywall de Paywall Builder; si no, trátalo como un paywall de Remote Config.

Note

Si admites varios idiomas, añade una localización a tu paywall. Para consultar los códigos que debes usar, visita Localizaciones y códigos de idioma.

Una vez cargado, muestra el paywall.

Obtén un paywall para la audiencia predeterminada y acelera la carga

Normalmente, los paywalls se obtienen casi al instante, por lo que no necesitas preocuparte por acelerar este proceso. Sin embargo, cuando tienes muchas audiencias y paywalls, y tus usuarios tienen una conexión a internet débil, la carga puede tardar más de lo deseado. En esos casos, puede que quieras mostrar un paywall predeterminado para garantizar una buena experiencia de usuario en lugar de no mostrar ninguno.

Para resolver esto, puedes usar el método getPaywallForDefaultAudience, que obtiene el paywall del placement indicado para la audiencia All Users. Sin embargo, es fundamental entender que el enfoque recomendado es obtener el paywall con el método getPaywall, tal como se describe en la sección Obtener información del paywall anterior.

Warning

Por qué recomendamos usar getPaywall

El método getPaywallForDefaultAudience tiene algunos inconvenientes importantes:

  • Posibles problemas de compatibilidad con versiones anteriores: Si necesitas mostrar diferentes paywalls para distintas versiones de la app (actual y futuras), podrías enfrentarte a dificultades. Tendrás que diseñar paywalls que sean compatibles con la versión actual (legacy) o aceptar que los usuarios con esa versión puedan encontrarse con paywalls que no se renderizan correctamente.
  • Pérdida de segmentación: Todos los usuarios verán el mismo paywall diseñado para la audiencia All Users, lo que significa que pierdes la segmentación personalizada (incluyendo la basada en países, atribución de marketing o tus propios atributos personalizados).

Si estás dispuesto a aceptar estas desventajas para beneficiarte de una obtención más rápida del paywall, usa el método getPaywallForDefaultAudience de la siguiente manera. De lo contrario, utiliza getPaywall descrito anteriormente.

Note

El método getPaywallForDefaultAudience está disponible a partir del Android SDK 2.11.3

ParámetroPresenciaDescripción
placementIdobligatorioEl identificador del Placement. Es el valor que especificaste al crear un placement en tu Adapty Dashboard.
locale

opcional

por defecto: en

El identificador de la localización del paywall. Se espera que este parámetro sea un código de idioma compuesto por una o más subetiquetas separadas por el carácter menos (-). La primera subetiqueta corresponde al idioma y la segunda a la región.

Ejemplo: en significa inglés, pt-br representa el portugués de Brasil.

Consulta Localizaciones y códigos de idioma para más información sobre los códigos de idioma y cómo recomendamos usarlos.

fetchPolicypor defecto: AdaptyPlacementFetchPolicy.Default

fetchPolicy determina qué capa lee el SDK primero, no si puede usar la caché. Por defecto, el SDK consulta primero el servidor y devuelve los datos en caché si esa solicitud falla. Recomendamos esta opción porque garantiza que tus usuarios siempre reciban los datos más actualizados.

Sin embargo, si crees que tus usuarios tienen una conexión a internet inestable, considera AdaptyPlacementFetchPolicy.ReturnCacheDataElseLoad, que invierte ese orden: lee primero la caché y solo consulta el servidor cuando no hay nada en caché. Es posible que los usuarios no reciban los datos más recientes, pero experimentarán tiempos de carga más rápidos sin importar lo irregular que sea su conexión. La caché se actualiza con regularidad, por lo que es seguro usarla durante la sesión para evitar solicitudes de red.

Una tercera política, AdaptyPlacementFetchPolicy.ReturnCacheDataIfNotExpiredElseLoad(maxAgeMillis), se sitúa entre las dos: lee primero la caché mientras la copia almacenada sea más reciente que maxAgeMillis, y consulta el servidor una vez que sea más antigua.

Ten en cuenta que la caché se mantiene intacta al reiniciar la aplicación y solo se borra cuando se reinstala la app o mediante una limpieza manual.

Personaliza los recursos

Para personalizar imágenes y vídeos en tu paywall, implementa los recursos personalizados.

Las imágenes y vídeos hero tienen IDs predefinidos: hero_image y hero_video. En un bundle de recursos personalizados, apuntas a estos elementos por sus IDs y personalizas su comportamiento.

Para otras imágenes y vídeos, necesitas establecer un ID personalizado en el Adapty Dashboard.

Por ejemplo, puedes:

  • Mostrar una imagen o vídeo diferente a algunos usuarios.
  • Mostrar una imagen de vista previa local mientras se carga una imagen principal remota.
  • Mostrar una imagen de vista previa antes de reproducir un vídeo.
Important

Para usar esta función, actualiza el SDK de Adapty para Android a la versión 3.7.0 o superior.

Aquí tienes un ejemplo de cómo proporcionar assets personalizados mediante un diccionario simple:

val customAssets = AdaptyCustomAssets.of(
    "hero_image" to
            AdaptyCustomImageAsset.remote(
                url = "https://example.com/image.jpg",
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromAsset("images/hero_image_preview.png"),
                )
            ),
    "hero_video" to
            AdaptyCustomVideoAsset.file(
                FileLocation.fromResId(requireContext(), R.raw.custom_video),
                preview = AdaptyCustomImageAsset.file(
                    FileLocation.fromResId(requireContext(), R.drawable.video_preview),
                ),
            ),
)

val paywallView = AdaptyUI.getPaywallView(
    activity,
    viewConfiguration,
    products,
    eventListener,
    insets,
    customAssets,
)
Note

Si no se encuentra un recurso, el paywall usará su apariencia predeterminada.