広告ユニットごとにプレースメント名を設定できます(例:「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; // ミュートにする場合
sdk.settings.muted = NO; // ミュートを解除する場合
let sdk = ALSdk.shared()
sdk.settings.isMuted = true /// ミュートにする場合
sdk.settings.isMuted = false /// ミュートを解除する場合
広告をロードする前にミュート状態を設定してください。 一部のネットワーク(Google biddingやGoogle AdMobなど)は、広告ロード前のミュート状態に応じて、ミュートされた動画またはミュートされていない動画を返します。
注意:広告をミュートにすると、広告収益が低下する可能性があります。
詳細ログを有効にするには、次の2つの方法があります。
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]」というタグを付与します。
メディエーション対象ネットワークから、表示された広告のクリエイティブIDとネットワーク名を取得できます。 詳細については、クリエイティブデバッガーのドキュメントを参照してください。
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のユーザー収益APIを使用してこのデータにアクセスすることもできます。 このデータへのアクセスを希望するMMPは、MMP向けインプレッションレベルのユーザー収益APIページを参照してください。
AppLovinブログの「MAXで広告収益アトリビューションを次のレベルへ」
インプレッションレベルの広告収益データは、サポートされているすべてのネットワークについて、Adjustなど、お好みのモバイル計測パートナー(MMP)と共有できます。
収益額は、すべての広告ライフサイクルコールバックで取得できます。 以下の例は、「広告収益支払い(ad revenue paid)」コールバックでこれを行う方法を示しています。
- (void)didPayRevenueForAd:(MAAd *)ad
{
double revenue = ad.revenue; // 米ドル(USD)表記
// その他のデータ
NSString *countryCode = [ALSdk shared].configuration.countryCode; // 米国の場合は "US" など - 注意:通貨コードである "USD" と混同しないでください
NSString *networkName = ad.networkName; // 広告を表示したネットワークの表示名
NSString *adUnitId = ad.adUnitIdentifier; // MAX広告ユニットID
MAAdFormat *adFormat = ad.format; // 広告の広告フォーマット(例:BANNER, MREC, INTERSTITIAL, REWARDED)
NSString *placement = ad.placement; // この広告のポストバックが紐付けられているプレースメント
NSString *networkPlacement = ad.networkPlacement; // 広告を表示したネットワークからのプレースメントID
}
func didPayRevenue(_ ad: MAAd)
{
let revenue = ad.revenue // 米ドル(USD)表記
// その他のデータ
let countryCode = ALSdk.shared().configuration.countryCode // 米国の場合は "US" など - 注意:通貨コードである "USD" と混同しないでください
let networkName = ad.networkName // 広告を表示したネットワークの表示名
let adUnitId = ad.adUnitIdentifier // MAX広告ユニットID
let adFormat = ad.format // 広告の広告フォーマット(例:BANNER, MREC, INTERSTITIAL, REWARDED)
let placement = ad.placement // この広告のポストバックが紐付けられているプレースメント
let networkPlacement = ad.networkPlacement // 広告を表示したネットワークからのプレースメントID
}
ad.revenue が -1 の場合、これはエラーを示します。
以下の例に示すように、収益値の精度評価(precision)を取得することもできます。
NSString *revenuePrecision = ad.revenuePrecision;
let revenuePrecision = ad.revenuePrecision
この精度(precision)は、以下のいずれかの値をとります。
"publisher_defined""exact""estimated""undefined"""MAAdRequestDelegate を設定し、その [didStartAdRequestForAdUnitIdentifier:] メソッドを実装して、そのデリゲートを requestDelegate に設定することで、広告リクエストがいつ行われたかをリッスンできます。
以下の例は、このような「広告リクエスト開始」コールバックを実装する方法を示しています。
- (void)didStartAdRequestForAdUnitIdentifier:(NSString *)adUnitIdentifier
{
// ここで広告リクエストが開始されました
}
func didStartAdRequest(forAdUnitIdentifier adUnitIdentifier: String)
{
// ここで広告リクエストが開始されました
}
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
⋮
}
SDKキーは、AppLovinダッシュボードの Account > General > Keys セクションで確認できます。
選択的初期化を使用する場合、MAXは明示的に指定されていない広告ユニットを現在のセッションの広告配信から除外します。
テストモードを有効にしている場合、選択的初期化は効果がありません。
ウォーターフォール情報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")
}
広告ユニットUIで設定できるのと同様に、インテグレーション内で直接バナーおよびMRECの広告リフレッシュ間隔をカスタマイズできます。 最小リフレッシュ間隔は10秒です。 最大リフレッシュ間隔は120秒です。 MAXはこれらの制限外の値を無視します。 以下のコードサンプルは、これらのリフレッシュ間隔をカスタマイズする方法を示しています。
// adView が MAAdView のインスタンスである場合
[adView setExtraParameterForKey: @"ad_refresh_seconds" value: «ad-refresh-rate»];
// adView が MAAdView のインスタンスである場合
adView.setExtraParameter("ad_refresh_seconds", «ad-refresh-rate»)
インタースティシャル広告やリワード広告の音声がアプリのバックグラウンド音声と干渉するのを防ぐため、AppLovinでは広告を表示する前にアプリのバックグラウンド音声を停止することをお勧めします。 広告を閉じた後に、アプリのバックグラウンド音声を再開できます。
- (void)didDisplayAd:(MAAd *)ad
{
// アプリのバックグラウンド音声を一時停止する
}
- (void)didHideAd:(MAAd *)ad
{
// アプリのバックグラウンド音声を再開する
}
func didDisplay(_ ad: MAAd)
{
// アプリのバックグラウンド音声を一時停止する
}
func didHide(_ ad: MAAd)
{
// アプリのバックグラウンド音声を再開する
}