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 kurulumunu, AdMob ve SDK başlatma işlemlerini ve uzaktan yapılandırmanın ilk yüklemesini sizin yerinize gerçekleştirir. Uygulamanızı bu akışa dahil edebilmeniz 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ızda zaten kullanmaya devam etmeniz gereken bir UIApplicationDelegate 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 olarak bu kullanım senaryosu için makeDefaultIOSAdHandler() aracılığıyla dışarıya sunulur.

AKSBaseAppDelegate sınıfından türemediğ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 ve yalın AppsKitSDK nesnesi üzerinden sunulmaz. Bu metotları yöneten ön plan/arka plan takibi de AKSBaseAppDelegate sınıfının kendi applicationWillEnterForeground/applicationDidBecomeActive/applicationWillResignActive geçersiz kılmalarında yer alır. Yine de App Open reklamı göstermek istiyorsanız, kendi başlangıç 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 bağlantısını 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 reklamları 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ğlanmamıştır. 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ık olarak gelir, §1.2; yalnızca çağırmanız gerekir) veya özel bir CMP'yi kullanın ve bu çağrıya sabit 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 almaya (IAP) göre kontrol

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

Her reklam yükleme/gösterme çağrısı bu durumu zaten dahili olarak kontrol eder; kendiniz ek bir koşul kontrolü uygulamayın. Swift erişim biçimine dikkat edin: Bu yönetici türlerinin tümü, statik .shared erişimcisi olan bir sınıf olarak sunulur (AppsKitSDK.shared, AKSLogManager.shared, PreferencesManager.shared vb.). SDK genelinde bu erişim biçimini göreceksiniz.

4.6 Uygulama düzeyinde App Open reklamları

AKSBaseAppDelegate, ön plan/arka plan geçişlerini (applicationWillEnterForeground/applicationDidBecomeActive/applicationWillResignActive) otomatik olarak takip eder ve eğer 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ı (splash) akışınız için üç metot sunulur:

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