4. SDK の初期化
4.1 AppDelegate
AKSBaseAppDelegate を継承します。これはテンプレートメソッドパターンの基底クラスで、Firebase のセットアップ、AdMob の初期化、SDK の初期化、リモート設定の初期セットアップを行います。アプリ固有の処理を組み込むための open フックもいくつか用意されています。
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:) から直接呼び出してください。
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:) が実行されるようになります。
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 同意取得と広告の初期化
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)に応じた制御
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 つのメソッドを利用できます。
// 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()