5. Llamadas a los formatos de anuncios
Cada llamada sigue recibiendo una cadena placeholder configurada en el portal de AKS: AKS la resuelve en tiempo de ejecución a una red y una lista de alternativas en caso de fallo.
5.1 El patrón de adaptación
Los tipos de callbacks de anuncios de AKS (AdsCallback, BannerCallback, NativeCallback, RewardedAdCallbacks, AppOpenAdCallbacks) son clases de las que se hereda y cuyos métodos se sobrescriben con override, no closures. El patrón idiomático (utilizado por los componentes que consumen AppsKitSDKAdsManagerIOS) consiste en una pequeña clase adaptadora privada por formato que:
- Hereda del tipo de callback de AKS y llama a
super.init(). - Reenvía cada evento del ciclo de vida según las necesidades de tu propia capa de interfaz de usuario.
- Para los anuncios de banner, nativos y recompensados, encadena por sí misma la carga→visualización; es decir, la implementación sobrescrita de
onBannerLoaded()/onNativeLoaded()/onRewardedLoaded()del adaptador es la que activa la llamadashow...correspondiente, reutilizandoselftambién como callback de la fase de visualización.
private class BannerCallbackAdapter: BannerCallback {
private let onLoaded: () -> Void
private let onFailed: (String) -> Void
private weak var container: UIView?
private let placeholder: String
init(container: UIView, placeholder: String, onLoaded: @escaping () -> Void, onFailed: @escaping (String) -> Void) {
self.container = container
self.placeholder = placeholder
self.onLoaded = onLoaded
self.onFailed = onFailed
super.init()
}
override func onBannerLoaded() {
onLoaded()
guard let vc = UIApplication.topViewController(), let view = container else {
onFailed("No active view controller found")
return
}
AppsKitSDKAdsManagerIOS.instance.showBanner(from: vc, placeholder: placeholder, container: view, callback: self)
}
override func onBannerFailedToLoad() { onFailed("") }
override func onBannerClicked() {}
override func onBannerShown() {}
override func onBannerSizeChanged(bannerSizes: BannerSizes) {}
override func setBannerSize(width: Double, height: Double) {}
}UIApplication.topViewController() (proporcionado por AppsKit.xcframework como extensión de UIApplication) recorre la jerarquía desde el controlador de vista raíz de la ventana clave, pasando por los controladores presentados, de navegación o de pestañas, hasta encontrar la pantalla que está realmente en primer plano. Lo necesitas siempre que una llamada requiera un controlador de vista y solo dispongas de una UIView o no tengas ningún contexto de interfaz de usuario.
Intersticiales
// Load only
AppsKitSDKAdsManagerIOS.instance.loadInterstitial(from: viewController, placeholder: placeholder, callback: adapter)
// Show a previously loaded interstitial
AppsKitSDKAdsManagerIOS.instance.showInterstitial(from: viewController, placeholder: placeholder, callback: adapter)adapter hereda de AdsCallback:
private class InterstitialCallbackAdapter: AdsCallback {
private let onAdLoaded: () -> Void
private let onAdFailed: () -> Void
init(onAdLoaded: @escaping () -> Void, onAdFailed: @escaping () -> Void) {
self.onAdLoaded = onAdLoaded
self.onAdFailed = onAdFailed
super.init()
}
override func onLoaded() { onAdLoaded() }
override func onFailedToLoad() { onAdFailed() }
override func onAdShown() {}
override func onAdDismissed() {}
override func onAdFailedToShow() {}
}Recompensados
// Separate load/show — chain load→show in your adapter's onRewardedLoaded(), same pattern as banner/native
AppsKitSDKAdsManagerIOS.instance.loadRewarded(from: viewController, placeholder: placeholder, callback: adapter)
AppsKitSDKAdsManagerIOS.instance.showRewarded(from: viewController, placeholder: placeholder, callback: adapter)adapter hereda de RewardedAdCallbacks y encadena onRewardedLoaded() directamente con showRewarded, reutilizando self como callback de la fase de visualización:
private class RewardedAdCallbackAdapter: RewardedAdCallbacks {
private let placeholder: String
private let onUserEarnedReward: () -> Void
private let onFailed: (String) -> Void
init(placeholder: String, onUserEarnedReward: @escaping () -> Void, onFailed: @escaping (String) -> Void) {
self.placeholder = placeholder
self.onUserEarnedReward = onUserEarnedReward
self.onFailed = onFailed
super.init()
}
override func onRewardedLoaded() {
guard let vc = UIApplication.topViewController() else {
onFailed("No active view controller found")
return
}
AppsKitSDKAdsManagerIOS.instance.showRewarded(from: vc, placeholder: placeholder, callback: self)
}
override func onAdRewarded() { onUserEarnedReward() }
override func onRewardedCompleted() { onUserEarnedReward() }
override func onAdRewardedAdDismissed() {}
override func onRewardedAdLoadFailure() { onFailed("Failed to load rewarded ad") }
override func onRewardedFailedToShow() { onFailed("Failed to show rewarded ad") }
}AKS también expone
loadAndShowRewarded(from:placeholder:callback:)enAppsKitSDKAdsManagerIOSpara cargar y mostrar en una sola llamada. Recibe unRewardedLoadAndShowCallback, un protocolo que solo incluyeonRewardedAdSuccess()/onRewardedAdFailed()(no necesitasuper.init(), ya que es un protocolo, no una clase abstracta). Usa el par de llamadas separadasloadRewarded/showRewardedanterior cuando necesites cargar con antelación y mostrar más tarde; usaloadAndShowRewardedcuando siempre vayas a mostrar el anuncio inmediatamente después de cargarlo.
Anuncios de apertura de aplicación
AppsKitSDKAdsManagerIOS.instance.loadAppOpen(placeholder: placeholder, callback: adapter)
AppsKitSDKAdsManagerIOS.instance.showAppOpen(from: viewController, placeholder: placeholder, callback: adapter)adapter hereda de AppOpenAdCallbacks:
private class AppOpenCallbackAdapter: AppOpenAdCallbacks {
private let onAdLoaded: () -> Void
private let onAdFailed: () -> Void
init(onAdLoaded: @escaping () -> Void, onAdFailed: @escaping () -> Void) {
self.onAdLoaded = onAdLoaded
self.onAdFailed = onAdFailed
super.init()
}
override func onLoaded() { onAdLoaded() }
override func onFailedToLoad() { onAdFailed() }
override func onAdShown() {}
override func onDismiss() {}
override func onAdFailToShow() {}
}Este es el flujo manual para los anuncios de apertura de aplicación. Para la gestión automática de AKS a nivel de aplicación mediante configuración remota, usa en su lugar el flujo integrado de
AKSBaseAppDelegate(§4.6).
Banner
AppsKitSDKAdsManagerIOS.instance.loadBanner(from: viewController, placeholder: placeholder, callback: adapter)
AppsKitSDKAdsManagerIOS.instance.showBanner(from: viewController, placeholder: placeholder, container: bannerContainerView, callback: adapter)adapter hereda de BannerCallback: consulta la definición completa de BannerCallbackAdapter en §5.1, que encadena onBannerLoaded() directamente con showBanner.
BannerSizes: BANNER (320×50), LARGE_BANNER (320×100), MEDIUM_RECTANGLE (300×250), FULL_BANNER (468×60).
Nativos
AppsKitSDKAdsManagerIOS.instance.loadNative(from: viewController, placeholder: placeholder, isShowInScrollView: true, callback: adapter)
AppsKitSDKAdsManagerIOS.instance.showNative(
from: viewController, container: nativeContainerView, placeholder: placeholder,
res: nil, isShowInScrollView: true, callback: adapter
)adapter hereda de NativeCallback y encadena onNativeLoaded() directamente con showNative, siguiendo el mismo patrón que BannerCallbackAdapter:
private class NativeCallbackAdapter: NativeCallback {
private weak var container: UIView?
private let placeholder: String
private let onAdLoaded: () -> Void
private let onAdFailed: (String) -> Void
init(container: UIView, placeholder: String, onAdLoaded: @escaping () -> Void, onAdFailed: @escaping (String) -> Void) {
self.container = container
self.placeholder = placeholder
self.onAdLoaded = onAdLoaded
self.onAdFailed = onAdFailed
super.init()
}
override func onNativeLoaded() {
onAdLoaded()
guard let vc = UIApplication.topViewController(), let view = container else {
onAdFailed("No active view controller found")
return
}
AppsKitSDKAdsManagerIOS.instance.showNative(
from: vc, container: view, placeholder: placeholder,
res: nil, isShowInScrollView: true, callback: self
)
}
override func onNativeFailedToLoad() { onAdFailed("") }
override func onNativeClicked() {}
override func onNativeShown() {}
}Promoción de funcionalidades
La promoción de funcionalidades se encapsula en AppsKitSDKAdsManagerIOS, al igual que los demás formatos:
// Optional — exclude features the user already has unlocked from being promoted
AppsKitSDKAdsManagerIOS.instance.setFeaturesAvailable(availableFeatures: ["premium_theme", "no_ads"])
AppsKitSDKAdsManagerIOS.instance.showFeaturePromotion(
from: viewController,
placeholder: placeholder,
callback: adapter
)adapter implementa OnFeaturePromotionClicked, que es un protocolo, no una clase abstracta, por lo que no necesita super.init():
private class FeaturePromotionAdapter: NSObject, OnFeaturePromotionClicked {
private let onClicked: (String) -> Void
private let onFailed: (String) -> Void
init(onClicked: @escaping (String) -> Void, onFailed: @escaping (String) -> Void) {
self.onClicked = onClicked
self.onFailed = onFailed
}
func onFeaturePromotionClicked(targetScreen: String) { onClicked(targetScreen) }
func onFailToShowFeaturePromotion(errorMessage: String) { onFailed(errorMessage) }
}