이 페이지에서는 MAX Terms & Privacy Policy Flow를 사용하여 이용약관 및 개인정보 처리방침에 대한 동의를 유도하는 방법에 대해 설명합니다.
MAX SDK에 포함된 CMP flow를 사용하거나 자체 CMP flow를 연동할 수 있습니다. 자체 CMP flow를 연동하는 경우, MAX SDK를 초기화하기 전에 해당 flow가 완료되었는지 확인하십시오.
AppLovin MAX SDK는 Google UMP와 함께 사용할 때 TCF v2를 준수합니다. MAX SDK는 동의 문자열 및 AC 문자열을 수신할 수 있으며, TCF v2 consent에 설명된 대로 TCF v2 동의 문자열/상태를 mediation 네트워크로 전달할 수 있습니다.
(AppLovin의 자동화된 flow를 통해서든 다른 방식을 통해서든) Google UMP를 CMP로 사용하지 않는 경우, 선택한 CMP가 연동하는 모든 mediation 네트워크를 지원하는지 확인해야 합니다.
CMP를 사용하지 않는 경우, Consent and other applicable flags in GDPR and other regions에 설명된 대로 AppLovin SDK의 바이너리 동의 플래그를 계속 설정해야 합니다.
MAX를 통해 Google 디맨드에 액세스하는 경우, 연동 프로세스를 시작하기 전에 Google CMP 요구 사항을 검토하는 것이 매우 중요합니다.
AppLovin MAX SDK는 Google UMP 연동을 자동화합니다. Google UMP를 수동으로 연동할 필요가 없습니다. 이는 옵트인 방식이며, AppLovin은 이 Google UMP 연동을 활성화하는 방법에 대한 지침을 제공합니다. 아래는 flow의 시각적 표현입니다:
다음 중 하나의 상황에서는 TCF 동의 상태가 false일 수 있습니다:
MAX 동의 flow에 Google GDPR 양식을 표시하려면 먼저 AdMob 대시보드에서 Google GDPR 메시지를 생성하고 게시해야 합니다. 방법은 다음과 같습니다:
닫기(동의하지 않음) 옵션은 체크하지 마십시오.
#ffffff)으로 설정합니다.#6e6e6e)으로 설정합니다.기본 GDPR 메시지에서 Google은 모든 광고 네트워크 파트너를 표시하지 않을 수 있습니다. 이러한 네트워크를 포함하지 않으면 광고 수익에 부정적인 영향을 미칠 수 있습니다. 모든 광고 파트너가 GDPR 메시지에 표시되도록 하려면 이 섹션의 단계를 따르십시오.
Google과 GDPR 인증을 받은 광고 파트너 목록은 Google AdMob 고객센터의 “GDPR 광고 파트너 관리”를 참조하십시오.
먼저, 모듈의 앱 수준 Gradle 파일에 Google User Messaging Platform SDK에 대한 종속성을 추가합니다.
이 파일은 일반적으로 app/build.gradle입니다:
dependencies {
implementation 'com.google.android.ump:user-messaging-platform:4.0.0'
}
dependencies {
implementation("com.google.android.ump:user-messaging-platform:4.0.0")
}
그런 다음 프로그래밍 방식으로 또는 애플리케이션 리소스에 설정 파일을 추가하여 MAX Terms and Privacy Policy Flow를 활성화할 수 있습니다. 아래 섹션에서 이 두 가지 방법을 모두 설명합니다.
프로그래밍 방식으로 MAX Terms and Privacy Policy Flow를 활성화하려면 SDK의 settings 객체의 특정 속성을 설정합니다.
아래 코드 샘플과 같이 SDK를 초기화하기 전에 이 작업을 수행하십시오.
package com.applovin.apps.test;
import android.net.Uri;
import com.applovin.sdk.AppLovinMediationProvider;
import com.applovin.sdk.AppLovinSdk;
import com.applovin.sdk.AppLovinSdkSettings;
public class MyApplication
extends Application
{
@Override
public void onCreate()
{
super.onCreate();
val settings = AppLovinSdk.getInstance( this ).getSettings();
settings.getTermsAndPrivacyPolicyFlowSettings().setEnabled( true );
settings.getTermsAndPrivacyPolicyFlowSettings().setPrivacyPolicyUri( Uri.parse( "«https://your-company-name.com/privacy-policy»" ) );
// Terms of Service URL is optional
settings.getTermsAndPrivacyPolicyFlowSettings().setTermsOfServiceUri( Uri.parse( "«https://your-company-name.com/terms-of-service»" ) );
// Showing Terms & Privacy Policy flow in GDPR region is optional (disabled by default)
settings.getTermsAndPrivacyPolicyFlowSettings().setShowTermsAndPrivacyPolicyAlertInGdpr( true );
// Set the mediation provider value to "max" to ensure proper functionality
AppLovinSdkInitializationConfiguration initConfig = AppLovinSdkInitializationConfiguration.builder( "«SDK-key»" )
.setMediationProvider( AppLovinMediationProvider.MAX )
.build();
// Initialize the SDK with the configuration
AppLovinSdk.getInstance( this ).initialize( initConfig, new AppLovinSdk.SdkInitializationListener()
{
@Override
public void onSdkInitialized(final AppLovinSdkConfiguration sdkConfig)
{
⋮
}
} );
}
}
package com.applovin.apps.test
import android.net.Uri
import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkSettings
class MyApplication : Application()
{
override fun onCreate()
{
super.onCreate()
val settings = AppLovinSdk.getInstance(this).settings
settings.termsAndPrivacyPolicyFlowSettings.isEnabled = true
settings.termsAndPrivacyPolicyFlowSettings.privacyPolicyUri = Uri.parse("«https://your-company-name.com/privacy-policy»")
// Terms of Service URL is optional
settings.termsAndPrivacyPolicyFlowSettings.termsOfServiceUri = Uri.parse("«https://your-company-name.com/terms-of-service»")
// Showing Terms & Privacy Policy flow in GDPR region is optional (disabled by default)
settings.termsAndPrivacyPolicyFlowSettings.showTermsAndPrivacyPolicyAlertInGdpr = true
// Set the mediation provider value to "max" to ensure proper functionality
val initConfig = AppLovinSdkInitializationConfiguration.builder("«SDK-key»")
.setMediationProvider(AppLovinMediationProvider.MAX)
).build()
// Initialize the SDK with the configuration
AppLovinSdk.getInstance(this).initialize(initConfig) { sdkConfig ->
⋮
}
}
}
SDK 키는 AppLovin 대시보드의 Account > General > Keys 섹션에서 찾을 수 있습니다.
Android 리소스를 통해 MAX의 Terms and Privacy Policy Flow를 활성화하려면:
applovin_settings.json이라는 이름의 JSON 파일을 생성합니다.consent_flow_settings 키를 사용하여 새 JSON 객체를 생성합니다.consent_flow_settings 객체에 다음 키-값 쌍을 추가합니다:
consent_flow_enabled 키와 값 true.consent_flow_privacy_policy 키와 개인정보 처리방침 URL 값.consent_flow_terms_of_service 키와 이용약관 URL 값.consent_flow_show_terms_and_privacy_policy_alert_in_gdpr 키와 값 true.최종 결과는 다음과 유사해야 합니다:
{
"consent_flow_settings": {
"consent_flow_enabled": true,
"consent_flow_terms_of_service": "«https://your-company-name.com/terms-of-service»",
"consent_flow_privacy_policy": "«https://your-company-name.com/privacy-policy»",
"consent_flow_show_terms_and_privacy_policy_alert_in_gdpr": true
}
}
SDK는 SDK를 초기화할 때 동의 flow를 표시합니다. 사용자가 flow를 완료하면 SDK는 초기화 완료 콜백을 호출합니다.
서드 파티 SDK(MMP 또는 분석 SDK 등)를 초기화하기 전에 사용자가 동의 flow를 마칠 때까지 기다려야 합니다. 이러한 이유로 초기화 완료 콜백에서 해당 SDK를 초기화하십시오. 사용자가 동의 flow를 완료하기 전에 서드 파티 SDK를 초기화하면 이러한 SDK가 관련 식별자에 액세스할 수 없으므로 측정, 보고 및 광고 수익에 실질적인 영향을 미치게 됩니다.
초기화 콜백에서 MAX mediated 네트워크 SDK를 초기화하지 마십시오. MAX는 이 초기화를 자동으로 수행합니다.
MMP 연동에서 사용자 ID를 설정하는 경우, AppLovin 사용자 ID를 설정하는 위치에 설정하십시오. 아래 코드 스니펫은 Adjust를 예로 사용합니다. Adjust를 초기화하는 방법 및 사용자 ID를 설정하는 방법을 알아보려면 Adjust 문서를 참조하십시오.
package com.applovin.apps.test;
import com.adjust.sdk.Adjust;
import com.adjust.sdk.AdjustConfig;
import com.adjust.sdk.LogLevel;
import com.applovin.sdk.AppLovinMediationProvider;
import com.applovin.sdk.AppLovinSdk;
import com.applovin.sdk.AppLovinSdkConfiguration;
import com.applovin.sdk.AppLovinSdkInitializationConfiguration;
import com.applovin.sdk.AppLovinSdkSettings;
import lombok.val;
public class MyApplication
extends Application
{
@Override
public void onCreate()
{
super.onCreate();
// Create the initialization configuration
AppLovinSdkInitializationConfiguration initConfig = AppLovinSdkInitializationConfiguration.builder( "«SDK-key»" )
.setMediationProvider( AppLovinMediationProvider.MAX )
.build();
// Set the user ID
val settings = AppLovinSdk.getInstance( this ).getSettings();
settings.setUserIdentifier( "«user-ID»" );
// Initialize the SDK with the configuration
AppLovinSdk.getInstance( this ).initialize( initConfig, new AppLovinSdk.SdkInitializationListener()
{
@Override
public void onSdkInitialized(final AppLovinSdkConfiguration sdkConfig)
{
// Initialize the Adjust SDK inside the AppLovin SDK's initialization callback
AdjustConfig adjustConfig = new AdjustConfig( this, "«your-Adjust-app-token»", AdjustConfig.ENVIRONMENT_SANDBOX or AdjustConfig.ENVIRONMENT_PRODUCTION );
Adjust.onCreate( adjustConfig );
// Start loading ads
}
} );
}
}
package com.applovin.apps.test
import com.adjust.sdk.Adjust
import com.adjust.sdk.AdjustConfig
import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkInitializationConfiguration
class MyApplication : Application()
{
override fun onCreate()
{
super.onCreate()
// Create the initialization configuration
val initConfig = AppLovinSdkInitializationConfiguration.builder("«SDK-key»")
.setMediationProvider(AppLovinMediationProvider.MAX)
.build()
// Configure the SDK settings if needed before or after SDK initialization.
val settings = AppLovinSdk.getInstance(this).settings
settings.userIdentifier = "«user-ID»"
// Initialize the SDK with the configuration
AppLovinSdk.getInstance(this).initialize(initConfig) { sdkConfig ->
// Initialize other 3rd-party SDKs - do not initialize mediated advertising SDKs, MAX will automatically do that for you. Not following this step will result in noticeable integration issues
// Initialize the Adjust SDK inside the AppLovin SDK's initialization callback
val adjustConfig = AdjustConfig( this, "«your-Adjust-app-token»", AdjustConfig.ENVIRONMENT_SANDBOX or AdjustConfig.ENVIRONMENT_PRODUCTION )
Adjust.onCreate(adjustConfig )
// Start loading ads
}
}
}
AppLovin은 GDPR 지역의 기존 사용자가 GDPR flow에 다시 진입할 수 있도록 허용할 것을 권장합니다.
일반적으로 사용자는 앱의 설정 섹션에서 기존 개인정보 보호 설정 관리 옵션을 통해 이 작업을 수행합니다.
사용자가 GDPR 지역에 있는지 여부에 따라 해당 설정 옵션을 조건부로 표시할 수 있습니다.
사용자가 GDPR 지역에 있는지 확인하려면 AppLovinSdkConfiguration.getConsentFlowUserGeography()를 호출합니다. (getConsentFlowUserGeography()가 ConsentFlowUserGeography.GDPR을 반환하면 사용자는 GDPR 지역에 있는 것입니다.)
사용자가 기존 개인정보 보호 설정 관리(또는 이에 상응하는 버튼)를 클릭하면 AppLovinCmpService.showCmpForExistingUser()를 호출합니다.
이 작업은 사용자의 기존 동의 정보를 재설정합니다.
package com.applovin.apps.test;
import android.app.Activity;
import com.applovin.sdk.AppLovinSdk;
import com.applovin.sdk.AppLovinCmpService;
public class MyActivity
extends Activity
{
private void showAppLovinConsentFlow()
{
AppLovinCmpService cmpService = AppLovinSdk.getInstance( this ).getCmpService();
cmpService.showCmpForExistingUser( this, new AppLovinCmpService.OnCompletedListener()
{
@Override
public void onCompleted(final AppLovinCmpError error)
{
if ( null == error )
{
// The CMP alert was shown successfully.
}
}
} );
}
}
package com.applovin.apps.test
import android.app.Activity
import com.applovin.sdk.AppLovinSdk
public class MyActivity : Activity()
{
private fun showAppLovinConsentFlow()
{
val cmpService = AppLovinSdk.getInstance(this).cmpService
cmpService.showCmpForExistingUser(this) { error ->
if (null == error)
{
// The CMP alert was shown successfully.
}
}
}
}
GDPR 지역 외부에서 Google CMP를 테스트하려면 다음 방법 중 하나를 사용하여 디버그 사용자 지역을 GDPR로 설정하십시오.
AppLovinSdkSettings settings = AppLovinSdk.getInstance( this ).getSettings();
⋮
settings.getTermsAndPrivacyPolicyFlowSettings().setDebugUserGeography( AppLovinSdkConfiguration.ConsentFlowUserGeography.GDPR );
val settings = AppLovinSdk.getInstance(this).settings
⋮
settings.termsAndPrivacyPolicyFlowSettings.debugUserGeography = AppLovinSdkConfiguration.ConsentFlowUserGeography.GDPR
디버그 사용자 지역을 설정하려면 consent_flow_settings 객체 아래에 consent_flow_debug_user_geography 키와 값 gdpr을 추가합니다:
{
"consent_flow_settings": {
⋮
"consent_flow_debug_user_geography": "gdpr"
}
}
그런 다음, MAX SDK를 초기화하기 전에 테스트 기기 해시 ID를 설정합니다. Google CMP SDK는 앱이 기기에서 실행될 때 이 테스트 기기 해시 ID를 로그에 기록합니다. 다음 호출을 수행하여 테스트 기기 해시 ID를 설정합니다:
settings.setExtraParameter("google_test_device_hashed_id", "«your-test-device-hashed-ID»");
settings.setExtraParameter("google_test_device_hashed_id", "«your-test-device-hashed-ID»")
MAX Mediation Debugger의 Privacy 섹션 아래에 있는 CMP (Consent Management Platform) 행에는 연동한 Google 인증 CMP SDK의 이름이 표시됩니다. Google UMP SDK를 연동한 경우 이름으로 “Google consent management solutions”가 표시됩니다.

CMP (Consent Management Platform) 행을 선택하면 IAB TCF 파라미터인 IABTCF_gdprApplies, IABTCF_TCString 및 IABTCF_AddtlConsent를 검사할 수 있습니다. 후자의 두 파라미터의 경우, 행을 클릭하여 해당 값을 복사하거나 공유할 수 있습니다.

CMP CONFIGURATION 섹션에서 Google UMP 구성에 연동되어 있거나 누락된 네트워크를 확인할 수 있습니다. 이는 MAX에서 사용할 수 있는 모든 네트워크의 전체 목록입니다. 애플리케이션에 연동하지 않은 네트워크는 무시해도 됩니다.
CMP flow에서 애플리케이션에 연동하는 네트워크를 나열해야 합니다. 해당 네트워크 중 누락된 네트워크가 있는지 확인하고 이 문제를 해결하려면 다음 단계를 따르십시오.
CMP flow에 모든 네트워크가 포함되었는지 확인할 때까지 이 단계를 반복합니다.


모든 네트워크의 동의 상태를 보려면 Mediation Debugger에서 Network Consent Statuses를 확장합니다. Mediation Debugger는 TC 문자열을 파싱하여 모든 네트워크의 동의 상태를 표시합니다. 또한 Google UMP가 생성하는 AC 문자열에서 파싱한 AppLovin 동의 상태도 표시합니다.
