Apps Kit SDK logoApps Kit SDK
Documentación · AppsKitSDK (AKS) — Guía de integración para Android

6. Cómo invocar los formatos de anuncios

Cada llamada de anuncio recibe un placeholder: una clave de cadena configurada para un formato de anuncio en el portal de AKS (p. ej., "1"). En tiempo de ejecución, AKS resuelve el placeholder en una red publicitaria principal y una lista de redes alternativas; nunca haces referencia directamente a un ID de unidad de anuncio en el código.

Intersticial

kotlin
// Load only
AdsManager.loadInterstitial(context, placeholder, object : AdsCallback() {
    override fun onLoaded() { }
    override fun onFailedToLoad() { }
    override fun onAdShown() { }
    override fun onAdDismissed() { }
    override fun onAdFailedToShow() { }
})

// Show a previously loaded interstitial
AdsManager.showInterstitial(activity, placeholder, callback)

// Load and show in one call
AdsManager.loadAndShowInterstitialAd(activity, placeholder, callback)

// Check availability before showing
AdsManager.isInterstitialAvailable(placeholder)

Bonificado

kotlin
AdsManager.loadRewarded(context, placeholder, object : RewardedAdCallbacks() {
    override fun onRewardedLoaded() { }
    override fun onRewardedAdLoadFailure() { }
    override fun onRewardedCompleted() { }
    override fun onAdRewarded() { }
    override fun onAdRewardedAdDismissed() { }
    override fun onRewardedFailedToShow() { }
})

AdsManager.showRewarded(activity, placeholder, callbacks)

// Load and show in one call — simpler success/fail callback
AdsManager.loadAndShowRewardedAd(activity, placeholder, object : RewardedLoadAndShowCallback {
    override fun onRewardedAdSuccess() { }
    override fun onRewardedAdFailed() { }
})

AdsManager.isRewardedAvailable(placeholder)

Apertura de la aplicación (App Open)

kotlin
AdsManager.loadAppOpen(application, placeholder, object : AppOpenAdCallbacks() {
    override fun onLoaded() { }
    override fun onFailedToLoad() { }
    override fun onDismiss() { }
    override fun onAdShown() { }
    override fun onAdFailToShow() { }
})

AdsManager.showAppOpen(activity, placeholder, callbacks)

Si prefieres que AKS gestione la pantalla de inicio y los anuncios de apertura de la aplicación (según el indicador de configuración remota isAppOpenAtApplicationLvl), en lugar de gestionar App Open por tu cuenta, usa loadDefaultAppOpen / showDefaultAppOpen en tu subclase de AppsKitSDKApplication, o simplemente llama a requestSplashAppOpenAd(callbacks, addInDefaultDelay), que la clase base Application ya implementa de principio a fin.

kotlin
AdsManager.loadBanner(context, placeholder, object : BannerCallback() {
    override fun onBannerLoaded() { }
    override fun onBannerFailedToLoad() { }
    override fun onBannerClicked() { }
    override fun onBannerShown() { }
    override fun onBannerSizeChanged(bannerSizes: BannerSizes) { }
    override fun setBannerSize(width: Double, height: Double) { }
})

// layout is a FrameLayout (BannerContainer) you've placed in your screen
AdsManager.showBanner(activity, layout, placeholder, callback)

BannerSizes: BANNER (320×50), LARGE_BANNER (320×100), MEDIUM_RECTANGLE (300×250), FULL_BANNER (468×60).

Nativo

kotlin
AdsManager.loadNative(activity, placeholder, isShowInScrollView = false, object : NativeCallback() {
    override fun onNativeLoaded() { }
    override fun onNativeFailedToLoad() { }
    override fun onNativeClicked() { }
    override fun onNativeShown() { }
})

// frameLayout is the BannerContainer that will host the native ad view; res is an
// optional custom native-ad layout resource (pass null to use AKS's default layout)
AdsManager.showNative(activity, frameLayout, placeholder, isShowInScrollView = false, res = null, callback)

// Show the native ad using the design you created for this placeholder in the
// AKS portal, instead of a layout resource — see below.
AdsManager.showTemplatedNative(activity, frameLayout, placeholder, isShowInScrollView = false, callback)

showTemplatedNative está pensado para placeholders cuyo diseño de anuncio nativo se ha creado y asignado en el portal de AKS, en lugar de hacerlo en el código de tu aplicación. No tiene parámetro res, porque no debes proporcionar el layout. AKS determina qué plantilla del portal corresponde a este placeholder, la descarga (se almacena en caché tras la primera descarga) y renderiza el anuncio nativo con ella mediante el mismo flujo de carga y visualización que usa showNative. Si el placeholder no tiene una plantilla asignada o no se puede descargar, AKS utiliza su diseño nativo predeterminado integrado en lugar de provocar un fallo del anuncio. Por tanto, siempre puedes llamar a este método con seguridad, incluso antes de configurar una plantilla en el portal.

Promoción de funciones (Feature Promotion)

Feature Promotion es el formato de anuncios propios de AKS para promocionar una función de tu aplicación entre los usuarios que aún no la han desbloqueado. Solo se sirve a través de la red AKS (no de AdMob/MAX/etc.), y los elementos promocionados se configuran en el servidor desde el portal de AKS, asociados al placeholder.

kotlin
// Optional — exclude features the user already has unlocked from being promoted
AdsManager.setFeaturesAvailable(listOf("premium_theme", "no_ads"))

AdsManager.showFeaturePromotion(activity, placeholder, object : OnFeaturePromotionClicked {
    override fun onFeaturePromotionClicked(targetScreen: String) {
        // user tapped the promotion — navigate them to targetScreen
    }

    override fun onFailToShowFeaturePromotion(errorMessage: String) { }
})

Paywall

Paywall es el otro formato alojado por AKS (como Feature Promotion). El diseño del paywall, sus textos, la presentación de los precios y los planes se configuran en el servidor desde el portal de AKS, dentro del formato de anuncio PAYWALLS. AKS renderiza la pantalla y gestiona todo el flujo de compra (precios, selección del plan, la compra en Google Play / Amazon y la notificación del resultado a tu aplicación). Nunca llamas directamente a una API de facturación ni navegas a una pantalla propia para mostrarlo: AKS lo presenta como una capa superpuesta sobre la activity que le pasas.

kotlin
// Preload — call ahead of time (e.g. in onCreate) so the paywall is ready to show instantly
// later. Resolves against "{placeholder}_LOAD" in the AKS portal config, NOT the bare
// placeholder — see the note below.
PaywallManager.loadPaywall(placeholder, object : PaywallCallback() {
    override fun onLoaded(paywallId: String) { }
    override fun onFailedToLoad(reason: String) { }
    override fun onReadyToShow(paywallId: String) { }   // not used on this path
    override fun onFailedToShow(reason: String) { }     // not used on this path
}, languageCode)

// Show — presents the paywall on `activity`. If it wasn't already loaded, this loads it
// first and shows it as soon as it's ready, same combined load-then-show convenience as
// loadAndShowInterstitialAd. Resolves against the BARE placeholder (no "_LOAD" suffix).
PaywallManager.showPaywall(PlatformActivity(activity), placeholder, object : PaywallCallback() {
    override fun onLoaded(paywallId: String) { }
    override fun onFailedToLoad(reason: String) { }
    override fun onReadyToShow(paywallId: String) { }     // paywall is now on screen
    override fun onFailedToShow(reason: String) { }       // not eligible, or failed to load

    override fun onPurchaseCompleted(result: PaywallPurchaseResult) {
        // result.sku, result.product (matched from the paywall's own catalog, nullable),
        // result.purchaseToken, result.purchaseTimeUtc — grant whatever entitlement this sku
        // unlocks, e.g.:
        AppsKitSDK.setRemoveAdsStatus(true)
    }
    override fun onPurchaseFailed(message: String) { }
    override fun onDismissed() { }
    override fun onRestoreCompleted(results: List<PaywallPurchaseResult>) {
        // fired if the user tapped the presented paywall's own "Restore" action
    }
}, languageCode)

loadPaywall y showPaywall resuelven entradas de emplazamiento distintas del portal para la misma cadena placeholder: loadPaywall busca "{placeholder}_LOAD" —la misma convención de precarga con el sufijo _LOAD que el formato intersticial usa internamente—, mientras que showPaywall (y su propia comprobación de elegibilidad) resuelve el placeholder sin sufijo. La precarga es opcional: showPaywall carga bajo demanda si no se ha precargado nada. Sin embargo, si usas la precarga, configura ambas entradas en el portal de AKS, ya que pueden apuntar a diseños de paywall distintos.

Solo onLoaded/onFailedToLoad/onReadyToShow/onFailedToShow son abstract en PaywallCallback; onPurchaseCompleted/onPurchaseFailed/onDismissed/onRestoreCompleted son open y sus implementaciones predeterminadas no hacen nada, por lo que no es necesario sobrescribirlos en una llamada que solo carga el paywall.

languageCode es opcional y, si se proporciona, se envía al backend para que pueda localizar el diseño y los textos del paywall.

Restaurar compras

Un punto de entrada independiente para tu propia fila o botón «Restaurar compras», tanto si se está mostrando un paywall como si no:

kotlin
PaywallManager.restorePurchases(
    PlatformContext(context),
    PlatformActivity(activity),
    null, // storeType — null resolves to whatever AppsKitSDKApplication.setPlatform() declared
    object : PaywallResultCallback {
        override fun onPurchaseCompleted(result: PaywallPurchaseResult) { }   // not invoked on this path
        override fun onPurchaseFailed(message: String) { }                    // not invoked on this path
        override fun onRestoreCompleted(results: List<PaywallPurchaseResult>) {
            // empty list = nothing to restore; otherwise sync your entitlement from each sku
        }
    }
)

restorePurchases solo llama a onRestoreCompleted. Los otros dos miembros de PaywallResultCallback existen porque esta misma interfaz también se usa internamente para notificar las compras desde una pantalla de paywall activa (consulta onPurchaseCompleted/onPurchaseFailed de showPaywall más arriba, que es donde se reciben esas notificaciones).

Gestionar los derechos de acceso a partir del resultado

Ni onPurchaseCompleted ni onRestoreCompleted cambian nada en tu aplicación por sí solos: AKS informa de lo ocurrido y tú decides qué se desbloquea:

kotlin
private fun syncEntitlementFrom(results: List<PaywallPurchaseResult>) {
    val hasRemoveAds = results.any { it.sku in YOUR_REMOVE_ADS_SKUS }
    AppsKitSDK.setRemoveAdsStatus(hasRemoveAds)
    // drive your own subscription/Pro flag the same way, from YOUR_SUBSCRIPTION_SKUS
}

En una restauración, trata a AKS como la fuente de verdad: si un SKU no aparece en results, significa que el usuario no dispone de él actualmente. Por tanto, también debes revocar el derecho de acceso correspondiente, no solo conceder los que estén presentes; de lo contrario, un usuario con una suscripción vencida que restaure sus compras conservará el acceso para siempre. En cambio, una compra individual completada siempre confirma por sí sola un derecho adquirido: concédelo y deja intacto el estado de los demás derechos de acceso.