Apps Kit SDK logoApps Kit SDK
Documentación · Integración en iOS

4. Inicialización del SDK

4.1 AppDelegate

Crea una subclase de AKSBaseAppDelegate: una clase base que implementa el patrón de método plantilla y se encarga de configurar Firebase, inicializar AdMob y el SDK, y preparar la configuración remota. Incluye varios puntos de extensión open para personalizar el comportamiento de tu aplicación.

swift
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 puntos de extensión open de AKSBaseAppDelegate: setupAdBridge(), isDevMode() -> Bool (valor predeterminado: false), isTestMode() -> Bool (valor predeterminado: false), defaultConfigJson() -> String? (valor predeterminado: nil), timeToFetchRemoteConfigInSeconds() -> Int (valor predeterminado: 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 aplicación 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:):

swift
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, envío de informes a AppsFlyer/Adjust) es un tipo interno del SDK, por lo que se expone precisamente para este caso mediante makeDefaultIOSAdHandler().

Al no crear una subclase de AKSBaseAppDelegate, pierdes el flujo automático de «anuncios de apertura de aplicación (App Open) a nivel de aplicación» (§4.6): requestSplashAppOpenAd/disableAppOpenSplashCallback/showAppOpenAdIfAvailable son métodos de instancia del propio AKSBaseAppDelegate, no están expuestos en el objeto AppsKitSDK por sí solo. Además, el seguimiento de las transiciones entre primer y segundo plano que los controla reside en las sobrescrituras de applicationWillEnterForeground/applicationDidBecomeActive/applicationWillResignActive de AKSBaseAppDelegate. Si aun así quieres mostrar un anuncio App Open, 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 aplicación SwiftUI

Si tu aplicación utiliza el protocolo App de SwiftUI en lugar de un storyboard, conéctala con tu AppDelegate mediante @UIApplicationDelegateAdaptor: esto es lo que hace que se ejecute application(_:didFinishLaunchingWithOptions:):

swift
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 la interfaz de usuario.

4.4 Consentimiento e inicialización de anuncios

swift
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. Se trata de una carencia, no de una recomendación: si tu aplicación está sujeta al RGPD/CCPA, implementa tu propio flujo de consentimiento (el SDK UMP de Google ya es una dependencia transitiva a través de Google-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 un true fijo. Combina este flujo con la solicitud de autorización ATT de §3.3 si también necesitas el IDFA.

4.5 Eliminación de anuncios y control mediante compras integradas (IAP)

swift
AppsKitSDK.shared.setRemoveAdsStatus(status: true)   // call after a successful purchase/restore
AppsKitSDK.shared.getRemoveAdsStatus()               // check current status

Todas las llamadas de carga o visualización ya comprueban este estado internamente: no necesitas añadir comprobaciones por tu cuenta. Ten en cuenta el patrón de acceso en Swift: todos estos tipos de gestores se exponen como una clase con un miembro de acceso estático .shared (AppsKitSDK.shared, AKSLogManager.shared, PreferencesManager.shared, etc.). Verás este patrón en todo el SDK.

4.6 Anuncios App Open a nivel de aplicación

AKSBaseAppDelegate realiza un seguimiento automático de las transiciones entre primer y segundo plano (applicationWillEnterForeground/applicationDidBecomeActive/applicationWillResignActive) y muestra un anuncio App Open en los inicios en caliente si la configuración del portal de AKS tiene habilitado isAppOpenAtApplicationLvl. Hay tres métodos disponibles para el flujo de tu pantalla de inicio:

swift
// 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()