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 Appのエントリーポイント
アプリがStoryboardではなく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()