6. 広告フォーマットの呼び出し
すべての広告呼び出しには、プレースホルダーを指定します。これは、AKS ポータルで広告フォーマットに紐付けて設定する文字列キーです(例:"1")。AKS は実行時に、プレースホルダーから優先する広告ネットワークとフェイルオーバー先のリストを特定します。コード内で広告ユニット ID を直接参照する必要はありません。
インタースティシャル広告
// Load only
AdsManager.loadInterstitial(context, placeholder, object : AdsCallback() {
override fun onLoaded() { }
override fun onFailedToLoad() { }
override fun onAdShown() { }
override fun onAdDismissed() { }
override fun onAdFailedToShow() { }
})
// Show a previously loaded interstitial
AdsManager.showInterstitial(activity, placeholder, callback)
// Load and show in one call
AdsManager.loadAndShowInterstitialAd(activity, placeholder, callback)
// Check availability before showing
AdsManager.isInterstitialAvailable(placeholder)リワード広告
AdsManager.loadRewarded(context, placeholder, object : RewardedAdCallbacks() {
override fun onRewardedLoaded() { }
override fun onRewardedAdLoadFailure() { }
override fun onRewardedCompleted() { }
override fun onAdRewarded() { }
override fun onAdRewardedAdDismissed() { }
override fun onRewardedFailedToShow() { }
})
AdsManager.showRewarded(activity, placeholder, callbacks)
// Load and show in one call — simpler success/fail callback
AdsManager.loadAndShowRewardedAd(activity, placeholder, object : RewardedLoadAndShowCallback {
override fun onRewardedAdSuccess() { }
override fun onRewardedAdFailed() { }
})
AdsManager.isRewardedAvailable(placeholder)アプリ起動時広告
AdsManager.loadAppOpen(application, placeholder, object : AppOpenAdCallbacks() {
override fun onLoaded() { }
override fun onFailedToLoad() { }
override fun onDismiss() { }
override fun onAdShown() { }
override fun onAdFailToShow() { }
})
AdsManager.showAppOpen(activity, placeholder, callbacks)アプリ起動時広告を自分で管理する代わりに、AKS 標準のスプラッシュ/アプリ起動時広告の処理(リモート設定フラグ
isAppOpenAtApplicationLvlで制御)を利用する場合は、AppsKitSDKApplicationサブクラスでloadDefaultAppOpen/showDefaultAppOpenを使用してください。または、基底のApplicationクラスに一連の処理が実装されているrequestSplashAppOpenAd(callbacks, addInDefaultDelay)を呼び出すだけでも利用できます。
バナー広告
AdsManager.loadBanner(context, placeholder, object : BannerCallback() {
override fun onBannerLoaded() { }
override fun onBannerFailedToLoad() { }
override fun onBannerClicked() { }
override fun onBannerShown() { }
override fun onBannerSizeChanged(bannerSizes: BannerSizes) { }
override fun setBannerSize(width: Double, height: Double) { }
})
// layout is a FrameLayout (BannerContainer) you've placed in your screen
AdsManager.showBanner(activity, layout, placeholder, callback)BannerSizes:BANNER (320×50)、LARGE_BANNER (320×100)、MEDIUM_RECTANGLE (300×250)、FULL_BANNER (468×60)。
ネイティブ広告
AdsManager.loadNative(activity, placeholder, isShowInScrollView = false, object : NativeCallback() {
override fun onNativeLoaded() { }
override fun onNativeFailedToLoad() { }
override fun onNativeClicked() { }
override fun onNativeShown() { }
})
// frameLayout is the BannerContainer that will host the native ad view; res is an
// optional custom native-ad layout resource (pass null to use AKS's default layout)
AdsManager.showNative(activity, frameLayout, placeholder, isShowInScrollView = false, res = null, callback)
// Show the native ad using the design you created for this placeholder in the
// AKS portal, instead of a layout resource — see below.
AdsManager.showTemplatedNative(activity, frameLayout, placeholder, isShowInScrollView = false, callback)showTemplatedNative は、アプリのコードではなくAKS ポータル上でネイティブ広告のデザインを作成し、割り当てたプレースホルダー向けのメソッドです。アプリ側からレイアウトを指定しないため、res パラメーターはありません。AKS は、このプレースホルダーに適用されるポータルのテンプレートを特定して取得し(初回取得後はキャッシュ)、showNative と同じ読み込み/表示パイプラインを通じて、そのテンプレートでネイティブ広告を描画します。プレースホルダーにテンプレートが割り当てられていない場合や、取得できない場合も、広告表示を失敗させるのではなく、AKS 組み込みのデフォルトのネイティブ広告デザインにフォールバックします。そのため、ポータル側でテンプレートを設定する前でも安全に呼び出せます。
Feature Promotion
Feature Promotion は、まだ解放していないアプリ内機能をユーザーに紹介する、AKS 独自の自社広告フォーマットです。配信に使用されるのは AKS ネットワークのみで、AdMob/MAX などは使用されません。紹介する項目は、AKS ポータルのサーバー側設定でプレースホルダーごとに指定します。
// Optional — exclude features the user already has unlocked from being promoted
AdsManager.setFeaturesAvailable(listOf("premium_theme", "no_ads"))
AdsManager.showFeaturePromotion(activity, placeholder, object : OnFeaturePromotionClicked {
override fun onFeaturePromotionClicked(targetScreen: String) {
// user tapped the promotion — navigate them to targetScreen
}
override fun onFailToShowFeaturePromotion(errorMessage: String) { }
})ペイウォール
ペイウォールは、Feature Promotion と同様に AKS 自身がホストするもう一つのフォーマットです。ペイウォールのデザイン、文言、料金表示のレイアウト、プランはすべて、AKS ポータルの PAYWALLS 広告フォーマットに対してサーバー側で設定します。AKS が画面を描画し、購入フロー全体(料金表示、プラン選択、Google Play / Amazon での実際の購入、アプリへの結果通知)を処理します。課金 API を直接呼び出す必要も、表示用に独自の画面へ遷移する必要もありません。AKS は、渡された activity 上にオーバーレイとして表示します。
// Preload — call ahead of time (e.g. in onCreate) so the paywall is ready to show instantly
// later. Resolves against "{placeholder}_LOAD" in the AKS portal config, NOT the bare
// placeholder — see the note below.
PaywallManager.loadPaywall(placeholder, object : PaywallCallback() {
override fun onLoaded(paywallId: String) { }
override fun onFailedToLoad(reason: String) { }
override fun onReadyToShow(paywallId: String) { } // not used on this path
override fun onFailedToShow(reason: String) { } // not used on this path
}, languageCode)
// Show — presents the paywall on `activity`. If it wasn't already loaded, this loads it
// first and shows it as soon as it's ready, same combined load-then-show convenience as
// loadAndShowInterstitialAd. Resolves against the BARE placeholder (no "_LOAD" suffix).
PaywallManager.showPaywall(PlatformActivity(activity), placeholder, object : PaywallCallback() {
override fun onLoaded(paywallId: String) { }
override fun onFailedToLoad(reason: String) { }
override fun onReadyToShow(paywallId: String) { } // paywall is now on screen
override fun onFailedToShow(reason: String) { } // not eligible, or failed to load
override fun onPurchaseCompleted(result: PaywallPurchaseResult) {
// result.sku, result.product (matched from the paywall's own catalog, nullable),
// result.purchaseToken, result.purchaseTimeUtc — grant whatever entitlement this sku
// unlocks, e.g.:
AppsKitSDK.setRemoveAdsStatus(true)
}
override fun onPurchaseFailed(message: String) { }
override fun onDismissed() { }
override fun onRestoreCompleted(results: List<PaywallPurchaseResult>) {
// fired if the user tapped the presented paywall's own "Restore" action
}
}, languageCode)
loadPaywallとshowPaywallは、同じplaceholder文字列に対して、ポータル上の異なるプレースメント設定を参照します。loadPaywallは"{placeholder}_LOAD"を検索します。これは、インタースティシャル広告が内部で使用する、プリロード用の_LOADサフィックス規則と同じです。一方、showPaywall(およびその表示条件チェック)は、サフィックスなしのplaceholderを参照します。プリロードは任意です。プリロードされていなければ、showPaywallが必要に応じて読み込みます。ただし、プリロードする場合は、AKS ポータルで両方のエントリを設定してください。それぞれに異なるペイウォールのデザインを指定できるためです。
PaywallCallbackでabstractなのはonLoaded/onFailedToLoad/onReadyToShow/onFailedToShowのみです。onPurchaseCompleted/onPurchaseFailed/onDismissed/onRestoreCompletedは、デフォルトでは何も処理しないopenメソッドなので、読み込みのみを行う呼び出しではオーバーライドする必要はありません。
languageCode は任意です。指定するとバックエンドに渡され、ペイウォールのデザインや文言のローカライズに使用されます。
購入の復元
アプリ独自の「購入を復元」行/ボタンから呼び出せる、独立したエントリーポイントです。ペイウォールが現在表示されているかどうかに関係なく使用できます。
PaywallManager.restorePurchases(
PlatformContext(context),
PlatformActivity(activity),
null, // storeType — null resolves to whatever AppsKitSDKApplication.setPlatform() declared
object : PaywallResultCallback {
override fun onPurchaseCompleted(result: PaywallPurchaseResult) { } // not invoked on this path
override fun onPurchaseFailed(message: String) { } // not invoked on this path
override fun onRestoreCompleted(results: List<PaywallPurchaseResult>) {
// empty list = nothing to restore; otherwise sync your entitlement from each sku
}
}
)restorePurchases が呼び出すのは onRestoreCompleted のみです。PaywallResultCallback にほかの 2 つのメンバーがあるのは、同じインターフェースが、表示中のペイウォール画面からの購入結果通知にも内部で使用されているためです(実際に通知を受け取る箇所については、上記の showPaywall の onPurchaseCompleted/onPurchaseFailed を参照してください)。
結果に基づく利用権限の更新
onPurchaseCompleted も onRestoreCompleted も、それ自体ではアプリの状態を変更しません。AKS は処理結果を通知し、その結果によって何を解放するかはアプリ側で決定します。
private fun syncEntitlementFrom(results: List<PaywallPurchaseResult>) {
val hasRemoveAds = results.any { it.sku in YOUR_REMOVE_ADS_SKUS }
AppsKitSDK.setRemoveAdsStatus(hasRemoveAds)
// drive your own subscription/Pro flag the same way, from YOUR_SUBSCRIPTION_SKUS
}復元では、AKS の結果を正しい状態を判断する基準として扱ってください。results に含まれない SKU は、ユーザーが現在保有していないことを意味します。そのため、含まれる SKU の利用権限を付与するだけでなく、含まれない SKU に対応する利用権限も解除してください。そうしないと、サブスクリプションが失効したユーザーが復元を行った際に、利用権限が無期限に残ってしまいます。一方、単一の購入の完了は、その購入に対応する利用権限を付与すべきことを示します。その権限を付与し、ほかの利用権限の状態は変更しないでください。