您可以为每个广告单元设置广告位名称 (例如 "Rewarded VideoLevels"、"INTER_levelEnd" 或 "RewardedVideoCoinStore")。 这可以帮助您汇总不同广告位类别的统计数据。 下面的片段展示了如何为不同的广告格式设置广告位名称。
对于横幅和 MREC,您必须在加载横幅或 MREC 之前设置广告位名称。
adView.placement = @"«placement»";
[adView loadAd];
adView.placement = "«placement»"
adView.loadAd()
[interstitialAd showAdForPlacement: @"«placement»"];
interstitial.show(forPlacement: "«placement»")
[rewardedAd showAdForPlacement: @"«placement»"];
rewardedAd.show(forPlacement: "«placement»")
nativeAdLoader.placement = @"«placement»";
nativeAdLoader.placement = "«placement»"
MAAdPlacerSettings *settings = [MAAdPlacerSettings settingsWithAdUnitIdentifier: @"«ad-unit-ID»"];
settings.placement = @"«placement»";
let settings = MAAdPlacerSettings(adUnitIdentifier: "«ad-unit-ID»")
settings.placement = "«placement»"
您可以在启动应用时将某些聚合 SDK 平台的音频设为静音。 通过 AppLovin SDK 支持此功能的平台如下:
对于其他平台,请咨询平台客户团队,了解此功能是否可用以及如何访问。
下面的代码片段展示了如何在支持静音的平台中设置静音:
ALSdk *sdk = [ALSdk shared];
sdk.settings.muted = YES; // to mute
sdk.settings.muted = NO; // to unmute
let sdk = ALSdk.shared()
sdk.settings.isMuted = true /// to mute
sdk.settings.isMuted = false /// to unmute
在加载广告之前设置静音状态。 有些平台 (如 Google 竞价和 Google AdMob) 会基于广告加载前的静音状态返回静音或未静音的视频。
注意:静音广告可能会导致广告收入下降。
启用详细日志的方法有两种:
您可以在 SDK 设置对象中,将标记 isVerboseLoggingEnabled 设置为 YES,以启用详细日志。
[ALSdk shared].settings.verboseLoggingEnabled = YES;
ALSdk.shared().settings.isVerboseLoggingEnabled = true
您还可以在应用的 Info.plist 中,将 AppLovinVerboseLoggingOn 设置为 YES,以启用详细日志。

要验证是否已成功启用详细日志,请查看 AppLovin SDK 日志初始化部分中是否有 Verbose Logging On: true 行。
AppLovin SDK
Version: 12.4.2
⋮
Verbose Logging On: true
⋮
AppLovin SDK 的日志标签为 “/AppLovinSdk: [AppLovinSdk]”。
您可以调取各个聚合平台已展示广告的 Creative ID 和平台名称。 请参阅 Creative Debugger 文档 了解更多信息。
您可以使用如下代码,调取 AppLovin Exchange 投放的 MAX 广告的 DSP 名称:
- (void)didLoadAd:(MAAd *)ad
{
NSLog(@"AppLovin Exchange DSP name: %@", ad.DSPName);
}
func didLoad(_ ad: MAAd)
{
print("AppLovin Exchange DSP name: (ad.dspName?)")
}
您可以在客户端获取展示层级的用户收入数据。 您可以使用这些数据来对比不同的渠道和推广活动。 您也可以通过使用 MAX User Revenue API 来获取这些数据。 希望获取此数据的 MMP 应参阅 MMP 展示层级 User Revenue API 页面。
您可以针对所有受支持的平台与 Adjust 等移动监测合作伙伴分享展示层级广告收入数据。
您可以在所有广告生命周期回调中检索收入金额。 以下示例展示了如何在 “ad revenue paid” 回调中执行此操作:
- (void)didPayRevenueForAd:(MAAd *)ad
{
double revenue = ad.revenue; // In USD
// Miscellaneous data
NSString *countryCode = [ALSdk shared].configuration.countryCode; // "US" for the United States, etc - Note: Do not confuse this with currency code which is "USD"
NSString *networkName = ad.networkName; // Display name of the network that showed the ad
NSString *adUnitId = ad.adUnitIdentifier; // The MAX Ad Unit ID
MAAdFormat *adFormat = ad.format; // The ad format of the ad (e.g. BANNER, MREC, INTERSTITIAL, REWARDED)
NSString *placement = ad.placement; // The placement this ad's postbacks are tied to
NSString *networkPlacement = ad.networkPlacement; // The placement ID from the network that showed the ad
}
func didPayRevenue(_ ad: MAAd)
{
let revenue = ad.revenue // In USD
// Miscellaneous data
let countryCode = ALSdk.shared().configuration.countryCode // "US" for the United States, etc - Note: Do not confuse this with currency code which is "USD"
let networkName = ad.networkName // Display name of the network that showed the ad
let adUnitId = ad.adUnitIdentifier // The MAX Ad Unit ID
let adFormat = ad.format // The ad format of the ad (e.g. BANNER, MREC, INTERSTITIAL, REWARDED)
let placement = ad.placement // The placement this ad's postbacks are tied to
let networkPlacement = ad.networkPlacement // The placement ID from the network that showed the ad
}
如果 ad.revenue 为 -1,则表示出现错误。
您还可以获取收入值的精确度评估,如下例所示:
NSString *revenuePrecision = ad.revenuePrecision;
let revenuePrecision = ad.revenuePrecision
该精确度采用下列值之一:
"publisher_defined""exact""estimated""undefined"""要监听广告请求的发出,请设置一个 MAAdRequestDelegate,实现它的 [didStartAdRequestForAdUnitIdentifier:] 方法,然后将委托设置为 requestDelegate。
以下示例展示了如何实现此类 "ad request started" 回调:
- (void)didStartAdRequestForAdUnitIdentifier:(NSString *)adUnitIdentifier
{
// Ad request started here
}
func didStartAdRequest(forAdUnitIdentifier adUnitIdentifier: String)
{
// Ad request started here
}
您可以在 ALSdkInitializationConfiguration 中指定特定的广告单元来初始化 SDK。
如果这样做,SDK 将仅初始化您为指定的广告单元配置的那些网络。
(如果您不指定任何广告单元,SDK 将假定当前会话需要您的所有广告单元。
如果是这样,它将初始化您为它们配置的所有网络。)
以下示例展示了如何实现此功能:
ALSdkInitializationConfiguration *initConfig = [ALSdkInitializationConfiguration configurationWithSdkKey:«your-SDK-key»
builderBlock:^(ALSdkInitializationConfigurationBuilder *builder) {
builder.mediationProvider = ALMediationProviderMAX;
builder.adUnitIdentifiers = @[@"«ad-unit-ID-1»", @"«ad-unit-ID-2»"];
}];
[[ALSdk shared] initializeWithConfiguration: initConfig completionHandler:^(ALSdkConfiguration *sdkConfig) {
⋮
}];
let initConfig = ALSdkInitializationConfiguration.configuration(
withSdkKey: "«your-SDK-key»"
) { builder in
builder.mediationProvider = ALMediationProviderMAX
builder.adUnitIdentifiers = ["«ad-unit-ID-1»", "«ad-unit-ID-2»"]
}
ALSdk.shared().initialize(with: initConfig) { sdkConfig in
⋮
}
您可以在 AppLovin 控制面板的 Account > General > Keys 部分找到 SDK key。
当您使用选择性初始化时,MAX 会在当前会话中排除任何您未明确指定的广告单元来投放广告。
当您启用 测试模式 时,选择性初始化将不起作用。
Waterfall Information API 可向您展示广告的当前瀑布流 (已加载或加载失败的广告)。 API 会返回瀑布流中每则广告的广告加载状态、延迟、配置信息和聚合平台信息。 如果瀑布流中的广告加载失败,API 会提供错误信息。
| 值 | 解释 |
|---|---|
| 0 | 未尝试加载广告 |
| 1 | 广告已加载 |
| 2 | 广告加载失败 |
- (void)didLoadAd:(MAAd *)ad
{
NSLog(@"Waterfall Name: %@ and Test Name: %@", ad.waterfall.name, ad.waterfall.testName);
NSLog(@"Waterfall latency was: %f seconds", ad.waterfall.latency);
for (MANetworkResponseInfo *networkResponse in ad.waterfall.networkResponses)
{
NSLog(@"Network -> %@", networkResponse.mediatedNetwork);
NSLog(@"...adLoadState: %ld", (long) networkResponse.adLoadState);
NSLog(@"...latency: %f seconds", networkResponse.latency);
NSLog(@"...credentials: %@", networkResponse.credentials);
if (networkResponse.error) {
NSLog(@"...error: %@", networkResponse.error);
}
}
}
- (void)didFailToLoadAdForAdUnitIdentifier:(NSString *)adUnitIdentifier withError:(MAError *)error
{
if (!error.waterfall) {
return;
}
MAAdWaterfallInfo *waterfall = error.waterfall;
NSLog(@"Waterfall Name: %@ and Test Name: %@", waterfall.name, waterfall.testName);
NSLog(@"Waterfall latency was: %f seconds", waterfall.latency);
for (MANetworkResponseInfo *networkResponse in waterfall.networkResponses)
{
NSLog(@"Network -> %@", networkResponse.mediatedNetwork);
NSLog(@"...latency: %f seconds", networkResponse.latency);
NSLog(@"...credentials: %@", networkResponse.credentials);
if (networkResponse.error) {
NSLog(@"...error: %@", networkResponse.error);
}
}
}
func didLoad(_ ad: MAAd)
{
print("Waterfall Name: (ad.waterfall.name) and Test Name: (ad.waterfall.testName)")
print("Waterfall latency was: (ad.waterfall.latency) seconds")
for networkResponse in ad.waterfall.networkResponses
{
print("Network -> (networkResponse.mediatedNetwork)")
print("...adLoadState: (networkResponse.adLoadState.rawValue)")
print("...latency: (networkResponse.latency) seconds")
print("...credentials: (networkResponse.credentials)")
if let networkError = networkResponse.error
{
print("...error: (networkError)")
}
}
}
func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError)
{
guard let waterfall = error.waterfall else {
return
}
print("Waterfall Name: (waterfall.name) and Test Name: (waterfall.testName)")
print("Waterfall latency was: (waterfall.latency) seconds")
for networkResponse in waterfall.networkResponses
{
print("Network -> (networkResponse.mediatedNetwork)")
print("...latency: (networkResponse.latency) seconds")
print("...credentials: (networkResponse.credentials)")
if let networkError = networkResponse.error
{
print("...error: (networkError)")
}
}
}
Waterfall Name: Default Waterfall and Test Name: Control
Waterfall latency was: 4.1710309982299805 seconds
Network -> [MAMediatedNetworkInfo: name=Fyber, adapterClassName=ALInneractiveMediationAdapter, adapterVersion=8.1.1.0, sdkVersion=8.1.1]
...adLoadState: 2
...latency: 0.0057220458984375 seconds
...credentials: ["placement_id": 235786, "app_id": 106516]
...error: [MAAdapterError: errorCode=-5202, errorMessage="Invalid Configuration", thirdPartySdkErrorCode=495, thirdPartySdkErrorMessage="The operation couldn’t be completed. (There is no 235786 spot ID in current app config error 495.)"]
Network -> [MAMediatedNetworkInfo: name=AdMob, adapterClassName=ALGoogleMediationAdapter, adapterVersion=8.13.0.2, sdkVersion=afma-sdk-i-v8.13.0]
...adLoadState: 1
...latency: 3.0903170108795166 seconds
...credentials: ["app_id": ca-app-pub-3555987499620362~1761536714, "event_id": 7f40fb8a9d64cbf1156909a514e53d8181fcf7a3, "placement_id": ca-app-pub-3555987499620362/1638443478]
Network -> [MAMediatedNetworkInfo: name=ironSource, adapterClassName=ALIronSourceMediationAdapter, adapterVersion=7.1.12.0.0, sdkVersion=7.1.12]
...adLoadState: 0
...latency: -1.0 seconds
...credentials: ["placement_id": 1082713, "app_key": 882393cd]
请注意,如果瀑布流为空,MAError.waterfall 将返回 nil,因此您无法查询瀑布流属性。
但是,您可以通过 requestLatency 获取空瀑布流的广告加载延迟:
- (void)didLoadAd:(MAAd *)ad
{
NSLog(@"Succesful ad load latency: %f seconds", ad.requestLatency);
}
- (void)didFailToLoadAdForAdUnitIdentifier:(NSString *)adUnitIdentifier withError:(MAError *)error
{
NSLog("Failed ad load latency: %f seconds", error.requestLatency);
}
func didLoad(_ ad: MAAd)
{
print("Successful ad load latency: (ad.requestLatency) seconds")
}
func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError)
{
print("Failed ad load latency: (error.requestLatency) seconds")
}
您可以在集成中直接自定义横幅和 MREC 广告的刷新间隔,就像在广告单元 UI 中配置它们一样。 最小刷新间隔为 10 秒。 最大刷新间隔为 120 秒。 MAX 会忽略这些限制之外的值。 以下代码示例展示了如何自定义这些刷新间隔:
// Where adView is an instance of MAAdView
[adView setExtraParameterForKey: @"ad_refresh_seconds" value: «ad-refresh-rate»];
// Where adView is an instance of MAAdView
adView.setExtraParameter("ad_refresh_seconds", «ad-refresh-rate»)
为避免插屏广告和激励广告音频干扰应用的背景音频,AppLovin 建议您在显示广告前暂停应用的背景音频。 您可以在隐藏广告后恢复应用的背景音频。
- (void)didDisplayAd:(MAAd *)ad
{
// Pause your app's background audio
}
- (void)didHideAd:(MAAd *)ad
{
// Resume your app's background audio
}
func didDisplay(_ ad: MAAd)
{
// Pause your app's background audio
}
func didHide(_ ad: MAAd)
{
// Resume your app's background audio
}