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

4. SDK'yı Başlatma

4.1 AppDelegate

AKSBaseAppDelegate sınıfından türeyin. Şablon metot (template method) 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 için gerçekleştirir. Uygulamanızın bu akışa dahil olabilmesi için çeşitli open kanca 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üremeden başlatma

AKSBaseAppDelegate sınıfından türemek zorunlu değildir; bu sınıf yalnızca kolaylık sağlayan bir sarmalayıcıdır. Uygulamanızın zaten vazgeçemeyeceğiniz bir UIApplicationDelegate uygulaması varsa, sınıfın dahili olarak ç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 dahili olarak kullandığı uygulama (AdMob/IronSource/MAX reklam arabuluculuğunu başlatma, AppsFlyer/Adjust raporlaması), SDK'nın dahili bir türüdür. Bu nedenle, tam da bu kullanım senaryosu için makeDefaultIOSAdHandler() aracılığıyla dışarıya sunulur.

AKSBaseAppDelegate sınıfından türemediğinizde kaybettiğiniz özellik, otomatik "uygulama düzeyinde App Open reklamı" akışıdır (§4.6). requestSplashAppOpenAd/disableAppOpenSplashCallback/showAppOpenAdIfAvailable, doğrudan AKSBaseAppDelegate sınıfının örnek metotlarıdır ve yalın AppsKitSDK nesnesi üzerinde sunulmaz. Bu metotları yöneten ön plan/arka plan takibi de AKSBaseAppDelegate sınıfının kendi applicationWillEnterForeground/applicationDidBecomeActive/applicationWillResignActive override'larında yer alır. Yine de App Open reklamı kullanmak istiyorsanız, kendi başlangıç akışınızda reklamı göstermek 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 bağlantısını kurun. application(_:didFinishLaunchingWithOptions:) metodunun çalışmasını sağlayan asıl 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 sırasının tamamı, WindowGroup ekrana ç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 sabit olarak true değerine ayarlanmıştır; entegrasyonun hiçbir yerinde UMP/CMP rıza akışı bağlı değildir. Bu bir eksikliktir, öneri değildir: 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ıktır, §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 dahili olarak kontrol eder; ayrıca bir koşul kontrolü eklemenize gerek yoktur. Swift erişim biçimine dikkat edin: Bu yönetici türlerinin tamamı, statik .shared erişimcisi olan bir sınıf 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 takip eder ve AKS portal yapılandırmanızda isAppOpenAtApplicationLvl etkinse, uygulama arka plandan yeniden açıldığında (warm start) bir App Open reklamı gösterir. Açılış ekranı akışınız için üç metot mevcuttur:

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