Apps Kit SDK logoApps Kit SDK
ドキュメント · iOS への組み込み

4. SDK の初期化

4.1 AppDelegate

AKSBaseAppDelegate を継承します。これはテンプレートメソッドパターンの基底クラスで、Firebase のセットアップ、AdMob の初期化、SDK の初期化、リモート設定の初期セットアップを行います。アプリ固有の処理を組み込むための open フックもいくつか用意されています。

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 の open フックの全一覧:setupAdBridge()、isDevMode() -> Bool(デフォルト:false)、isTestMode() -> Bool(デフォルト:false)、defaultConfigJson() -> String?(デフォルト:nil)、timeToFetchRemoteConfigInSeconds() -> Int(デフォルト:3600)、onConfigsReadyToUse()、configureSDK()。

4.2 AKSBaseAppDelegate を継承せずに初期化する

AKSBaseAppDelegate の継承は必須ではありません。これは実装を簡略化するためのラッパーです。アプリに既存の UIApplicationDelegate があり、置き換えられない場合は、AKSBaseAppDelegate が内部で呼び出しているものと同じ AppsKitSDK/AKSKit メソッドを、独自の 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:) には、IOSPlatformAdHandler の具体的な実装が必要です。AKSBaseAppDelegate が内部で使用する実装(AdMob/IronSource/MAX のメディエーション初期化、AppsFlyer/Adjust へのレポート送信)は SDK の内部型のため、この用途向けに makeDefaultIOSAdHandler() として公開されています。

AKSBaseAppDelegate を継承しない場合、「アプリケーションレベルでのアプリ起動時広告」の自動処理(§4.6)は利用できなくなります。requestSplashAppOpenAd/disableAppOpenSplashCallback/showAppOpenAdIfAvailable は AKSBaseAppDelegate 自体のインスタンスメソッドであり、AppsKitSDK オブジェクト単体では公開されていません。また、これらの処理を駆動するフォアグラウンド/バックグラウンドの状態追跡も、AKSBaseAppDelegate 自身がオーバーライドする applicationWillEnterForeground/applicationDidBecomeActive/applicationWillResignActive 内に実装されています。アプリ起動時広告を表示したい場合は、独自の起動フローの任意のタイミングで AppsKitSDKAdsManagerIOS.instance.loadAppOpen/showAppOpen を直接呼び出してください(§5 のアプリ起動時広告を参照)。

4.3 SwiftUI アプリのエントリーポイント

ストーリーボードではなく SwiftUI の App プロトコルを使用するアプリでは、@UIApplicationDelegateAdaptor で AppDelegate を接続します。これにより、実際に application(_:didFinishLaunchingWithOptions:) が実行されるようになります。

swift
import SwiftUI

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

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

§4.1 の初期化シーケンス全体は、WindowGroup が描画される前に、didFinishLaunchingWithOptions 内で同期的に実行されます。そのため、UI が表示される前に広告ブリッジと SDK の準備が整います。

4.4 同意取得と広告の初期化

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

リファレンス実装では、両方のフラグが true にハードコードされており、UMP/CMP による同意取得フローは一切組み込まれていません。これは実装上の不足であり、推奨される方法ではありません。アプリが GDPR/CCPA の適用対象となる場合は、独自の同意取得フロー(Google の UMP SDK は Google-Mobile-Ads-SDK 経由の推移的依存関係としてすでに含まれているため、呼び出すだけで利用できます。§1.2 を参照)またはカスタム CMP を使用し、ハードコードした true ではなく、実際のユーザーの選択をこの呼び出しに渡してください。IDFA も必要な場合は、§3.3 の ATT プロンプトと組み合わせてください。

4.5 広告削除/アプリ内課金(IAP)に応じた制御

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

すべての読み込み/表示の呼び出しで、この状態はすでに内部チェックされています。アプリ側で個別に制御する必要はありません。Swift でのアクセス方法にも注意してください。これらのマネージャー型はすべて、静的な .shared アクセサーを持つクラスとして公開されています(AppsKitSDK.shared、AKSLogManager.shared、PreferencesManager.shared など)。このパターンは SDK 全体で使用されています。

4.6 アプリケーションレベルでのアプリ起動時広告

AKSBaseAppDelegate はフォアグラウンド/バックグラウンドへの遷移(applicationWillEnterForeground/applicationDidBecomeActive/applicationWillResignActive)を自動的に追跡し、AKS ポータルの設定で isAppOpenAtApplicationLvl が有効になっている場合に、ウォームスタート時にアプリ起動時広告を表示します。スプラッシュ画面のフローでは、次の 3 つのメソッドを利用できます。

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