Mostrar un paywall dirigido por AA en el primer lanzamiento con Capacitor SDK

La atribución de Apple Ads (AA) llega de forma asíncrona después de adapty.activate(). En el primer lanzamiento suele no haber llegado todavía, por lo que getFlow resuelve contra la audiencia predeterminada y los usuarios de Apple Ads se pierden el paywall segmentado por AA. En lugar de retrasar el paywall hasta que llegue la atribución, muestra uno inmediatamente y actualízalo una vez que se aplique la atribución de AA; así, los usuarios de Apple Ads ven la variante segmentada y el resto no espera. AdaptyProfile.appliedAttributionSources te indica cuándo se ha aplicado la atribución de AA.

Antes de empezar

Necesitas:

  • Adapty Capacitor SDK 3.17.1 o posterior.
  • Apple Ads configurado para la app en Adapty. Consulta Apple Ads.

Cómo funciona

Tras llamar a adapty.activate(), el SDK solicita en segundo plano los datos de atribución de Apple Ads a Apple y reenvía el resultado al backend de Adapty. Cuando AA se convierte en la fuente de atribución activa del perfil, el SDK entrega un AdaptyProfile actualizado a tu listener onLatestProfileLoad, con 'apple_search_ads' en el array appliedAttributionSources.

Esto te permite cargar el paywall en dos pasos:

  1. Llama a getFlow de inmediato. Como aún no se ha aplicado ninguna atribución, Adapty resuelve la solicitud contra la audiencia predeterminada, por lo que el usuario ve un paywall al instante.
  2. Cuando aparezca 'apple_search_ads', vuelve a llamar a getFlow. Adapty resuelve ahora la solicitud contra la audiencia de Apple Ads y devuelve el paywall segmentado, que reemplaza al primero.

appliedAttributionSources puede estar vacío o ausente. Eso significa que:

  • La atribución de Apple Ads aún no se ha procesado para este perfil, o
  • no ha llegado ninguna atribución. De cualquier manera, el paso 1 es seguro: Adapty resuelve la solicitud contra la audiencia que coincida con el estado actual del perfil, normalmente la audiencia predeterminada. El paso 2 solo se ejecuta una vez que 'apple_search_ads' aparece.

En cada lanzamiento posterior, el perfil en caché ya incluye 'apple_search_ads' en appliedAttributionSources, por lo que el primer getFlow ya devuelve el paywall segmentado por Apple Ads — no hay una segunda petición ni ningún cambio visible. El flow en dos pasos solo importa en el primer lanzamiento, mientras la atribución todavía está en proceso.

Implementación

Muestra un paywall de inmediato, luego escucha 'apple_search_ads' y actualiza el paywall cuando llegue.

  1. Activa el SDK. Consulta Instala y configura el SDK de Capacitor.
  2. Carga y muestra un paywall con getFlow como de costumbre — no bloquees la ejecución esperando la atribución.
  3. Suscríbete a las actualizaciones del perfil con adapty.addListener('onLatestProfileLoad', …) y comprueba si aparece 'apple_search_ads'. Cuando aparezca, vuelve a obtener el paywall y muestra el actualizado. Si todavía no has configurado el listener, consulta Escucha las actualizaciones de suscripción:
const listener = await adapty.addListener('onLatestProfileLoad', async ({ profile }) => {
  if (!profile.appliedAttributionSources?.includes('apple_search_ads')) return;
  const targeted = await adapty.getFlow({ placementId });
  // present the targeted flow in place of the first one
});

// Call listener.remove() after the upgrade, or after a timeout (see below).
  1. Detén la escucha tras un tiempo de espera. La mayoría de los usuarios nunca reciben atribución de Apple Ads, así que elimina el listener pasado un tiempo en lugar de mantenerlo abierto durante toda la sesión. Configura un paywall de respaldo para el placement para que el usuario siempre vea algo si falla una solicitud.

Ejemplo completo

onAppleAdsAttribution se resuelve cuando se aplica la atribución de Apple Ads, o se rechaza tras timeoutMs. El siguiente ejemplo carga un paywall de inmediato y lo vuelve a obtener cuando llega la atribución — los usuarios de Apple Ads ven el paywall personalizado y, si la atribución nunca llega, el primer paywall se mantiene:


const APPLE_ADS_SOURCE = 'apple_search_ads';
const placementId = 'YOUR_PLACEMENT_ID';

function hasAppleAdsAttribution(profile: AdaptyProfile): boolean {
  return profile.appliedAttributionSources?.includes(APPLE_ADS_SOURCE) ?? false;
}

/**
 * Resolves once Apple Ads attribution is applied to the profile.
 * Rejects with a timeout error if attribution never arrives within `timeoutMs`.
 * Call after `adapty.activate()`.
 */
export function onAppleAdsAttribution(timeoutMs: number): Promise<void> {
  return new Promise((resolve, reject) => {
    let timer: ReturnType<typeof setTimeout> | undefined;
    let handle: { remove: () => void } | undefined;

    const stop = () => {
      clearTimeout(timer);
      handle?.remove();
    };

    adapty
      .addListener('onLatestProfileLoad', ({ profile }) => {
        if (!hasAppleAdsAttribution(profile)) return;
        stop();
        resolve();
      })
      .then(listener => {
        handle = listener;
      });

    timer = setTimeout(() => {
      stop();
      reject(new Error(`Apple Ads attribution timed out after ${timeoutMs}ms`));
    }, timeoutMs);
  });
}

let flow = await adapty.getFlow({ placementId });

onAppleAdsAttribution(30_000)
  .then(() => adapty.getFlow({ placementId }))
  .then(updated => {
    flow = updated;
  })
  .catch(() => {
    console.log('Apple Ads attribution or loading failed');
  });

Al primer lanzamiento, un usuario de Apple Ads verá brevemente el paywall predeterminado antes de que se reemplace. Si presentas paywalls con el Paywall Builder, decide si volver a presentarlo es aceptable, o aplica la actualización solo antes de mostrar el paywall. Ajusta timeoutMs según el tiempo que quieras esperar — la atribución que está en camino suele llegar en pocos segundos tras el lanzamiento. Si tu app ya escucha onLatestProfileLoad para otros propósitos (por ejemplo, comprobar el estado de la suscripción), no necesitas cambiarlo. adapty.addListener admite múltiples listeners independientes, así que este añade el suyo propio sin afectar a los demás.