5. Chamando os formatos de anúncio
Todas as chamadas continuam recebendo uma string de placeholder configurada no portal AKS — o AKS a resolve em uma rede + uma lista de fallback em tempo de execução.
5.1 O padrão de adaptação
Os tipos de callback de anúncios do AKS (AdsCallback, BannerCallback, NativeCallback, RewardedAdCallbacks, AppOpenAdCallbacks) são classes das quais você cria subclasses e sobrescreve métodos com override — não são closures. O padrão idiomático (usado por quem consome AppsKitSDKAdsManagerIOS) é criar uma pequena classe adaptadora privada por formato que:
- Herda do tipo de callback do AKS e chama
super.init(). - Encaminha cada evento do ciclo de vida conforme as necessidades da sua camada de UI.
- Para banner, nativo e premiado, encadeia o carregamento→exibição por conta própria — ou seja, a sobrescrita de
onBannerLoaded()/onNativeLoaded()/onRewardedLoaded()no adaptador dispara a chamadashow...correspondente, reutilizandoselftambém como callback da etapa de exibição.
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() (fornecido por AppsKit.xcframework, como uma extensão de UIApplication) percorre a hierarquia a partir do view controller raiz da janela principal (key window), passando por controladores apresentados, de navegação ou de abas, para encontrar a tela que está de fato em primeiro plano — você precisa disso sempre que uma chamada exige um view controller, mas você só tem uma UIView ou não tem nenhum contexto de UI.
Intersticial
// 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 herda 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() {}
}Premiado
// 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 herda de RewardedAdCallbacks e encadeia onRewardedLoaded() diretamente com showRewarded, reutilizando self como callback da etapa de exibição:
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") }
}O AKS também disponibiliza
loadAndShowRewarded(from:placeholder:callback:)emAppsKitSDKAdsManagerIOSpara carregar e exibir em uma única chamada, recebendo umRewardedLoadAndShowCallback— um protocolo com apenasonRewardedAdSuccess()/onRewardedAdFailed()(não é necessário chamarsuper.init(), pois é um protocolo, não uma classe abstrata). Use o par separadoloadRewarded/showRewardedacima quando precisar carregar antecipadamente e exibir depois; useloadAndShowRewardedquando sempre for exibir imediatamente após o carregamento.
Abertura do app (App Open)
AppsKitSDKAdsManagerIOS.instance.loadAppOpen(placeholder: placeholder, callback: adapter)
AppsKitSDKAdsManagerIOS.instance.showAppOpen(from: viewController, placeholder: placeholder, callback: adapter)adapter herda 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 é o fluxo manual de App Open — para o gerenciamento automático do AKS no nível do aplicativo, controlado por configuração remota, use o fluxo 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 herda de BannerCallback — veja a definição completa de BannerCallbackAdapter na seção §5.1 acima, que encadeia onBannerLoaded() diretamente com showBanner.
BannerSizes: BANNER (320×50), LARGE_BANNER (320×100), MEDIUM_RECTANGLE (300×250), FULL_BANNER (468×60).
Nativo
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
)
// Show the native ad using the design you created for this placeholder in the
// AKS portal, instead of an XIB — see below.
AppsKitSDKAdsManagerIOS.instance.showTemplatedNative(
from: viewController, container: nativeContainerView, placeholder: placeholder,
isShowInScrollView: true, callback: adapter
)showTemplatedNative é destinado a placeholders cujo visual do anúncio nativo foi criado e atribuído no portal AKS, e não no seu app — não há parâmetro res, pois você não precisa fornecer o layout. O AKS identifica qual template do portal se aplica a esse placeholder, busca esse template (armazenado em cache após a primeira busca) e renderiza o anúncio nativo com ele usando o mesmo pipeline de carregamento/exibição de showNative. Se nenhum template estiver atribuído ao placeholder, ou se não for possível buscá-lo, o AKS usa seu próprio design nativo padrão integrado como fallback, em vez de causar uma falha no anúncio — portanto, é sempre seguro fazer a chamada, mesmo antes de configurar um template no portal.
adapter herda de NativeCallback e encadeia onNativeLoaded() diretamente com showNative, seguindo o mesmo padrão de 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() {}
}Promoção de funcionalidades (Feature Promotion)
A promoção de funcionalidades é encapsulada por AppsKitSDKAdsManagerIOS, assim como os outros 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 — um protocolo, não uma classe abstrata, portanto não é necessário chamar 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) }
}