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

5. 広告フォーマットの呼び出し

どの呼び出しでも、AKS ポータルで設定したプレースホルダー文字列を引き続き渡します。AKS は実行時に、この文字列から広告ネットワークとフェイルオーバー先のリストを解決します。

5.1 ブリッジパターン

AKS の広告コールバック型(AdsCallback、BannerCallback、NativeCallback、RewardedAdCallbacks、AppOpenAdCallbacks)は、クロージャではなく、サブクラス化して override するクラスです。標準的な実装パターン(AppsKitSDKAdsManagerIOS の利用側で広く使われているもの)は、フォーマットごとに小さな非公開のアダプタークラスを作成し、次の処理を行う方法です。

  1. AKS のコールバック型を継承し、super.init() を呼び出します。
  2. 各ライフサイクルイベントを、アプリの UI レイヤーが必要とする処理に転送します。
  3. バナー広告、ネイティブ広告、リワード広告では、アダプター自身が読み込み→表示を連続して実行します。つまり、アダプターでオーバーライドした onBannerLoaded()/onNativeLoaded()/onRewardedLoaded() から対応する show... を呼び出し、表示時のコールバックにも self を再利用します。
swift
private class BannerCallbackAdapter: BannerCallback {
    private let onLoaded: () -> Void
    private let onFailed: (String) -> Void
    private weak var container: UIView?
    private let placeholder: String

    init(container: UIView, placeholder: String, onLoaded: @escaping () -> Void, onFailed: @escaping (String) -> Void) {
        self.container = container
        self.placeholder = placeholder
        self.onLoaded = onLoaded
        self.onFailed = onFailed
        super.init()
    }

    override func onBannerLoaded() {
        onLoaded()
        guard let vc = UIApplication.topViewController(), let view = container else {
            onFailed("No active view controller found")
            return
        }
        AppsKitSDKAdsManagerIOS.instance.showBanner(from: vc, placeholder: placeholder, container: view, callback: self)
    }
    override func onBannerFailedToLoad() { onFailed("") }
    override func onBannerClicked() {}
    override func onBannerShown() {}
    override func onBannerSizeChanged(bannerSizes: BannerSizes) {}
    override func setBannerSize(width: Double, height: Double) {}
}

UIApplication.topViewController()(AppsKit.xcframework が UIApplication の拡張として提供)は、キーウインドウのルートビューコントローラーから、モーダル表示中のビューコントローラー、ナビゲーションコントローラー、タブコントローラーをたどり、実際に最前面にある画面を取得します。ビューコントローラーを必要とする呼び出しで、UIView しか手元にない場合や、UI コンテキストがまったくない場合に必要になります。

インタースティシャル広告

swift
// Load only
AppsKitSDKAdsManagerIOS.instance.loadInterstitial(from: viewController, placeholder: placeholder, callback: adapter)

// Show a previously loaded interstitial
AppsKitSDKAdsManagerIOS.instance.showInterstitial(from: viewController, placeholder: placeholder, callback: adapter)

adapter は AdsCallback を継承します。

swift
private class InterstitialCallbackAdapter: AdsCallback {
    private let onAdLoaded: () -> Void
    private let onAdFailed: () -> Void

    init(onAdLoaded: @escaping () -> Void, onAdFailed: @escaping () -> Void) {
        self.onAdLoaded = onAdLoaded
        self.onAdFailed = onAdFailed
        super.init()
    }

    override func onLoaded()         { onAdLoaded() }
    override func onFailedToLoad()   { onAdFailed() }
    override func onAdShown()        {}
    override func onAdDismissed()    {}
    override func onAdFailedToShow() {}
}

リワード広告

swift
// Separate load/show — chain load→show in your adapter's onRewardedLoaded(), same pattern as banner/native
AppsKitSDKAdsManagerIOS.instance.loadRewarded(from: viewController, placeholder: placeholder, callback: adapter)

AppsKitSDKAdsManagerIOS.instance.showRewarded(from: viewController, placeholder: placeholder, callback: adapter)

adapter は RewardedAdCallbacks を継承し、onRewardedLoaded() から直接 showRewarded を呼び出します。表示時のコールバックにも self を再利用します。

swift
private class RewardedAdCallbackAdapter: RewardedAdCallbacks {
    private let placeholder: String
    private let onUserEarnedReward: () -> Void
    private let onFailed: (String) -> Void

    init(placeholder: String, onUserEarnedReward: @escaping () -> Void, onFailed: @escaping (String) -> Void) {
        self.placeholder = placeholder
        self.onUserEarnedReward = onUserEarnedReward
        self.onFailed = onFailed
        super.init()
    }

    override func onRewardedLoaded() {
        guard let vc = UIApplication.topViewController() else {
            onFailed("No active view controller found")
            return
        }
        AppsKitSDKAdsManagerIOS.instance.showRewarded(from: vc, placeholder: placeholder, callback: self)
    }
    override func onAdRewarded()            { onUserEarnedReward() }
    override func onRewardedCompleted()     { onUserEarnedReward() }
    override func onAdRewardedAdDismissed() {}
    override func onRewardedAdLoadFailure() { onFailed("Failed to load rewarded ad") }
    override func onRewardedFailedToShow()  { onFailed("Failed to show rewarded ad") }
}

AKS は、1 回の呼び出しで読み込みと表示を行う loadAndShowRewarded(from:placeholder:callback:) も AppsKitSDKAdsManagerIOS で提供しています。このメソッドは RewardedLoadAndShowCallback を受け取ります。これは onRewardedAdSuccess()/onRewardedAdFailed() のみを持つプロトコルです(抽象クラスではなくプロトコルなので、super.init() は不要です)。事前に読み込んで後から表示する場合は、上記の loadRewarded/showRewarded を個別に使用してください。常に読み込み直後に表示する場合は、loadAndShowRewarded を使用してください。

アプリ起動時広告

swift
AppsKitSDKAdsManagerIOS.instance.loadAppOpen(placeholder: placeholder, callback: adapter)

AppsKitSDKAdsManagerIOS.instance.showAppOpen(from: viewController, placeholder: placeholder, callback: adapter)

adapter は AppOpenAdCallbacks を継承します。

swift
private class AppOpenCallbackAdapter: AppOpenAdCallbacks {
    private let onAdLoaded: () -> Void
    private let onAdFailed: () -> Void

    init(onAdLoaded: @escaping () -> Void, onAdFailed: @escaping () -> Void) {
        self.onAdLoaded = onAdLoaded
        self.onAdFailed = onAdFailed
        super.init()
    }

    override func onLoaded()       { onAdLoaded() }
    override func onFailedToLoad() { onAdFailed() }
    override func onAdShown()      {}
    override func onDismiss()      {}
    override func onAdFailToShow() {}
}

これはアプリ起動時広告を手動で制御する方法です。リモート設定に基づいて AKS がアプリケーションレベルで自動処理する場合は、代わりに AKSBaseAppDelegate の組み込みフローを使用してください(§4.6)。

バナー広告

swift
AppsKitSDKAdsManagerIOS.instance.loadBanner(from: viewController, placeholder: placeholder, callback: adapter)

AppsKitSDKAdsManagerIOS.instance.showBanner(from: viewController, placeholder: placeholder, container: bannerContainerView, callback: adapter)

adapter は BannerCallback を継承します。上記 §5.1 の BannerCallbackAdapter の完全な定義を参照してください。onBannerLoaded() から直接 showBanner を呼び出しています。

BannerSizes: BANNER (320×50)、LARGE_BANNER (320×100)、MEDIUM_RECTANGLE (300×250)、FULL_BANNER (468×60)。

ネイティブ広告

swift
AppsKitSDKAdsManagerIOS.instance.loadNative(from: viewController, placeholder: placeholder, isShowInScrollView: true, callback: adapter)

AppsKitSDKAdsManagerIOS.instance.showNative(
    from: viewController, container: nativeContainerView, placeholder: placeholder,
    res: nil, isShowInScrollView: true, callback: adapter
)

adapter は NativeCallback を継承し、BannerCallbackAdapter と同じパターンで、onNativeLoaded() から直接 showNative を呼び出します。

swift
private class NativeCallbackAdapter: NativeCallback {
    private weak var container: UIView?
    private let placeholder: String
    private let onAdLoaded: () -> Void
    private let onAdFailed: (String) -> Void

    init(container: UIView, placeholder: String, onAdLoaded: @escaping () -> Void, onAdFailed: @escaping (String) -> Void) {
        self.container = container
        self.placeholder = placeholder
        self.onAdLoaded = onAdLoaded
        self.onAdFailed = onAdFailed
        super.init()
    }

    override func onNativeLoaded() {
        onAdLoaded()
        guard let vc = UIApplication.topViewController(), let view = container else {
            onAdFailed("No active view controller found")
            return
        }
        AppsKitSDKAdsManagerIOS.instance.showNative(
            from: vc, container: view, placeholder: placeholder,
            res: nil, isShowInScrollView: true, callback: self
        )
    }
    override func onNativeFailedToLoad() { onAdFailed("") }
    override func onNativeClicked()      {}
    override func onNativeShown()        {}
}

機能プロモーション

機能プロモーションは、他のフォーマットと同様に AppsKitSDKAdsManagerIOS でラップされています。

swift
// Optional — exclude features the user already has unlocked from being promoted
AppsKitSDKAdsManagerIOS.instance.setFeaturesAvailable(availableFeatures: ["premium_theme", "no_ads"])

AppsKitSDKAdsManagerIOS.instance.showFeaturePromotion(
    from: viewController,
    placeholder: placeholder,
    callback: adapter
)

adapter は OnFeaturePromotionClicked に準拠します。これは抽象クラスではなくプロトコルなので、super.init() は不要です。

swift
private class FeaturePromotionAdapter: NSObject, OnFeaturePromotionClicked {
    private let onClicked: (String) -> Void
    private let onFailed: (String) -> Void

    init(onClicked: @escaping (String) -> Void, onFailed: @escaping (String) -> Void) {
        self.onClicked = onClicked
        self.onFailed = onFailed
    }

    func onFeaturePromotionClicked(targetScreen: String)    { onClicked(targetScreen) }
    func onFailToShowFeaturePromotion(errorMessage: String) { onFailed(errorMessage) }
}