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

기본 요건

IAB 요구사항이 EU 동의 메시지에 미치는 영향을 참조하세요.

소개

UMP SDK는 게시자가 개인 맞춤 광고에 대한 동의를 요청하고 Apple의 앱 추적 투명성(ATT) 요구사항을 처리하는 도구를 제공합니다. 게시자는 모든 설정이 AdMob 개인정보 보호 및 메시지에서 실행되므로 UMP SDK를 사용하여 단일 양식을 표시하여 이러한 요청 중 하나 또는 둘 다를 처리할 수 있습니다.

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

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

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

SDK 가져오기

CocoaPods (권장)

UMP SDK는 Google 모바일 광고 SDK 7.64.0부터 Google 모바일 광고 SDK 광고 모음의 종속 항목으로 포함됩니다.

SDK를 iOS 프로젝트로 가져오는 가장 간단한 방법은 CocoaPods를 사용하는 것입니다. 프로젝트 Podfile을 열고 다음 행을 앱의 타겟에 추가합니다.

pod 'Google-Mobile-Ads-SDK'

그런 다음 명령 행에서 다음을 실행하세요.

pod install --repo-update

CocoaPods를 처음 사용하는 경우에는 Podfile을 만들고 사용하는 방법에 대한 공식 설명서를 읽어보세요.

수동 다운로드

SDK 다운로드

그런 다음 프레임워크를 필요한 경우 Xcode 프로젝트로 드래그하여 필요한 경우 항목 복사를 선택합니다.

그런 다음 다음을 사용하여 필요한 모든 파일에 프레임워크를 포함할 수 있습니다.

Swift

import UserMessagingPlatform

Objective-C

#include <UserMessagingPlatform/UserMessagingPlatform.h>

Info.plist 업데이트

앱 ID를 Info.plist에 추가

고객센터 안내에 따라 앱 ID를 가져옵니다.

앱 ID를 Info.plist에 추가합니다.

<key>GADApplicationIdentifier</key>
<string>YOUR-APP-ID</string>

앱 추적 투명성

UMP SDK를 사용하여 Apple의 앱 추적 투명성 요구사항을 처리하려는 경우 AdMob 개인정보 보호 및 메시지를 사용하여 ATT 메시지를 만들고, 구성하고, 게시해야 합니다.

UMP SDK가 커스텀 알림 메시지를 표시하려면 Info.plist를 업데이트하여 사용을 설명하는 커스텀 메시지 문자열과 함께 NSUserTrackingUsageDescription 키를 추가합니다.

<key>NSUserTrackingUsageDescription</key>
<string>This identifier will be used to deliver personalized ads to you.</string>

동의 양식을 제시할 때 사용 설명이 ATT 대화상자의 일부로 표시됩니다.

그런 다음, AppTrackingTransparency 프레임워크를 연결해야 합니다.

테스트하는 동안 Apple의 요구사항에 따라 IDFA ATT 대화상자는 일회성 요청이므로 requestTrackingAuthorization:에서 한 번만 표시됩니다. 알림이 두 번째로 표시되도록 하려면 테스트 기기에서 앱을 제거한 후 재설치해야 합니다.

SDK 사용

SDK는 선형으로 사용하도록 설계되었습니다. SDK를 사용하는 단계는 다음과 같습니다.

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

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

이 메서드는 기본 스레드에서만 호출해야 합니다.

Swift

// Create a UMPRequestParameters object.
let parameters = UMPRequestParameters()
// Set tag for under age of consent. Here false means users are not under age.
parameters.tagForUnderAgeOfConsent = false

// Request an update to the consent information.
UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(
    with: parameters,
    completionHandler: { error in
      if error != nil {
        // Handle the error.
      } else {
        // The consent information state was updated.
        // You are now ready to check if a form is
        // available.
      }
    })

Objective-C

// Create a UMPRequestParameters object.
UMPRequestParameters *parameters = [[UMPRequestParameters alloc] init];
// Set tag for under age of consent. Here NO means users are not under age.
parameters.tagForUnderAgeOfConsent = NO;

// Request an update to the consent information.
[UMPConsentInformation.sharedInstance
    requestConsentInfoUpdateWithParameters:parameters
                         completionHandler:^(NSError *_Nullable error) {
                           if (error) {
                             // Handle the error.
                           } else {
                             // The consent information state was updated.
                             // You are now ready to check if a form is
                             // available.
                           }
                         }];

가능한 경우 양식 로드

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

동의를 받기 위한 양식은 AdMob UI에서 생성됩니다. 사용자에게 동의를 요청할지 결정했다면 다음 단계는 양식의 사용 가능 여부입니다. 양식을 사용할 수 없는 이유는 다음과 같습니다.

  • 사용자가 광고 추적을 제한하도록 설정되어 있습니다.
  • 사용자를 동의 연령 미만으로 태그했습니다.

사용 가능한 양식이 있는지 확인하려면 UMPConsentInformation 유형의 formStatus 속성을 사용하세요. 이 속성은 UMPFormStatus 유형의 열거형을 반환합니다. UMPFormStatus에는 3가지 값이 있을 수 있습니다.

  • UMPFormStatusUnknown: 양식 상태를 알 수 없음 이 경우 requestConsentInfoUpdateWithParameters:completionHandler:를 호출해야 합니다.
  • UMPFormStatusAvailable: 동의 양식을 사용할 수 있으며 로드할 수 있습니다.
  • UMPFormStatusUnavailable: 동의 양식을 사용할 수 없습니다.

다음과 같이 양식을 로드하는 래퍼 메서드를 추가합니다.

Swift

// Request an update to the consent information.
UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(
    withParameters: parameters,
    completionHandler: { [self] error in

      // The consent information has updated.
      if error != nil {
        // Handle the error.
      } else {
        // The consent information state was updated.
        // You are now ready to see if a form is available.
        let formStatus = UMPConsentInformation.sharedInstance.formStatus
        if formStatus == UMPFormStatus.available {
          loadForm()
        }
      }
    })
...
func loadForm() {

}

Objective-C

// Request an update to the consent information.
[UMPConsentInformation.sharedInstance
    requestConsentInfoUpdateWithParameters:parameters
                         completionHandler:^(NSError* _Nullable error) {

                           // The consent information has updated.
                           if (error) {
                             // Handle the error.
                           } else {
                             // The consent information state was updated.
                             // You are now ready to see if a form is available.
                             UMPFormStatus formStatus =
                                 UMPConsentInformation.sharedInstance
                                     .formStatus;
                             if (formStatus == UMPFormStatusAvailable) {
                               [self loadForm];
                             }
                           }
                         }];
...
- (void) loadForm {

}

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

Swift

func loadForm() {
  UMPConsentForm.load(
      withCompletionHandler: { form, loadError in
        if loadError != nil {
          // Handle the error
        } else {
          // Present the form
        }
      })
}

Objective-C

- (void)loadForm {
  [UMPConsentForm
      loadWithCompletionHandler:^(UMPConsentForm *form, NSError *loadError) {
        if (loadError) {
          // Handle the error
        } else {
          // Present the form
        }
      }];
}

필요한 경우 양식 제시

동의 양식을 표시하려면 UMPConsentForm 클래스의 presentFromViewController:completionHandler: 메서드를 사용하세요. 양식을 표시하기 전에 사용자의 동의가 필요한지 확인해야 합니다. 동의가 필요한지 확인하려면 UMPConsentInformation 객체의 consentStatus 속성을 확인하면 UMPConsentStatus 유형의 열거형이 반환됩니다. UMPConsentStatus에는 네 가지 가능한 값이 있습니다.

  • UMPConsentStatusUnknown: 동의 상태를 알 수 없습니다.
  • UMPConsentStatusRequired: 사용자 동의가 필요하지만 아직 획득하지 못했습니다.
  • UMPConsentStatusNotRequired: 사용자 동의가 필요하지 않습니다. 예를 들어 사용자가 EEA 또는 영국에 거주하지 않는 경우
  • UMPConsentStatusObtained: 사용자 동의를 받았습니다. 맞춤설정이 정의되어 있지 않습니다.

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

Swift

func loadForm() {
  UMPConsentForm.load(withCompletionHandler: { form, loadError in
    if loadError != nil {
      // Handle the error.
    } else {
      // Present the form. You can also hold on to the reference to present
      // later.
      if UMPConsentInformation.sharedInstance.consentStatus == UMPConsentStatus.required {
        form?.present(
            from: self,
            completionHandler: { dismissError in
              if UMPConsentInformation.sharedInstance.consentStatus == UMPConsentStatus.obtained {
                // App can start requesting ads.
              }

            })
      } else {
        // Keep the form available for changes to user consent.
      }
    }
  })
}

Objective-C

- (void)loadForm {
  [UMPConsentForm loadWithCompletionHandler:^(UMPConsentForm *form,
                                              NSError *loadError) {
    if (loadError) {
      // Handle the error.
    } else {
      // Present the form. You can also hold on to the reference to present
      // later.
      if (UMPConsentInformation.sharedInstance.consentStatus ==
          UMPConsentStatusRequired) {
        [form
            presentFromViewController:self
                    completionHandler:^(NSError *_Nullable dismissError) {
                      if (UMPConsentInformation.sharedInstance.consentStatus ==
                          UMPConsentStatusObtained) {
                        // App can start requesting ads.
                      }

                    }];
      } else {
        // Keep the form available for changes to user consent.
      }
    }
  }];
}

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

테스트

지역 강제 설정

UMP SDK를 사용하면 기기가 UMPDebugSettingsUMPDebugGeography 유형의 debugGeography 속성을 사용하여 기기가 EEA 또는 영국에 있는 것처럼 앱 동작을 간편하게 테스트할 수 있습니다.

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

Swift

let parameters = UMPRequestParameters()
let debugSettings = UMPDebugSettings()
debugSettings.testDeviceIdentifiers = ["TEST-DEVICE-HASHED-ID"]
debugSettings.geography = UMPDebugGeography.EEA
parameters.debugSettings = debugSettings
UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(
    with: parameters,
    completionHandler: { error in
      ...
    })

Objective-C

UMPRequestParameters *parameters = [[UMPRequestParameters alloc] init];
UMPDebugSettings *debugSettings = [[UMPDebugSettings alloc] init];
debugSettings.testDeviceIdentifiers = @[ @"TEST-DEVICE-HASHED-ID" ];
debugSettings.geography = UMPDebugGeographyEEA;
parameters.debugSettings = debugSettings;
[UMPConsentInformation.sharedInstance
    requestConsentInfoUpdateWithParameters:parameters
                         completionHandler:^(NSError *_Nullable error){
                           ...
}];

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

UMP SDK로 앱을 테스트할 때 사용자의 첫 설치 경험을 시뮬레이션할 수 있도록 SDK 상태를 재설정하는 것이 도움이 될 수 있습니다. SDK는 이를 위해 reset 메서드를 제공합니다.

Swift

UMPConsentInformation.sharedInstance.reset()

Objective-C

[UMPConsentInformation.sharedInstance reset];

프로젝트에서 UMP SDK를 완전히 삭제하기로 한 경우에도 초기화를 호출해야 합니다.

앱 측정 지연 (선택사항)

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

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

앱 측정을 지연하려면 앱의 Info.plist에 부울 값이 YESGADDelayAppMeasurementInit 키를 추가하세요. 프로그래매틱 방식으로 다음과 같이 변경하거나

<key>GADDelayAppMeasurementInit</key>
<true/>

속성 목록 편집기에서 다음과 같이 수정할 수 있습니다.

미디에이션

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

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

맞춤 동의 솔루션을 사용하고 있다면 앱의 동의 상태를 제3자 SDK에 알릴 책임은 개발자에게 있습니다. 제3자에게 동의 정보를 전달하는 방법에 대한 자세한 내용은 각 미디에이션 파트너의 통합 가이드를 참조하세요.

The code in this section can be used with any version of the Google Mobile Ads SDK. It can also be used regardless of whether you used the Consent SDK to gather consent.

The default behavior of the Google Mobile Ads SDK is to serve personalized ads. If a user has consented to receive only non-personalized ads, you can configure an GADRequest object to specify that only non-personalized ads should be requested. The following code causes non-personalized ads to be requested regardless of whether or not the user is in the EEA:

Swift

let request = GADRequest()
let extras = GADExtras()
extras.additionalParameters = ["npa": "1"]
request.register(extras)

Objective-C

GADRequest *request = [GADRequest request];
GADExtras *extras = [[GADExtras alloc] init];
extras.additionalParameters = @{@"npa": @"1"};
[request registerAdNetworkExtras:extras];

If non-personalized ads are requested, the ad request URL currently includes &npa=1. However, note that this is an internal implementation detail of the Google Mobile Ads SDK and is subject to change.