4. Inicialización del SDK
4.1 AppDelegate
Crea una subclase de AKSBaseAppDelegate: una clase base que aplica el patrón método plantilla y se encarga de configurar Firebase, inicializar AdMob, inicializar el SDK y preparar la configuración remota, con varios métodos de extensión open para integrar tu app.
import UIKit
import AppsKit
import AKSKit
class AppDelegate: AKSBaseAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
AppsKitSDKAdsManagerIOS.instance.initialize(userHasGivenConsent: true, isCCPAConsent: true)
// super.application(...) does, in order:
// FirebaseApp.configure() -> MobileAds.shared.start() -> setupAdBridge()
// -> AppsKitSDK init/setDevMode/setTestMode/saveDefaultConfigJson
// -> configureSDK() -> manageRemoteConfigs(...)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
/// Called by the base class during the sequence above. Optional — only needed if your
/// app has its own ad-loading abstraction layer that needs to be wired up to AKS. If you
/// call `AppsKitSDKAdsManagerIOS.instance` directly from your own Swift code (§5), leave
/// this empty.
override func setupAdBridge() {}
override func isDevMode() -> Bool { return false } // wire to your own debug flag
override func isTestMode() -> Bool { return false }
override func defaultConfigJson() -> String? {
return "<encrypted-config-json-from-aks-portal>"
}
/// Called after dev/test mode flags are applied — use this for anything that needs
/// to happen after the base setup but before remote config is ready (e.g. initializing
/// AppLovin MAX directly).
override func configureSDK() {}
override func onConfigsReadyToUse() {
// optional — fires once Firebase Remote Config has been fetched/activated
}
}Lista completa de métodos de extensión open de AKSBaseAppDelegate: setupAdBridge(), isDevMode() -> Bool (por defecto, false), isTestMode() -> Bool (por defecto, false), defaultConfigJson() -> String? (por defecto, nil), timeToFetchRemoteConfigInSeconds() -> Int (por defecto, 3600), onConfigsReadyToUse(), configureSDK().
4.2 Inicialización sin heredar de AKSBaseAppDelegate
No es obligatorio crear una subclase de AKSBaseAppDelegate: es una clase contenedora que facilita la integración. Si tu app ya tiene un UIApplicationDelegate propio que necesitas conservar, llama a los mismos métodos de AppsKitSDK/AKSKit que utiliza internamente, directamente desde tu propio application(_:didFinishLaunchingWithOptions:):
import UIKit
import AppsKit // for makeDefaultIOSAdHandler() — see below
import AKSKit
import FirebaseCore
import FirebaseRemoteConfig
import GoogleMobileAds
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
MobileAds.shared.start()
// If your app has its own ad-loading abstraction layer to wire up to AKS, do it
// around here — most apps don't need this; see §5 to call ad formats directly.
let sdkInstance = AppsKitSDK.shared
sdkInstance.setIOSAdHandler(iosAdHandler: makeDefaultIOSAdHandler())
sdkInstance.initialize(
context: PlatformContext(delegate: nil),
application: PlatformApplication(application: UIApplication.shared)
)
sdkInstance.setDevMode(value: false) // wire to your own debug flag
sdkInstance.setTestMode(value: false)
sdkInstance.setTimeToFetchRemoteConfigInSeconds(intervalToFetchRemoteConfigInSeconds: 3600) // optional, defaults to 3600
sdkInstance.saveDefaultConfigJson(encryptedJson: "<encrypted-config-json-from-aks-portal>")
sdkInstance.manageRemoteConfigs(onRemoteConfigReady: RemoteConfigReadyBridge {
// optional — your own hook into the fetched remote config
})
AdsManager.shared.setAppExitTime(appExitTime: 0)
AKSUtils.shared.cleanCachedData()
return true
}
}
// manageRemoteConfigs(onRemoteConfigReady:) takes an OnRemoteConfigAvailable, not a closure —
// AKSBaseAppDelegate has a private adapter for this internally; outside it, write your own:
private class RemoteConfigReadyBridge: NSObject, OnRemoteConfigAvailable {
private let onReady: () -> Void
init(_ onReady: @escaping () -> Void) { self.onReady = onReady }
func onRemoteConfigReadyToFetch(remoteConfig: RemoteConfig) {
DispatchQueue.main.async { self.onReady() }
}
}setIOSAdHandler(iosAdHandler:) necesita una implementación concreta de IOSPlatformAdHandler: la que utiliza AKSBaseAppDelegate internamente (inicialización de la mediación de AdMob/IronSource/MAX y envío de informes a AppsFlyer/Adjust) es un tipo interno del SDK, por lo que se expone como makeDefaultIOSAdHandler() precisamente para este caso.
Al no crear una subclase de AKSBaseAppDelegate, pierdes el flujo automático de «anuncios de apertura de la app a nivel de aplicación» (§4.6): requestSplashAppOpenAd/disableAppOpenSplashCallback/showAppOpenAdIfAvailable son métodos de instancia del propio AKSBaseAppDelegate, no se exponen en el objeto AppsKitSDK por sí solo, y el seguimiento de las transiciones entre primer y segundo plano que los activa reside en las implementaciones sobrescritas de applicationWillEnterForeground/applicationDidBecomeActive/applicationWillResignActive de AKSBaseAppDelegate. Si aun así quieres mostrar un anuncio de apertura de la app, llama directamente a AppsKitSDKAdsManagerIOS.instance.loadAppOpen/showAppOpen (§5, App Open) en el punto de tu propio flujo de inicio que prefieras.
4.3 Punto de entrada de la app en SwiftUI
Si tu app utiliza el protocolo App de SwiftUI en lugar de un storyboard, conecta tu AppDelegate mediante @UIApplicationDelegateAdaptor: esto es lo que hace que se ejecute application(_:didFinishLaunchingWithOptions:):
import SwiftUI
@main
struct YourApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}Toda la secuencia de inicialización de §4.1 se ejecuta de forma síncrona dentro de didFinishLaunchingWithOptions, antes de que se renderice WindowGroup, por lo que el puente de anuncios y el SDK están listos antes de que se muestre cualquier interfaz de usuario.
4.4 Consentimiento e inicialización de anuncios
AppsKitSDKAdsManagerIOS.instance.initialize(userHasGivenConsent: true, isCCPAConsent: true)La integración de referencia fija ambos indicadores en
true: no incorpora ningún flujo de consentimiento UMP/CMP. Es una carencia, no una recomendación: si tu app está sujeta al RGPD/CCPA, ejecuta tu propio flujo de consentimiento (el SDK UMP de Google ya es una dependencia transitiva a través deGoogle-Mobile-Ads-SDK, §1.2; solo tienes que invocarlo) o utiliza una CMP personalizada, y pasa la decisión real del usuario a esta llamada en lugar de untruefijo. Combina este flujo con la solicitud de permiso ATT de §3.3 si también necesitas el IDFA.
4.5 Eliminación de anuncios / control mediante compras en la app (IAP)
AppsKitSDK.shared.setRemoveAdsStatus(status: true) // call after a successful purchase/restore
AppsKitSDK.shared.getRemoveAdsStatus() // check current statusCada llamada de carga o visualización ya comprueba este estado internamente: no necesitas añadir controles por tu cuenta. Fíjate en el patrón de acceso de Swift: todos estos tipos de gestores se exponen como una clase con un accesor estático .shared (AppsKitSDK.shared, AKSLogManager.shared, PreferencesManager.shared, etc.). Verás este patrón en todo el SDK.
4.6 Anuncios de apertura de la app a nivel de aplicación
AKSBaseAppDelegate realiza un seguimiento automático de las transiciones entre primer y segundo plano (applicationWillEnterForeground/applicationDidBecomeActive/applicationWillResignActive) y mostrará un anuncio de apertura de la app en los inicios en caliente si la configuración del portal AKS tiene activado isAppOpenAtApplicationLvl. Hay tres métodos disponibles para el flujo de tu pantalla de inicio:
// Call from your splash screen — requests and shows an app-open ad
(appDelegate as? AKSBaseAppDelegate)?.requestSplashAppOpenAd(callbacks: myCallbacks, waitTimeInSeconds: 5)
// Stop the splash screen's callback from firing again on subsequent app-open events
(appDelegate as? AKSBaseAppDelegate)?.disableAppOpenSplashCallback()
// Manually trigger "show if one's already loaded and ready" — used internally on resume
(appDelegate as? AKSBaseAppDelegate)?.showAppOpenAdIfAvailable()