사용자 메시징 플랫폼에 대한 동의 얻기

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

기본 요건

IAB 요구사항이 EU 동의 메시지에 미치는 영향을 읽어보세요.

소개

Google EU 사용자 동의 정책에 따라 영국과 함께 유럽 경제 지역 (EEA)에서 사용자에게 특정 정보를 공개해야 하며, 법적으로 필요한 경우 쿠키 또는 기타 로컬 저장소를 사용하고 개인 정보 (예: 광고 ID)를 사용하여 광고를 게재한다는 점에 대해 EEA 사용자의 동의를 받아야 합니다. 이 정책에는 EU 온라인 개인 정보 보호 지침 및 개인 정보 보호법 (GDPR)의 요구사항이 반영되어 있습니다.

게시자가 이 정책의 의무 준수를 지원하기 위해 Google은 이전 오픈소스 동의 SDK를 대체하는 사용자 메시지 플랫폼 (UMP) SDK를 제공합니다. UMP SDK가 최신 IAB 표준을 지원하도록 업데이트되었습니다. 동의 양식 설정 및 광고 파트너 등록 프로세스도 간소화되었습니다. 이제 이 모든 구성을AdMob 개인 정보 보호 및 메시지에서 편리하게 처리할 수 있습니다.

동의가 필요하지 않다고 판단되더라도 사용자가 앱을 실행할 때마다 양식을 로드하는 것이 좋습니다. 그러면 사용자가 동의 설정을 변경하려고 할 때 양식이 표시될 준비가 됩니다.

이 가이드에서는 SDK를 설치하고, IAB 솔루션을 구현하고, 테스트 기능을 사용 설정하는 방법을 설명합니다.

Gradle로 설치

앱의 build.gradle에 라이브러리를 포함합니다.

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.google.android.ump:user-messaging-platform:2.0.0'
}

Gradle을 동기화하면 Gradle을 동기화하는 것을 잊지 마세요.

AndroidManifest.xml에 앱 ID 추가

고객센터 안내에 따라 앱 ID를 확인합니다.

AndroidManifest.xml에 앱 ID를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.rewardedinterstitialexample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="YOUR-APP-ID"/>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

SDK 사용

이 SDK는 선형 방식으로 사용됩니다. SDK를 사용하는 단계는 다음과 같습니다.

  1. 최신 동의 정보를 요청합니다.
  2. 동의가 필요한지 확인하세요.
  3. 양식을 사용할 수 있는지 확인하고 사용할 수 있는 양식이 있는지 확인합니다.
  4. 양식을 제시합니다.
  5. 사용자가 동의를 변경할 수 있는 방법을 제공합니다.

앱을 실행할 때마다 동의 정보 업데이트를 요청하는 것이 좋습니다. 이렇게 하면 사용자의 동의 여부가 결정됩니다.

자바

import android.os.Bundle;
import com.google.android.ump.ConsentForm;
import com.google.android.ump.ConsentInformation;
import com.google.android.ump.ConsentRequestParameters;
import com.google.android.ump.FormError;
import com.google.android.ump.UserMessagingPlatform;

public class MainActivity extends AppCompatActivity {
  private ConsentInformation consentInformation;
  private ConsentForm consentForm;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Set tag for underage of consent. Here false means users are not underage.
    ConsentRequestParameters params = new ConsentRequestParameters
        .Builder()
        .setTagForUnderAgeOfConsent(false)
        .build();

    consentInformation = UserMessagingPlatform.getConsentInformation(this);
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        new ConsentInformation.OnConsentInfoUpdateSuccessListener() {
          @Override
          public void onConsentInfoUpdateSuccess() {
            // The consent information state was updated.
            // You are now ready to check if a form is available.
          }
        },
        new ConsentInformation.OnConsentInfoUpdateFailureListener() {
          @Override
          public void onConsentInfoUpdateFailure(FormError formError) {
            // Handle the error.
          }
        });
  }
}

Kotlin

import android.os.Bundle
import com.google.android.ump.*

class MainActivity : AppCompactActivity() {
  private lateinit var consentInformation: ConsentInformation
  private var consentForm: ConsentForm? = null

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Set tag for underage of consent. Here false means users are not underage.
    val params = ConsentRequestParameters.Builder()
        .setTagForUnderAgeOfConsent(false)
        .build()

    consentInformation = UserMessagingPlatform.getConsentInformation(this)
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        {
          // The consent information state was updated.
          // You are now ready to check if a form is available.
        },
        { formError ->
          // Handle the error.
        }
    )
  }
}

가능한 경우 양식 로드

사용자에게 동의를 요청할지 여부를 결정한 후에는 다음 단계를 따라 양식을 사용할 수 있는지 확인해야 합니다.

양식을 사용할 수 없는 데에는 다음과 같은 여러 가지 이유가 있습니다.

  • 사용자가 제한적인 광고 추적을 사용 설정했습니다.
  • 사용자가 동의 연령 미만임을 태그했습니다.

양식을 사용할 수 있는지 확인하려면 ConsentInformation 인스턴스에서 isConsentFormAvailable() 메서드를 사용하세요. 양식을 로드하는 래퍼 메서드를 추가합니다.

자바

...
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        new ConsentInformation.OnConsentInfoUpdateSuccessListener() {
          @Override
          public void onConsentInfoUpdateSuccess() {
            // The consent information state was updated.
            // You are now ready to check if a form is available.
            if (consentInformation.isConsentFormAvailable()) {
              loadForm();
            }
          }
        },
        new ConsentInformation.OnConsentInfoUpdateFailureListener() {
          @Override
          public void onConsentInfoUpdateFailure(FormError formError) {
            // Handle the error.
          }
        });
}

public void loadForm() {

}

Kotlin

...
    consentInformation.requestConsentInfoUpdate(
        this,
        params,
        {
          // The consent information state was updated.
          // You are now ready to check if a form is available.
          if (consentInformation.isConsentFormAvailable) {
            loadForm()
          }
        },
        { formError ->
          // Handle the error.
        }
    )
}

private fun loadForm() {

}

양식을 로드하려면 UserMessagingPlatform 클래스의 정적 loadConsentForm() 메서드를 사용합니다. 이 메서드는 기본 스레드에서만 호출해야 합니다. 다음과 같이 loadForm() 메서드를 변경합니다.

자바

public void loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this, new UserMessagingPlatform.OnConsentFormLoadSuccessListener() {
        @Override
        public void onConsentFormLoadSuccess(ConsentForm consentForm) {
          MainActivity.this.consentForm = consentForm;
        }
      },
      new UserMessagingPlatform.OnConsentFormLoadFailureListener() {
        @Override
        public void onConsentFormLoadFailure(FormError formError) {
          // Handle the error.
        }
      });
}

Kotlin

private fun loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this,
      { consentForm ->
        this.consentForm = consentForm
      },
      { formError ->
        // Handle the error.
      }
  )
}

필요한 경우 양식 제시

양식을 표시하려면 ConsentForm 인스턴스에서 show() 메서드를 사용하세요. 개발자는 양식을 제시하기 전에 사용자가 동의를 받아야 하는지 판단해야 합니다. 동의가 필요한지 확인하려면 ConsentInformation 유형의 getConsentStatus() 메서드를 확인하세요. 이 메서드는 ConsentInformation.ConsentStatus 유형의 열거형을 반환합니다. 가능한 값은 다음과 같이 4가지입니다.

  • ConsentStatus.UNKNOWN: 알 수 없는 동의 상태입니다.
  • ConsentStatus.REQUIRED: 사용자 동의가 필요하지만 아직 획득하지 못했습니다.
  • ConsentStatus.NOT_REQUIRED: 사용자 동의가 필요하지 않습니다. 예를 들어 사용자가 EEA 또는 영국에 거주하지 않습니다.
  • ConsentStatus.OBTAINED: 사용자 동의를 받았습니다. 맞춤설정이 정의되지 않았습니다.

다음과 같이 loadForm() 메서드를 변경합니다.

자바

public void loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this, new UserMessagingPlatform.OnConsentFormLoadSuccessListener() {
        @Override
        public void onConsentFormLoadSuccess(ConsentForm consentForm) {
          MainActivity.this.consentForm = consentForm;
          if (consentInformation.getConsentStatus() == ConsentInformation.ConsentStatus.REQUIRED) {
            consentForm.show(
                MainActivity.this,
                    new ConsentForm.OnConsentFormDismissedListener() {
                      @Override
                      public void onConsentFormDismissed(@Nullable FormError formError) {
                        // Handle dismissal by reloading form.
                        loadForm();
                      }
                    });
          }
        }
      },
      new UserMessagingPlatform.OnConsentFormLoadFailureListener() {
        @Override
        public void onConsentFormLoadFailure(FormError formError) {
          // Handle the error.
        }
      });
}

Kotlin

private fun loadForm() {
  UserMessagingPlatform.loadConsentForm(
      this,
      { consentForm ->
        this.consentForm = consentForm
        if (consentInformation.consentStatus == ConsentInformation.ConsentStatus.REQUIRED) {
          consentForm.show(this) { formError ->
            // Handle dismissal by reloading form.
            loadForm()
          }
        }
      },
      { formError ->
        // Handle the error.
      }
  )
}

동의가 필요하지 않은 경우 사용자가 동의 상태를 변경할 수 있도록 양식 참조를 유지할 수 있습니다.

테스트

지역 강제 설정

UMP SDK는 마치 기기가 ConsentDebugSettings.BuildersetDebugGeography() 메서드를 사용하여 EEA에 위치한 것처럼 앱 동작을 테스트할 수 있는 방법을 제공합니다.

디버그 기능을 사용하려면 앱의 디버그 설정에 테스트 기기의 해시 ID를 제공해야 합니다. 이 값을 설정하지 않고 requestConsentInfoUpdate()를 호출하면 실행 시 앱에서 필수 ID 해시를 로깅합니다.

자바

ConsentDebugSettings debugSettings = new ConsentDebugSettings.Builder(this)
    .setDebugGeography(ConsentDebugSettings
        .DebugGeography
        .DEBUG_GEOGRAPHY_EEA)
    .addTestDeviceHashedId("TEST-DEVICE-HASHED-ID")
    .build();

ConsentRequestParameters params = new ConsentRequestParameters
    .Builder()
    .setConsentDebugSettings(debugSettings)
    .build();

consentInformation = UserMessagingPlatform.getConsentInformation(this);
consentInformation.requestConsentInfoUpdate(
    this,
    params,
    new ConsentInformation.OnConsentInfoUpdateSuccessListener() {
      @Override
      public void onConsentInfoUpdateSuccess() {
        // The consent information state was updated.
        // You are now ready to check if a form is available.
      }
    },
    new ConsentInformation.OnConsentInfoUpdateFailureListener() {
      @Override
      public void onConsentInfoUpdateFailure(FormError formError) {
        // Handle the error.
      }
    });

Kotlin

val debugSettings = ConsentDebugSettings.Builder(this)
    .setDebugGeography(ConsentDebugSettings
        .DebugGeography
        .DEBUG_GEOGRAPHY_EEA)
    .addTestDeviceHashedId("TEST-DEVICE-HASHED-ID")
    .build()

val params = ConsentRequestParameters
    .Builder()
    .setConsentDebugSettings(debugSettings)
    .build()

consentInformation = UserMessagingPlatform.getConsentInformation(this)
consentInformation.requestConsentInfoUpdate(
    this,
    params,
    {
      // The consent information state was updated.
      // You are now ready to check if a form is available.
    },
    { formError ->
      // Handle the error.
    }
  )

SDK가 기기를 EEA 또는 영국에 없는 것처럼 취급하도록 하려면 DebugGeography.DEBUG_GEOGRAPHY_NOT_EEA를 사용합니다. 디버그 설정은 테스트 기기에서만 작동합니다. 에뮬레이터는 기본적으로 테스트가 사용 설정되어 있으므로 기기 ID 목록에 추가할 필요가 없습니다.

UMP SDK로 앱을 테스트할 때 SDK의 상태를 재설정하면 사용자의 첫 설치 경험을 시뮬레이션할 수 있습니다. 이를 위한 reset 메서드가 제공됩니다.

자바

consentInformation.reset();

Kotlin

consentInformation.reset()

앱 측정 지연 (선택사항)

기본적으로 Google 모바일 광고 SDK는 앱 측정을 초기화하고 앱이 시작되는 즉시 사용자 수준 이벤트 데이터를 Google에 전송하기 시작합니다. 이 초기화 동작을 통해 코드를 추가로 변경하지 않고도 AdMob 사용자 측정항목을 사용할 수 있습니다.

그러나 이 이벤트를 전송하기 전에 앱에 사용자 동의가 필요한 경우 명시적으로 모바일 광고 SDK를 초기화하거나 광고를 로드할 때까지 앱 측정을 지연시킬 수 있습니다.

앱 측정을 지연하려면 AndroidManifest.xml에 다음 <meta-data> 태그를 추가합니다.

<manifest>
     <application>
        <!-- Delay app measurement until MobileAds.initialize() is called. -->
        <meta-data
            android:name="com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT"
            android:value="true"/>
    </application>
</manifest>

미디에이션

미디에이션을 사용하는 경우 앱에서 사용하기로 선택한 동의 프레임워크에 따라 미디에이션 파트너의 동의를 다르게 처리해야 합니다. Google은 IAB 동의 프레임워크를 지원하지만, 자체 맞춤 동의 솔루션을 보유할 수도 있습니다. 다음은 각 옵션에서 미디에이션을 처리하는 방법에 대한 세부정보입니다. Google의 동의 솔루션에 대해 자세히 알아보기

UMP SDK 및 모바일 광고 SDK는 동의 정보를 미디에이션 파트너에게 전달하지 않습니다. 오히려 IAB 솔루션을 사용할 때 UMP SDK는 동의 상태 정보를 로컬 저장소에 기록하며, 적절한 키를 읽는 것은 각 미디에이션 파트너의 SDK의 책임입니다. 각 서드 파티 네트워크에서 IAB 솔루션을 지원하는지 확인하세요.

맞춤 동의 솔루션을 사용하는 경우 앱의 동의 상태를 서드 파티 SDK에 알려야 합니다. 동의 정보를 관련 제3자에게 전달하는 방법에 대한 자세한 내용은 각 미디에이션 파트너의 통합 가이드를 참고하세요.

이 섹션의 코드는 모든 버전의 Google 모바일 광고 SDK에서 사용할 수 있습니다. 이때 동의 SDK를 사용하여 동의를 수집했는지는 고려하지 않습니다.

Google 모바일 광고 SDK는 기본적으로 개인 맞춤 광고를 게재합니다. 사용자가 개인 맞춤이 아닌 광고만 수신하는 데 동의한 경우에는 개인 맞춤이 아닌 광고만 요청하도록 AdRequest 객체를 구성할 수 있습니다. 다음 코드를 사용하면 사용자가 EEA에 거주하는지에 관계없이 개인 맞춤이 아닌 광고를 요청합니다.

자바

Bundle extras = new Bundle();
extras.putString("npa", "1");

AdRequest request = new AdRequest.Builder()
    .addNetworkExtrasBundle(AdMobAdapter.class, extras)
    .build();

Kotlin

val extras = Bundle()
extras.putString("npa", "1")

val request = AdRequest.Builder()
    .addNetworkExtrasBundle(AdMobAdapter::class.java, extras)
    .build()

현재 개인 맞춤이 아닌 광고를 요청하면 광고 요청 URL에 &npa=1이 포함됩니다. 이는 Google 모바일 광고 SDK의 내부 구현사항이며 변경될 수 있습니다.