AppLovin의 서버는 개발자가 정의한 외부 서버로 서버 간(S2S) rewarded 콜백을 보낼 수 있습니다. 이러한 콜백은 앱 사용자가 rewarded ad 시청을 완료하여 보상 지급 대상이 되었음을 개발자에게 알려줍니다. 이를 통해 rewarded ad를 끝까지 시청하지 않고 보상을 획득하려는 악성 사용자로부터 보호할 수 있습니다.
사용자가 MAX mediation이 송출하는 rewarded ad 시청을 완료하면 AppLovin 서버가 외부 엔드포인트로 콜백을 보낼 수 있습니다.
개발자는 이러한 요청을 받을 엔드포인트를 정의합니다.
콜백은 HTTP 또는 HTTPS GET 요청 형식으로 전송됩니다.
AppLovin은 광고 완료 직후에 이러한 콜백을 수행하지만, 몇 분 정도 지연될 수 있습니다.
impression 타임스탬프 매크로를 사용하여 impression 시간과 콜백 시간 사이의 지연을 조정할 수 있습니다.
엔드포인트로부터 응답 없이 5초가 지나면 콜백 요청이 타임아웃됩니다. 콜백 요청이 타임아웃되면 AppLovin은 콜백을 최대 2회까지 재시도합니다.
원하는 rewarded Ad Unit의 Edit Ad Unit 페이지에서 Server Side Callback URL 값을 설정하여 이러한 콜백을 구성할 수 있습니다.
https://myrewardedserver.com/rewards?idfa={IDFA}&user_id={USER_ID}&event={EVENT_ID}&token={EVENT_TOKEN}
다음 표에 있는 매크로를 콜백 URL에 통합할 수 있습니다.
위의 예시 URL에는 {IDFA}, {USER_ID}, {EVENT_ID}, {EVENT_TOKEN} 매크로가 포함되어 있습니다.
AppLovin 서버가 엔드포인트로 콜백을 보낼 때 이러한 매크로 이름을 정확한 값으로 대체합니다.
| 이름 | 설명 | 예시 |
|---|---|---|
{AD_UNIT_ID} | MAX Ad Unit ID (16자리 16진수 문자) | 9ad0816ac071552a |
{AD_UNIT_NAME} | Ad Unit 이름 (URL 인코딩됨) | My%20App%20Banners |
{AMOUNT} | 사용자에게 지급하기로 선택한 보상 수량입니다. 각 Ad Unit의 Ad Unit 편집 페이지에서 설정합니다. | 100 |
{CC} | 사용자의 국가 코드 (두 글자) | gb |
{CURRENCY} | 사용자에게 지급하기로 선택한 보상 유형입니다 (URL 인코딩됨). 각 Ad Unit의 Ad Unit 편집 페이지에서 설정합니다. | coins |
{CUSTOM_DATA} | 연동 과정에서 전달되는 커스텀 데이터 (URL 인코딩됨). AppLovin은 문자열 크기를 8192자 미만으로 유지할 것을 권장합니다. | my%20custom%20data |
{EVENT_ID} | 고유 이벤트 ID, 40자리 16진수 문자 | 8dc948013d71f…b226e08 |
{EVENT_TOKEN} | sha1( EVENT_ID + 개발자의 Event Key ) | e000949f6d851…a43cf31 |
{EVENT_TOKEN_ALL} | sha256( 모든1 매크로를 알파벳 순서로 정렬, URL 디코딩 + 개발자의 Event Key ) | eba615583ed59…5f218702a97a |
{IDFA} | iOS IDFA 또는 Google Advertising ID | 860635ea-…3b30b94 |
{IDFV} | IDFV | 4CD1C3C4-…9387E60 |
{IP} | 사용자의 IP (IPv6 값은 URL 인코딩됨) | 162.1.1.1 , fe80%3A%3A…890a%0A |
{NETWORK_NAME} | MAX Ad Network Name | APPLOVIN_BIDDING |
{PACKAGE_NAME} | 앱 패키지 이름 (Android) 또는 Bundle ID (iOS). URL 인코딩됨. | com.test.app |
{PLACEMENT} | 퍼블리셔가 정의한 MAX ad placement 이름 (URL 인코딩됨) | Launch%20Screen |
{PLATFORM} | 플랫폼 | android , ios |
{TS} | 광고 로드 시간의 타임스탬프 (정수, epoch 이후 초 단위) | 1546300800 |
{USER_ID} | 퍼블리셔가 정의한 사용자 ID (URL 인코딩됨), 최대 길이는 8192자 | 7634657898 |
1 참고: EVENT_TOKEN이 매크로 중 하나인 경우, "모든 매크로를 알파벳 순서로 정렬"한 문자열에서 제외됩니다.
다음 코드 스니펫은 Ad Unit에 placement 이름을 추가하는 방법을 보여줍니다.
placement 이름의 값은 포스트백 요청에서 {PLACEMENT} 매크로를 대체합니다:
AppLovinMAX.setBannerPlacement(«ad-unit-ID», «placement»);
AppLovinMAX.setMRecPlacement(«ad-unit-ID», «placement»);
AppLovinMAX.showInterstitial(«ad-unit-ID», «placement»);
nativeAdLoader.setPlacement(«placement»);
AppLovinMAX.showRewardedAd(«ad-unit-ID», «placement»);




UAppLovinMAX::CreateBanner(«ad-unit-ID», «position»);
UAppLovinMAX::SetBannerPlacement(«ad-unit-ID», «placement»);
UAppLovinMAX::CreateMRec(«ad-unit-ID», «position»);
UAppLovinMAX::SetMRecPlacement(«ad-unit-ID», «placement»);
UAppLovinMAX::ShowInterstitial(«ad-unit-ID», «placement»);
UAppLovinMAX::ShowInterstitial(«ad-unit-ID», «placement»);
MaxSdk.CreateBanner(«ad-unit-ID», «position»);
MaxSdk.SetBannerPlacement(«ad-unit-ID», "«placement»");
MaxSdk.CreateMRec(«ad-unit-ID», «position»);
MaxSdk.SetMRecPlacement(«ad-unit-ID», "«placement»");
MaxSdk.ShowInterstitial(«ad-unit-ID», "«placement»");
MaxSdk.ShowRewardedAd(«ad-unit-ID», "«placement»");
AppLovinMAX.createBanner(«ad-unit-ID», «position»);
AppLovinMAX.setBannerPlacement(«ad-unit-ID», «placement»);
AppLovinMAX.createMRec(«ad-unit-ID», «position»);
AppLovinMAX.setMRecPlacement(«ad-unit-ID», «placement»);
AppLovinMAX.showInterstitial(«ad-unit-ID», placement: «placement»);
AppLovinMAX.showRewardedAd(«ad-unit-ID», placement: «placement»);
AppLovinMAX.createBanner(«ad-unit-ID», «position»);
AppLovinMAX.set_banner_placement(«ad-unit-ID», «placement»);
AppLovinMAX.createMRec(«ad-unit-ID», «position»);
AppLovinMAX.set_mrec_placement(«ad-unit-ID», «placement»);
AppLovinMAX.show_interstitial(«ad-unit-ID», «placement»);
AppLovinMAX.show_rewarded_ad(«ad-unit-ID», «placement»);
adViewAd.setPlacement( "«placement»" );
interstitial.showAd( "«placement»" );
rewardedAd.showAd( "«placement»" );
nativeAdLoader.setPlacement( "«placement»" );
MaxAdPlacerSettings settings = new MaxAdPlacerSettings( "«ad-unit-ID»" );
settings.setPlacement( "«placement»" );
AppLovinMAX.createBanner(«ad-unit-ID», «position»);
AppLovinMAX.setBannerPlacement(«ad-unit-ID», «placement»);
AppLovinMAX.createMRec(«ad-unit-ID», «position»);
AppLovinMAX.setMRecPlacement(«ad-unit-ID», «placement»);
AppLovinMAX.showInterstitial(«ad-unit-ID», «placement»);
AppLovinMAX.showRewardedAd(«ad-unit-ID», «placement»);
AppLovinMAX.createBanner(«ad-unit-ID», «position»);
AppLovinMAX.setBannerPlacement(«ad-unit-ID», «placement»);
import { AdView, AdFormat } from 'react-native-applovin-max';
⋮
<AdView adUnitId={«ad-unit-ID»}
adFormat={AdFormat.BANNER}
placement={«placement»} />
import { MRecAd } from 'react-native-applovin-max';
⋮
MRecAd.createAd(«ad-unit-ID», «position»);
MRecAd.setPlacement(«ad-unit-ID», «placement»);
import { AdView, AdFormat } from 'react-native-applovin-max';
⋮
<AdView adUnitId={«ad-unit-ID»}
adFormat={AdFormat.MREC}
placement={«placement»} />
import { InterstitialAd } from 'react-native-applovin-max';
⋮
InterstitialAd.showAd(«ad-unit-ID», "«placement»");
import { RewardedAd } from 'react-native-applovin-max';
⋮
RewardedAd.showAd(«ad-unit-ID», "«placement»");
<NativeAdView
adUnitId={«ad-unit-ID»}
placement="«placement»"
⋮
/>
adView.setPlacement( "«placement»" )
interstitial.showAd( "«placement»" )
rewardedAd.showAd( "«placement»" )
nativeAdLoader.setPlacement( "«placement»" )
val settings = MaxAdPlacerSettings( "«ad-unit-ID»" )
settings.placement = "«placement»"
applovin.create_banner(«ad-unit-ID», «position»)
applovin.set_banner_placement(«ad-unit-ID», «placement»)
applovin.create_mrec(«ad-unit-ID», «position»)
applovin.set_mrec_placement(«ad-unit-ID», «placement»)
applovin.show_interstitial(«ad-unit-ID», «placement»);
applovin.show_rewarded_ad(«ad-unit-ID», «placement»);
adView.placement = @"«placement»";
[adView loadAd];
[interstitialAd showAdForPlacement: @"«placement»"];
[rewardedAd showAdForPlacement: @"«placement»"];
nativeAdLoader.placement = @"«placement»";
MAAdPlacerSettings *settings = [MAAdPlacerSettings settingsWithAdUnitIdentifier: @"«ad-unit-ID»"];
settings.placement = @"«placement»";
adView.placement = "«placement»"
adView.loadAd()
interstitial.show(forPlacement: "«placement»")
rewardedAd.show(forPlacement: "«placement»")
nativeAdLoader.placement = "«placement»"
let settings = MAAdPlacerSettings(adUnitIdentifier: "«ad-unit-ID»")
settings.placement = @"«placement»"
다음 코드 스니펫은 개발자 고유의 내부 User ID로 사용자를 태깅하는 방법을 보여줍니다. User ID 문자열의 최대 크기는 8192자입니다.
AppLovinMAX.setUserId("«user-ID»");
MaxSdk.SetUserId("«user-ID»");
val settings = AppLovinSdk.getInstance( this ).getSettings();
settings.setUserIdentifier( "«user-ID»" );
AppLovinMAX.setUserId("«user-ID»");
val settings = AppLovinSdk.getInstance( this ).settings
settings.userIdentifier = "«user-ID»"
applovin.set_user_id("«user-ID»")
ALSdkSettings *settings = [ALSdk shared].settings;
settings.userIdentifier = @"«user-ID»";
let settings = ALSdk.shared().settings
settings.userIdentifier = "«user-ID»"
보상 수량 및 재화에 접근하려면 reward 콜백을 오버라이드합니다:
private void OnRewardedAdReceivedRewardEvent(string adUnitId, MaxSdk.Reward reward, MaxSdkBase.AdInfo adInfo)
{
print("Rewarded user: " + reward.Amount + " " + reward.Label);
}
@Override
public void onUserRewarded(final MaxAd ad, final MaxReward reward)
{
System.out.println( "Rewarded user: " + reward.getAmount() + " " + reward.getLabel() );
}
override fun onUserRewarded(ad: MaxAd?, reward: MaxReward?)
{
System.out.println( "Rewarded user: " + reward!!.getAmount() + " " + reward.getLabel() )
}
- (void)didRewardUserForAd:(MAAd *)ad withReward:(MAReward *)reward
{
NSLog(@"Rewarded user: %d %@", reward.amount, reward.label);
}
func didRewardUser(for ad: MAAd, with reward: MAReward)
{
print("Rewarded user: \(reward.amount) \(reward.label)")
}
다음 코드 스니펫은 포스트백에 커스텀 String 데이터를 추가하는 방법을 보여줍니다.
이 String 데이터는 포스트백에서 {CUSTOM_DATA} 매크로를 대체합니다.
AppLovin은 문자열에 8192자 미만의 문자를 포함할 것을 권장합니다.
banner ad 또는 MREC ad를 로드하기 전에 커스텀 데이터를 설정해야 합니다. 그렇지 않으면 해당 데이터가 광고와 관련된 포스트백에 나타나지 않습니다.
MaxSdk.SetBannerCustomData("«ad-unit-ID»", "«custom-data»"); // Banners
MaxSdk.SetMRecCustomData("«ad-unit-ID»", "«custom-data»"); // MRECs
adViewAd.setCustomData( "«custom-data»" );
BannerAd.setCustomData("«ad-unit-ID»", "«custom-data»"); // Banners
MRec.setCustomData("«ad-unit-ID»", "«custom-data»"); // MRECs
adView.setCustomData( "«custom-data»" )
adView.customData = @"«custom-data»";
adView.customData = "«custom-data»"
MaxSdk.ShowInterstitial(«adUnitIdentifier», «placement», «custom data»);
MaxInterstitialAd.showAd(«placement», «custom data»);
InterstitialAd.showAd(interAdUnitId, "«placement»", "«custom data»");
MaxInterstitialAd.showAd(«placement», «custom data»)
-[MAInterstitialAd showAdForPlacement:customData:]
[interstitialAd showAdForPlacement: @"«placement»" customData: @"«custom-data»"];
MaxSdk.ShowRewardedAd(«adUnitIdentifier», «placement», «custom data»);
MaxRewardedAd.showAd(«placement», «custom data»);
RewardedAd.showAd(adUnitId, "«placement»", "«custom data»");
MaxRewardedAd.showAd(«placement», «custom data»)
-[MARewardedAd showAdForPlacement:customData:]
rewardedAd.show(forPlacement: "«placement»" customData: "«custom-data»")
nativeAdLoader.setCustomData( "«custom data»" );
<NativeAdView
adUnitId={«ad-unit-ID»}
customData="«custom-data»"
⋮
/>
nativeAdLoader.setCustomData( "«custom data»" )
nativeAdLoader.customData = @"«custom data»";
nativeAdLoader.customData = "«custom data»"