Mostrar un paywall dirigido por AA en el primer lanzamiento con React Native SDK
La atribución de Apple Ads (AA) llega de forma asíncrona después de adapty.activate(). En el primer arranque normalmente aún no ha llegado, por lo que getPaywall resuelve contra la audiencia predeterminada y los usuarios de Apple Ads no ven el paywall segmentado por AA. En lugar de retrasar el paywall hasta que llegue la atribución, muestra uno inmediatamente y refrésalo una vez que se aplique la atribución de AA — así los usuarios de Apple Ads reciben la variante segmentada y los demás ven un paywall sin espera. AdaptyProfile.appliedAttributionSources te indica cuándo se ha aplicado la atribución de AA.
Antes de empezar
Necesitas:
- Adapty React Native 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 la 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 su array appliedAttributionSources.
Esto te permite cargar el paywall en dos pasos:
- Llama a
getPaywallde inmediato. Como todavía no hay atribución aplicada, Adapty resuelve la solicitud contra la audiencia predeterminada, por lo que el usuario ve un paywall enseguida. - Cuando aparezca
'apple_search_ads', llama agetPaywallde nuevo. Adapty ahora resuelve 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.
En cualquier caso, el paso 1 es seguro — Adapty resuelve la solicitud según 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 getPaywall ya devuelve el paywall segmentado por Apple Ads — no hay una segunda llamada ni ningún cambio visible. El flujo de dos pasos solo importa en el primer lanzamiento, mientras la atribución aún está en curso.
Implementación
Muestra el paywall de inmediato y luego escucha el evento 'apple_search_ads' para actualizar el paywall cuando llegue.
- Activa el SDK. Consulta Instala y configura el SDK de React Native.
- Carga y muestra un paywall con
getPaywallcomo de costumbre — no bloquees la ejecución esperando la atribución. - Suscríbete a las actualizaciones del perfil con
adapty.addEventListener('onLatestProfileLoad', …)y espera'apple_search_ads'. Cuando aparezca, vuelve a cargar el paywall y muestra el actualizado. Si aún no has configurado el listener, consulta Escucha las actualizaciones de suscripción:
const subscription = adapty.addEventListener('onLatestProfileLoad', async profile => {
if (!profile.appliedAttributionSources?.includes('apple_search_ads')) return;
const targeted = await adapty.getPaywall(placementId);
// present the targeted paywall in place of the first one
});
// Call subscription.remove() after the upgrade, or after a timeout (see below).
- 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 después de un tiempo en lugar de mantenerlo abierto toda la sesión. Configura un paywall de respaldo para el placement para que el usuario siempre vea algo si una solicitud falla.
Ejemplo completo
onAppleAdsAttribution se resuelve una vez que 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 reciben el paywall personalizado y, si la atribución nunca llega, el primer paywall permanece activo:
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 subscription: { remove: () => void } | undefined;
const stop = () => {
clearTimeout(timer);
subscription?.remove();
};
subscription = adapty.addEventListener('onLatestProfileLoad', profile => {
if (!hasAppleAdsAttribution(profile)) return;
stop();
resolve();
});
timer = setTimeout(() => {
stop();
reject(new Error(`Apple Ads attribution timed out after ${timeoutMs}ms`));
}, timeoutMs);
});
}
let paywall = await adapty.getPaywall(placementId);
onAppleAdsAttribution(30_000)
.then(() => adapty.getPaywall(placementId))
.then(updated => {
paywall = updated;
})
.catch(() => {
console.log('Apple Ads attribution or loading failed');
});
Al primer lanzamiento, un usuario de Apple Ads ve brevemente el paywall predeterminado antes de que sea reemplazado. 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 cuánto tiempo estés dispuesto a esperar — la atribución que está en camino suele llegar a los pocos segundos del lanzamiento.
Si tu app ya escucha onLatestProfileLoad para otros fines (por ejemplo, comprobar el estado de la suscripción), no necesitas cambiarlo. adapty.addEventListener admite múltiples listeners independientes, así que este añade el suyo sin afectar a los demás.