6. استدعاء تنسيقات الإعلانات
يتطلب كل استدعاء إعلان معرّف موضع إعلان (placeholder) — وهو مفتاح نصي يُربط بتنسيق إعلان في بوابة AKS (مثل "1"). يحدد AKS وقت التشغيل شبكة الإعلانات الأساسية وقائمة الشبكات البديلة المرتبطة بهذا المعرّف؛ ولا تحتاج أبدًا إلى الإشارة إلى معرّف وحدة إعلانية مباشرةً في الكود.
الإعلانات البينية
// 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) بدلًا من إدارة إعلانات فتح التطبيق بنفسك، فاستخدمloadDefaultAppOpen/showDefaultAppOpenفي الفئة الفرعية التي ترث منAppsKitSDKApplication— أو استدعِ ببساطةrequestSplashAppOpenAd(callbacks, addInDefaultDelay)، التي توفر الفئة الأساسيةApplicationتنفيذًا كاملًا لها.
إعلانات البانر
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 تصميمه الافتراضي المدمج للإعلانات المدمجة مع المحتوى بدلًا من إفشال الإعلان — لذا يمكن استدعاء هذه الطريقة بأمان دائمًا، حتى قبل إعداد قالب في البوابة.
الترويج للميزات
الترويج للميزات هو تنسيق إعلانات ذاتية خاص بـ 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) { }
})شاشة الدفع
شاشة الدفع هي التنسيق الآخر الذي يستضيفه AKS داخليًا (مثل الترويج للميزات) — إذ تُضبط جميع عناصرها، من التصميم والنصوص وتخطيط الأسعار والخطط، من جانب الخادم في بوابة AKS ضمن تنسيق الإعلانات PAYWALLS. ويتولى AKS عرض الشاشة وإدارة عملية الشراء بالكامل (الأسعار، واختيار الخطة، والشراء الفعلي عبر Google Play / Amazon، وإبلاغك بالنتيجة). لا تحتاج أبدًا إلى استدعاء واجهة برمجة تطبيقات للفوترة مباشرةً، ولا إلى الانتقال إلى شاشة خاصة بك لعرضها — إذ يعرضها 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، إذ يمكن أن يشير كل منهما إلى تصميم مختلف لشاشة الدفع.وحدها
onLoaded/onFailedToLoad/onReadyToShow/onFailedToShowمُعرَّفة بصفتهاabstractفيPaywallCallback— أما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 فموجودان لأن الواجهة نفسها تُستخدم داخليًا أيضًا للإبلاغ عن عمليات الشراء من شاشة دفع معروضة (راجع onPurchaseCompleted/onPurchaseFailed ضمن showPaywall أعلاه، فهناك يُستدعيان فعليًا).
إدارة استحقاقات الوصول بناءً على النتيجة
لا تُغيّر 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 المرجع المعتمد: غياب معرّف منتج (sku) عن results يعني أن المستخدم لا يملكه حاليًا، لذا ألغِ استحقاق الوصول المقابل له أيضًا، ولا تكتفِ بمنح الاستحقاقات الموجودة — وإلا فسيحتفظ المشترك الذي انتهى اشتراكه بالاستحقاق إلى الأبد عند استعادة مشترياته. أما عملية شراء واحدة مكتملة، فهي بحد ذاتها تأكيد على استحقاق المستخدم — فامنحه هذا الاستحقاق واترك حالة أي استحقاقات أخرى دون تغيير.