创建自定义适配器
如果您想支持未在 AppLovin MAX Mediation Matrix 中列出的广告平台,您可以编写自定义适配器。 以下说明将向您展示如何执行此操作。
Android
实现 com.applovin.mediation.adapters.MediationAdapterBase
的子类。
此子类启用聚合适配器与 AppLovin MAX SDK 之间的界面。
该界面处理 SDK 的各种函数,包括初始化、版本管理和资源清理。
- 在您的应用程序的
com.applovin.mediation.adapters
包中创建MediationAdapterBase
的子类。 此类的名称应包含平台名称 (例如,com.mycompanyname.MyNetworkMediationAdapter
)。 - 重写
initialize(final MaxAdapterInitializationParameters parameters, final Activity activity, final OnCompletionListener onCompletionListener)
方法。 实现初始化广告平台 SDK 的代码。 如果您需要访问在 UI 中设置的 app ID,可以通过parameters.getServerParameters().getString( "app_id", null );
进行访问。 此逻辑与 AppLovin SDK 的初始化并行执行。 在初始化广告平台后调用onCompletionListener.onCompletion()
,并向该完成处理程序传递以下值之一:- 当广告平台 SDK 初始化时:
InitializationStatus.INITIALIZING
- 如果广告平台 SDK 初始化成功:
InitializationStatus.INITIALIZED_SUCCESS
- 如果广告平台 SDK 初始化失败:
InitializationStatus.INITIALIZED_FAILURE
(带有相关错误信息) - 如果广告平台 SDK 没有初始化回传状态:
InitializationStatus.DOES_NOT_APPLY
- 如果广告平台已明确初始化,但没有状态:
InitializationStatus.INITIALIZED_UNKNOWN
- 当广告平台 SDK 初始化时:
- 重写
getSdkVersion()
方法。 实现从该方法返回平台 SDK 版本字符串的代码。 - 重写
getAdapterVersion()
方法。 实现从该方法返回聚合适配器版本号的代码。 AppLovin 的全部适配器都使用五位数版本管理方案:最左边的四个数字对应平台 SDK 版本。 最后一个数字表示次要版本号,它指的是适配器版本。 - 重写
onDestroy()
方法。 实现该方法中平台 SDK 对象的清理逻辑。
横幅广告
- 在
com.mycompanyname.MyNetworkMediationAdapter
类中实现MaxAdViewAdapter
界面。 - 重写请求广告的
loadAdViewAd()
方法。 调用parameters.getThirdPartyAdPlacementId()
方法以获取广告逻辑所需的 Placement ID。 - 调用适当的
MaxAdViewAdapterListener
方法。 它们向 AppLovin MAX SDK 发出关于横幅生命周期事件的通知:- 广告成功加载后,调用
MaxAdViewAdapterListener.onAdViewAdLoaded()
。 - 当广告加载失败时,使用适当的
MaxAdapterError
调用MaxAdViewAdapterListener.onAdViewAdLoadFailed()
。 - 还可以酌情调用以下横幅生命周期事件通知:
onAdViewAdClicked()
、onAdViewAdCollapsed()
、onAdViewAdDisplayed()
、onAdViewAdDisplayFailed()
、onAdViewAdExpanded()
、onAdViewAdHidden()
。
- 广告成功加载后,调用
插屏
- 在
com.mycompanyname.MyNetworkMediationAdapter
类中实现MaxInterstitialAdapter
界面。 - 重写请求广告的
loadInterstitialAd()
方法。 调用parameters.getThirdPartyAdPlacementId()
方法以获取广告逻辑所需的 Placement ID。 - 重写显示已加载广告的
showInterstitialAd()
方法。 调用parameters.getThirdPartyAdPlacementId()
方法以获取广告逻辑所需的 Placement ID。如果广告尚未准备就绪,则调用MaxInterstitialAdapterListener.onInterstitialAdDisplayFailed( MaxAdapterError.AD_NOT_READY )
。 - 调用适当的
MaxInterstitialAdapterListener
方法。 它们向 AppLovin MAX SDK 发出关于插屏生命周期事件的通知:- 广告成功加载后,调用
MaxInterstitialAdapterListener.onInterstitialAdLoaded()
。 - 当广告加载失败时,使用适当的
MaxAdapterError
调用MaxInterstitialAdapterListener.onInterstitialAdLoadFailed()
。 - 当广告被隐藏时,调用
MaxInterstitialAdapterListener.onInterstitialAdHidden()
。 - 还可以酌情调用以下插屏生命周期事件通知:
onInterstitialAdClicked()
、onInterstitialAdDisplayFailed()
。
- 广告成功加载后,调用
激励广告
- 在
com.mycompanyname.MyNetworkMediationAdapter
类中实现MaxRewardedAdapter
界面。 - 重写请求广告的
loadRewardedAd()
方法。 调用parameters.getThirdPartyAdPlacementId()
方法以获取广告逻辑所需的 Placement ID。 - 重写显示已加载广告的
showRewardedAd()
方法。 调用parameters.getThirdPartyAdPlacementId()
方法以获取广告逻辑所需的 Placement ID。如果广告尚未准备就绪,则调用MaxRewardedAdapterListener.onRewardedAdDisplayFailed( MaxAdapterError.AD_NOT_READY )
。 - 调用适当的
MaxRewardedAdapterListener
方法。 它们向 AppLovin MAX SDK 发出关于激励视频生命周期事件的通知:- 广告成功加载后,调用
MaxRewardedAdapterListener.onRewardedAdLoaded()
。 - 当广告加载失败时,使用适当的
MaxAdapterError
调用MaxRewardedAdapterListener.onRewardedAdLoadFailed()
。 - 当广告开始播放时,调用
MaxRewardedAdapterListener.onRewardedAdDisplayed()
。 - 如果应该向用户提供奖励,使用适当的
MaxReward
金额和货币调用MaxRewardedAdapterListener.onUserRewarded()
。 如果没有可用金额,则默认为MaxReward.DEFAULT_AMOUNT
。 AppLovin 建议您在MaxRewardedAdapterListener.onRewardedAdHidden()
之前立即调用此项。 - 当广告被隐藏时,调用
MaxRewardedAdapterListener.onRewardedAdHidden()
。 - 还可以酌情调用以下激励视频生命周期事件通知:
onRewardedAdClicked()
。
- 广告成功加载后,调用
原生广告
- 在
com.mycompanyname.MyNetworkMediationAdapter
类中实现MaxNativeAdAdapter
界面。 - 重写请求广告的
loadNativeAd()
方法。 - 调用适当的
MaxNativeAdAdapterListener
方法。 它们向 AppLovin MAX SDK 发出关于原生广告生命周期事件的通知:- 广告成功加载后,调用
MaxNativeAdAdapterListener.onNativeAdLoaded()
。 - 当广告加载失败时,使用适当的
MaxAdapterError
调用MaxNativeAdAdapterListener.onNativeAdLoadFailed()
。 - 当广告展示时,调用
MaxNativeAdAdapterListener.onNativeAdDisplayed()
。 - 当用户点击广告时,调用
MaxNativeAdAdapterListener.onNativeAdClicked()
。
- 广告成功加载后,调用
隐私
MAX 提供两个布尔标记,用于指示用户是否提供隐私许可。
它们是 Boolean
对象。
如果用户未表示许可或不同意,则其值为 null
。
将 parameters
对象传递到每个方法中。
要获取隐私标记的值,请使用 parameters
对象的以下方法:
MaxAdapterParameters.hasUserConsent()
- 用于 GDPR 许可标记。 要确定 GDPR 是否适用于用户,请阅读 SDK 集成指南 > 平台 > 概览 > 隐私页面。
MaxAdapterParameters.isDoNotSell()
- 用于多州定向广告许可标记。 AppLovin 没有 API 来指示用户是否属于适用的地区。
iOS
实现 ALMediationAdapter
的子类。
此子类启用聚合适配器与 AppLovin MAX SDK 之间的界面。
该界面处理 SDK 的各种函数,包括初始化、版本管理和资源清理。
- 在您的项目中创建一个从
ALMediationAdapter
扩展的.m
和.h
。 此类的名称应包含平台名称 (例如,MyNetworkMediationAdapter
)。 - 实现
- (void)initializeWithParameters:(id<MAAdapterInitializationParameters>)parameters completionHandler:(void (^)(MAAdapterInitializationStatus NSString *_Nullable))completionHandler
方法 实现用于初始化广告平台 SDK 的代码。 如果您需要访问 UI 中设置的 app ID,可以通过parameters.serverParameters[@"app_id"]
方法来实现。 此逻辑与 AppLovin SDK 的初始化并行执行。 初始化广告平台后调用completionHandler
,并向该处理程序传递以下值之一:- 当广告平台 SDK 初始化时:
MAAdapterInitializationStatusInitializing
- 如果广告平台 SDK 初始化成功:
MAAdapterInitializationStatusInitializedSuccess
- 如果广告平台 SDK 初始化失败:
MAAdapterInitializationStatusInitializedFailure
(带有相关错误信息) - 如果广告平台 SDK 没有初始化回传状态:
MAAdapterInitializationStatusDoesNotApply
(错误信息为null
) - 如果广告平台已明确初始化,但没有状态:
MAAdapterInitializationStatusInitializedUnknown
- 当广告平台 SDK 初始化时:
- 实现
- (NSString *)SDKVersion
方法。 实现从该方法返回平台 SDK 版本字符串的代码。 - 实现
- (NSString *)adapterVersion
方法。 实现从该方法返回聚合适配器版本号的代码。 AppLovin 的全部适配器都使用五位数版本管理方案:最左边的四个数字对应平台 SDK 版本。 最后一个数字表示次要版本号,它指的是适配器版本。 - 实现
- (void)destroy
方法。 实现该方法中平台 SDK 对象的清理逻辑。
横幅广告
- 在
MyNetworkMediationAdapter
类中实现MAAdViewAdapter
协议。 - 实现请求广告的
- (void)loadAdViewAdForParameters:(id<MAAdapterResponseParameters>)parameters adFormat:(MAAdFormat *)adFormat andNotify:(id<MAAdViewAdapterDelegate>)delegate
方法。 调用parameters.thirdPartyAdPlacementIdentifier
方法以获取广告逻辑所需的 Placement ID。 - 调用适当的
MAAdViewAdapterDelegate
方法。 它们向 AppLovin MAX SDK 发出关于横幅生命周期事件的通知:- 广告成功加载后,调用
-[MAAdViewAdapterDelegate didLoadAdForAdView]
。 - 当广告加载失败时,使用适当的
MAAdapterError
调用-[MAAdViewAdapterDelegate didFailToLoadAdViewAdWithError:]
。 - 还可以酌情调用以下横幅生命周期事件通知:
didClickAdViewAd
、didCollapseAdViewAd
、didDisplayAdViewAd
、didExpandAdViewAd
、didFailToDisplayAdViewAdWithError
、didHideAdViewAd
。
- 广告成功加载后,调用
插屏
- 在
MyNetworkMediationAdapter
类中实现MAInterstitialAdapter
协议。 - 声明请求广告的
- (void)loadInterstitialAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MAInterstitialAdapterDelegate>)delegate
方法。 调用parameters.thirdPartyAdPlacementIdentifier
方法以获取广告逻辑所需的 Placement ID。 - 声明显示已加载广告的
- (void)showInterstitialAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MAInterstitialAdapterDelegate>)delegate
方法。 调用parameters.thirdPartyAdPlacementIdentifier
方法以获取广告逻辑所需的 Placement ID。 如果广告尚未准备就绪,则调用-[MAInterstitialAdapterDelegate didFailToDisplayInterstitialAdWithError: MAAdapterError.adNotReady]
。 - 调用适当的
MAInterstitialAdapterDelegate
方法。 它们向 AppLovin MAX SDK 发出关于插屏生命周期事件的通知:- 广告成功加载后,调用
-[MAInterstitialAdapterDelegate didLoadInterstitialAd:]
。 - 当广告加载失败时,使用适当的
MAAdapterError
调用-[MAInterstitialAdapterDelegate didFailToLoadInterstitialAdWithError:]
。 - 当广告成功展示时,调用
-[MAInterstitialAdapterDelegate didDisplayInterstitialAd]
。 - 当广告被隐藏时,调用
-[MAInterstitialAdapterDelegate didHideInterstitialAd:]
。 - 还可以酌情调用以下插屏生命周期事件通知:
didClickInterstitialAd
、didFailToDisplayInterstitialAdWithError
。
- 广告成功加载后,调用
激励广告
- 在
MyNetworkMediationAdapter
类中实现MARewardedAdapter
协议。 - 声明请求广告的
- (void)loadRewardedAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MARewardedAdapterDelegate>)delegate;
方法。 调用parameters.thirdPartyAdPlacementIdentifier
方法以获取广告逻辑所需的 Placement ID。 - 声明显示已加载广告的
- (void)showRewardedAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MARewardedAdapterDelegate>)delegate;
方法。 调用parameters.thirdPartyAdPlacementIdentifier
方法以获取广告逻辑所需的 Placement ID。 如果广告尚未准备就绪,则调用-[MARewardedAdapterDelegate didFailToDisplayRewardedAdWithError: MAAdapterError.adNotReady]
。 - 调用适当的
MARewardedAdapterDelegate
方法。 它们向 AppLovin MAX SDK 发出关于激励视频生命周期事件的通知:- 广告成功加载后,调用
-[MARewardedAdapterDelegate didLoadRewardedAd:]
。 - 当广告加载失败时,使用适当的
MAAdapterError
调用-[MARewardedAdapterDelegate didFailToLoadRewardedAdWithError:]
。 - 当广告开始播放时,调用
-[MARewardedAdapterDelegate didDisplayRewardedAd:]
。 - 如果应该向用户提供奖励,使用适当的
MAReward
金额和货币调用-[MARewardedAdapterDelegate didRewardUserWithReward:]
。 如果没有可用金额,则默认为MAReward.defaultAmount
。 AppLovin 建议您在-[MARewardedAdapterDelegate didHideRewardedAd:]
之前立即调用此项。 - 当广告被隐藏时,调用
-[MARewardedAdapterDelegate didHideRewardedAd:]
。 - 还可以酌情调用以下激励视频生命周期事件通知:
didClickRewardedAd
。
- 广告成功加载后,调用
原生广告
- 在
MyNetworkMediationAdapter
类中实现MANativeAdAdapter
协议。 - 实现请求广告的
- (void)loadNativeAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MANativeAdAdapterDelegate>)delegate;
方法。 - 调用适当的
MANativeAdAdapterDelegate
方法。 它们向 AppLovin MAX SDK 发出关于原生广告生命周期事件的通知:- 广告成功加载后,调用
-[MANativeAdAdapterDelegate didLoadAdForNativeAd:]
。 - 当广告加载失败时,使用适当的
MAAdapterError
调用-[MANativeAdAdapterDelegate didFailToLoadNativeAdWithError:]
。 - 当广告展示时,调用
-[MANativeAdAdapterDelegate didDisplayNativeAdWithExtraInfo:]
。 - 当用户点击广告时,调用
-[MANativeAdAdapterDelegate didClickNativeAd:]
。
- 广告成功加载后,调用
隐私
MAX 提供两个布尔标记,用于指示用户是否提供隐私许可。
它们是 NSNumber
对象。
如果用户未表示许可或不同意,则其值为 nil
。
将 parameters
对象传递到每个方法中。要获取隐私标记的值,请使用 parameters
对象的以下 API:
-[MAAdapterParameters hasUserConsent]
- 用于 GDPR 许可标记。 要确定 GDPR 是否适用于用户,请阅读 SDK 集成指南 > 平台 > 概览 > 隐私页面。
-[MAAdapterParameters isDoNotSell]
- 用于多州定向广告许可标记。 AppLovin 没有 API 来指示用户是否属于适用的地区。
测试
您可以使用 MAX Demo App 测试自定义适配器(请参阅 SDK 集成指南 > 平台 > 测试平台)。 要想轻松获得广告请求,请提高瀑布流中广告位的 CPM。
故障排查
如果您的自定义适配器未如预期包含在瀑布流中,请使用以下故障排查检查清单:
- 禁用 Test Mode (测试模式)(参见 SDK 集成指南 > 平台 > 测试平台 > Test Mode)
- 确保应用包名、广告单元和 SDK Key 均匹配。
- 使用实体设备进行测试。
- 将自定义平台的 CPM 设置得足够高,使其在瀑布流中有很高的获胜几率。