跳转到内容

创建自定义适配器

如果您想支持未在 AppLovin MAX Mediation Matrix 中列出的广告平台,您可以编写自定义适配器。 以下说明将向您展示如何执行此操作。

Android

实现 com.applovin.mediation.adapters.MediationAdapterBase 的子类。 此子类启用聚合适配器与 AppLovin MAX SDK 之间的界面。 该界面处理 SDK 的各种函数,包括初始化、版本管理和资源清理。

  1. 在您的应用程序的 com.applovin.mediation.adapters 包中创建 MediationAdapterBase 的子类。 此类的名称应包含平台名称 (例如,com.mycompanyname.MyNetworkMediationAdapter)。
  2. 重写 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
  3. 重写 getSdkVersion() 方法。 实现从该方法返回平台 SDK 版本字符串的代码。
  4. 重写 getAdapterVersion() 方法。 实现从该方法返回聚合适配器版本号的代码。 AppLovin 的全部适配器都使用五位数版本管理方案:最左边的四个数字对应平台 SDK 版本。 最后一个数字表示次要版本号,它指的是适配器版本。
  5. 重写 onDestroy() 方法。 实现该方法中平台 SDK 对象的清理逻辑。

横幅广告

  1. com.mycompanyname.MyNetworkMediationAdapter 类中实现 MaxAdViewAdapter 界面。
  2. 重写请求广告的 loadAdViewAd() 方法。 调用 parameters.getThirdPartyAdPlacementId() 方法以获取广告逻辑所需的 Placement ID。
  3. 调用适当的 MaxAdViewAdapterListener 方法。 它们向 AppLovin MAX SDK 发出关于横幅生命周期事件的通知:
    • 广告成功加载后,调用 MaxAdViewAdapterListener.onAdViewAdLoaded()
    • 当广告加载失败时,使用适当的 MaxAdapterError 调用 MaxAdViewAdapterListener.onAdViewAdLoadFailed()
    • 还可以酌情调用以下横幅生命周期事件通知:onAdViewAdClicked()onAdViewAdCollapsed()onAdViewAdDisplayed()onAdViewAdDisplayFailed()onAdViewAdExpanded()onAdViewAdHidden()

插屏

  1. com.mycompanyname.MyNetworkMediationAdapter 类中实现 MaxInterstitialAdapter 界面。
  2. 重写请求广告的 loadInterstitialAd() 方法。 调用 parameters.getThirdPartyAdPlacementId() 方法以获取广告逻辑所需的 Placement ID。
  3. 重写显示已加载广告的 showInterstitialAd() 方法。 调用 parameters.getThirdPartyAdPlacementId() 方法以获取广告逻辑所需的 Placement ID。如果广告尚未准备就绪,则调用 MaxInterstitialAdapterListener.onInterstitialAdDisplayFailed( MaxAdapterError.AD_NOT_READY )
  4. 调用适当的 MaxInterstitialAdapterListener 方法。 它们向 AppLovin MAX SDK 发出关于插屏生命周期事件的通知:
    • 广告成功加载后,调用 MaxInterstitialAdapterListener.onInterstitialAdLoaded()
    • 当广告加载失败时,使用适当的 MaxAdapterError 调用 MaxInterstitialAdapterListener.onInterstitialAdLoadFailed()
    • 当广告被隐藏时,调用 MaxInterstitialAdapterListener.onInterstitialAdHidden()
    • 还可以酌情调用以下插屏生命周期事件通知:onInterstitialAdClicked()onInterstitialAdDisplayFailed()

激励广告

  1. com.mycompanyname.MyNetworkMediationAdapter 类中实现 MaxRewardedAdapter 界面。
  2. 重写请求广告的 loadRewardedAd() 方法。 调用 parameters.getThirdPartyAdPlacementId() 方法以获取广告逻辑所需的 Placement ID。
  3. 重写显示已加载广告的 showRewardedAd() 方法。 调用 parameters.getThirdPartyAdPlacementId() 方法以获取广告逻辑所需的 Placement ID。如果广告尚未准备就绪,则调用 MaxRewardedAdapterListener.onRewardedAdDisplayFailed( MaxAdapterError.AD_NOT_READY )
  4. 调用适当的 MaxRewardedAdapterListener 方法。 它们向 AppLovin MAX SDK 发出关于激励视频生命周期事件的通知:
    • 广告成功加载后,调用 MaxRewardedAdapterListener.onRewardedAdLoaded()
    • 当广告加载失败时,使用适当的 MaxAdapterError 调用 MaxRewardedAdapterListener.onRewardedAdLoadFailed()
    • 当广告开始播放时,调用 MaxRewardedAdapterListener.onRewardedAdDisplayed()
    • 如果应该向用户提供奖励,使用适当的 MaxReward 金额和货币调用 MaxRewardedAdapterListener.onUserRewarded()。 如果没有可用金额,则默认为 MaxReward.DEFAULT_AMOUNT。 AppLovin 建议您在 MaxRewardedAdapterListener.onRewardedAdHidden() 之前立即调用此项。
    • 当广告被隐藏时,调用 MaxRewardedAdapterListener.onRewardedAdHidden()
    • 还可以酌情调用以下激励视频生命周期事件通知:onRewardedAdClicked()

原生广告

  1. com.mycompanyname.MyNetworkMediationAdapter 类中实现 MaxNativeAdAdapter 界面。
  2. 重写请求广告的 loadNativeAd() 方法。
  3. 调用适当的 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 的各种函数,包括初始化、版本管理和资源清理。

  1. 在您的项目中创建一个从 ALMediationAdapter 扩展的 .m.h。 此类的名称应包含平台名称 (例如,MyNetworkMediationAdapter)。
  2. 实现 - (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
  3. 实现 - (NSString *)SDKVersion 方法。 实现从该方法返回平台 SDK 版本字符串的代码。
  4. 实现 - (NSString *)adapterVersion 方法。 实现从该方法返回聚合适配器版本号的代码。 AppLovin 的全部适配器都使用五位数版本管理方案:最左边的四个数字对应平台 SDK 版本。 最后一个数字表示次要版本号,它指的是适配器版本。
  5. 实现 - (void)destroy 方法。 实现该方法中平台 SDK 对象的清理逻辑。

横幅广告

  1. MyNetworkMediationAdapter 类中实现 MAAdViewAdapter 协议。
  2. 实现请求广告的 - (void)loadAdViewAdForParameters:(id<MAAdapterResponseParameters>)parameters adFormat:(MAAdFormat *)adFormat andNotify:(id<MAAdViewAdapterDelegate>)delegate 方法。 调用 parameters.thirdPartyAdPlacementIdentifier 方法以获取广告逻辑所需的 Placement ID。
  3. 调用适当的 MAAdViewAdapterDelegate 方法。 它们向 AppLovin MAX SDK 发出关于横幅生命周期事件的通知:
    • 广告成功加载后,调用 -[MAAdViewAdapterDelegate didLoadAdForAdView]
    • 当广告加载失败时,使用适当的 MAAdapterError 调用 -[MAAdViewAdapterDelegate didFailToLoadAdViewAdWithError:]
    • 还可以酌情调用以下横幅生命周期事件通知:didClickAdViewAddidCollapseAdViewAddidDisplayAdViewAddidExpandAdViewAddidFailToDisplayAdViewAdWithErrordidHideAdViewAd

插屏

  1. MyNetworkMediationAdapter 类中实现 MAInterstitialAdapter 协议。
  2. 声明请求广告的 - (void)loadInterstitialAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MAInterstitialAdapterDelegate>)delegate 方法。 调用 parameters.thirdPartyAdPlacementIdentifier 方法以获取广告逻辑所需的 Placement ID。
  3. 声明显示已加载广告的 - (void)showInterstitialAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MAInterstitialAdapterDelegate>)delegate 方法。 调用 parameters.thirdPartyAdPlacementIdentifier 方法以获取广告逻辑所需的 Placement ID。 如果广告尚未准备就绪,则调用 -[MAInterstitialAdapterDelegate didFailToDisplayInterstitialAdWithError: MAAdapterError.adNotReady]
  4. 调用适当的 MAInterstitialAdapterDelegate 方法。 它们向 AppLovin MAX SDK 发出关于插屏生命周期事件的通知:
    • 广告成功加载后,调用 -[MAInterstitialAdapterDelegate didLoadInterstitialAd:]
    • 当广告加载失败时,使用适当的 MAAdapterError 调用 -[MAInterstitialAdapterDelegate didFailToLoadInterstitialAdWithError:]
    • 当广告成功展示时,调用 -[MAInterstitialAdapterDelegate didDisplayInterstitialAd]
    • 当广告被隐藏时,调用 -[MAInterstitialAdapterDelegate didHideInterstitialAd:]
    • 还可以酌情调用以下插屏生命周期事件通知:didClickInterstitialAddidFailToDisplayInterstitialAdWithError

激励广告

  1. MyNetworkMediationAdapter 类中实现 MARewardedAdapter 协议。
  2. 声明请求广告的 - (void)loadRewardedAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MARewardedAdapterDelegate>)delegate; 方法。 调用 parameters.thirdPartyAdPlacementIdentifier 方法以获取广告逻辑所需的 Placement ID。
  3. 声明显示已加载广告的 - (void)showRewardedAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MARewardedAdapterDelegate>)delegate; 方法。 调用 parameters.thirdPartyAdPlacementIdentifier 方法以获取广告逻辑所需的 Placement ID。 如果广告尚未准备就绪,则调用 -[MARewardedAdapterDelegate didFailToDisplayRewardedAdWithError: MAAdapterError.adNotReady]
  4. 调用适当的 MARewardedAdapterDelegate 方法。 它们向 AppLovin MAX SDK 发出关于激励视频生命周期事件的通知:
    • 广告成功加载后,调用 -[MARewardedAdapterDelegate didLoadRewardedAd:]
    • 当广告加载失败时,使用适当的 MAAdapterError 调用 -[MARewardedAdapterDelegate didFailToLoadRewardedAdWithError:]
    • 当广告开始播放时,调用 -[MARewardedAdapterDelegate didDisplayRewardedAd:]
    • 如果应该向用户提供奖励,使用适当的 MAReward 金额和货币调用 -[MARewardedAdapterDelegate didRewardUserWithReward:]。 如果没有可用金额,则默认为 MAReward.defaultAmount。 AppLovin 建议您在 -[MARewardedAdapterDelegate didHideRewardedAd:] 之前立即调用此项。
    • 当广告被隐藏时,调用 -[MARewardedAdapterDelegate didHideRewardedAd:]
    • 还可以酌情调用以下激励视频生命周期事件通知:didClickRewardedAd

原生广告

  1. MyNetworkMediationAdapter 类中实现 MANativeAdAdapter 协议。
  2. 实现请求广告的 - (void)loadNativeAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MANativeAdAdapterDelegate>)delegate; 方法。
  3. 调用适当的 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。

故障排查

如果您的自定义适配器未如预期包含在瀑布流中,请使用以下故障排查检查清单:

  1. 禁用 Test Mode (测试模式)(参见 SDK 集成指南 > 平台 > 测试平台 > Test Mode)
  2. 确保应用包名、广告单元和 SDK Key 均匹配。
  3. 使用实体设备进行测试。
  4. 将自定义平台的 CPM 设置得足够高,使其在瀑布流中有很高的获胜几率。