Apps Kit SDK logoApps Kit SDK
Dokümantasyon · iOS Entegrasyonu

4. SDK'yı Başlatma

4.1 AppDelegate

AKSBaseAppDelegate sınıfından türetin. Template Method tasarım desenini kullanan bu temel sınıf; Firebase yapılandırmasını, AdMob ve SDK başlatma işlemlerini ve uzaktan yapılandırmanın ilk kurulumunu sizin yerinize gerçekleştirir. Ayrıca uygulamanıza özel davranışlar ekleyebilmeniz için çeşitli open kanca (hook) metotları sunar.

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
    }
}

AKSBaseAppDelegate üzerindeki open kanca metotlarının tam listesi: setupAdBridge(), isDevMode() -> Bool (varsayılan: false), isTestMode() -> Bool (varsayılan: false), defaultConfigJson() -> String? (varsayılan: nil), timeToFetchRemoteConfigInSeconds() -> Int (varsayılan: 3600), onConfigsReadyToUse(), configureSDK().

4.2 AKSBaseAppDelegate sınıfından türetmeden başlatma

AKSBaseAppDelegate sınıfından türetmek zorunlu değildir; bu sınıf yalnızca kolaylık sağlayan bir sarmalayıcıdır. Uygulamanızda kullanmaya devam etmeniz gereken bir UIApplicationDelegate zaten varsa, sınıfın kendi içinde çağırdığı AppsKitSDK/AKSKit metotlarını doğrudan kendi application(_:didFinishLaunchingWithOptions:) metodunuzdan çağırın:

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:), somut bir IOSPlatformAdHandler uygulaması gerektirir. AKSBaseAppDelegate sınıfının kendi içinde kullandığı uygulama (AdMob/IronSource/MAX reklam arabuluculuğunu başlatma, AppsFlyer/Adjust raporlama), SDK'nın dahili bir türüdür. Bu nedenle tam da bu kullanım senaryosu için makeDefaultIOSAdHandler() aracılığıyla erişime sunulur.

AKSBaseAppDelegate sınıfından türetmediğinizde otomatik "uygulama düzeyinde App Open reklamı" akışından (§4.6) yararlanamazsınız. requestSplashAppOpenAd/disableAppOpenSplashCallback/showAppOpenAdIfAvailable, doğrudan AKSBaseAppDelegate sınıfının örnek metotlarıdır; yalın AppsKitSDK nesnesi üzerinden sunulmazlar. Bu metotları yöneten ön plan/arka plan takibi de AKSBaseAppDelegate sınıfının kendi applicationWillEnterForeground/applicationDidBecomeActive/applicationWillResignActive geçersiz kılma uygulamalarında yer alır. Yine de App Open reklamı göstermek istiyorsanız, kendi başlatma akışınızda istediğiniz noktada AppsKitSDKAdsManagerIOS.instance.loadAppOpen/showAppOpen metotlarını kendiniz çağırın (§5, App Open).

4.3 SwiftUI App giriş noktası

Uygulamanız storyboard yerine SwiftUI App protokolünü kullanıyorsa, @UIApplicationDelegateAdaptor ile AppDelegate sınıfınıza bağlantı kurun. application(_:didFinishLaunchingWithOptions:) metodunun çalışmasını sağlayan mekanizma budur:

swift
import SwiftUI

@main
struct YourApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

§4.1'deki başlatma dizisinin tamamı, WindowGroup çizilmeden önce didFinishLaunchingWithOptions içinde senkron olarak çalışır. Böylece herhangi bir kullanıcı arayüzü gösterilmeden önce reklam köprüsü ve SDK hazır olur.

4.4 Kullanıcı rızası ve reklam başlatma

swift
AppsKitSDKAdsManagerIOS.instance.initialize(userHasGivenConsent: true, isCCPAConsent: true)

Referans entegrasyonda her iki bayrak da kod içinde sabit olarak true değerine ayarlanmıştır; entegrasyonun hiçbir yerinde UMP/CMP rıza akışı bağlı değildir. Bu bir öneri değil, eksikliktir: Uygulamanız GDPR/CCPA kapsamındaysa kendi rıza akışınızı (Google'ın UMP SDK'sı, Google-Mobile-Ads-SDK üzerinden zaten geçişli bir bağımlılık olarak gelir, §1.2; yalnızca çağırmanız gerekir) veya özel bir CMP çalıştırın ve bu çağrıya sabit bir true yerine kullanıcının gerçek kararını iletin. IDFA'ya da ihtiyacınız varsa bunu §3.3'teki ATT izin istemiyle birlikte kullanın.

4.5 Reklamları kaldırma / uygulama içi satın alma (IAP) kontrolü

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

Her yükleme/gösterme çağrısı bu durumu zaten kendi içinde kontrol eder; ayrıca bir koşul eklemenize gerek yoktur. Swift erişim biçimine dikkat edin: Bu yönetici türlerinin tümü, statik bir .shared erişim üyesine sahip sınıflar olarak sunulur (AppsKitSDK.shared, AKSLogManager.shared, PreferencesManager.shared vb.). SDK genelinde bu yapıyla karşılaşırsınız.

4.6 Uygulama düzeyinde App Open reklamları

AKSBaseAppDelegate, ön plan/arka plan geçişlerini (applicationWillEnterForeground/applicationDidBecomeActive/applicationWillResignActive) otomatik olarak izler ve AKS portal yapılandırmanızda isAppOpenAtApplicationLvl etkinse uygulama arka plandan geri döndüğünde (warm start) bir App Open reklamı gösterir. Açılış ekranı (splash) akışınız için üç metot kullanılabilir:

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