유럽 지역 사용자의 동의 요청

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

이 정책에 따른 게시자의 의무사항 준수를 지원하기 위해 Google에서는 동의 SDK를 제공하고 있습니다. 동의 SDK는 사용자의 동의를 수집하는 유틸리티 기능을 제공하는 오픈소스 라이브러리입니다. 전체 소스 코드는 GitHub에서 가져올 수 있습니다.

Google에서 게재하는 광고는 개인 맞춤 광고 또는 개인 맞춤이 아닌 광고로 분류할 수 있습니다(둘 다 EEA 사용자의 동의가 필요함). 기본적으로 Google로 보내는 광고 요청에서는 개인 맞춤 광고가 게재되며, 이전에 수집한 사용자 관련 데이터에 따라 광고를 선택합니다. 또한 Google에서는 개인 맞춤이 아닌 광고를 게재하기 위한 광고 요청 구성도 지원합니다. 개인 맞춤 광고 및 개인 맞춤이 아닌 광고 자세히 알아보기

이 가이드에서는 동의 SDK를 활용하여 사용자 동의를 얻는 방법을 설명합니다. 또한 동의를 얻은 후 Google 모바일 광고 SDK에 동의를 전달하는 방법에 대해서도 설명합니다.

기본 요건

CocoaPods(권장)

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

pod 'PersonalizedAdConsent'

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

pod install --repo-update

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

수동 다운로드

SDK의 소스를 직접 다운로드하거나 복제한 후 다음 안내에 따라 프로젝트에 소스를 포함할 수도 있습니다.

  1. 찾기 도구에서 PersonalizedAdConsent.xcodeproj파일을 프로젝트에 드래그합니다.

  2. Build Phases(빌드 단계) 탭으로 이동합니다. Target Dependencies(타겟 종속성)에서 + 버튼을 클릭하고 PersonalizedAdConsent 타겟을 추가합니다.

  3. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Add Files to "MyProject"('내 프로젝트'에 파일 추가)를 선택합니다. PersonalizedAdConsent.bundle로 이동합니다. Create folder references(폴더 참조 만들기)를 선택하세요.

    이 작업이 완료되면 Copy Bundle Resources(번들 리소스 복사) 섹션의 Build Phases(빌드 단계) 탭에 PersonalizedAdConsent.bundle이 표시됩니다.

동의 SDK의 다른 메서드를 사용하기 전에 동의 상태를 업데이트하여 AdMob UI에서 선택한 광고 기술 제공업체 관련 최신 정보를 동의 SDK에 적용해야 합니다. 사용자가 마지막으로 동의한 후 광고 기술 제공업체 목록이 변경되었다면 동의 상태가 알 수 없음으로 돌아갑니다.

미디에이션을 사용하지 않는 경우

미디에이션을 사용하지 않는 경우에는 동의 SDK를 구현하여 동의를 수집하는 옵션이 2개입니다.

먼저, 동의 SDK를 사용하여 Google에서 렌더링한 동의 양식을 사용자에게 제공하는 옵션이 있습니다. 동의 양식에는 AdMob UI에서 선택한 광고 기술 제공업체의 목록이 표시되며 동의 SDK에 사용자 동의 응답이 저장됩니다.

다른 옵션은 동의 SDK를 사용하여 AdMob에서 광고 기술 제공업체의 전체 목록을 동적으로 가져오는 방법입니다(게시자 관리 동의 수집 참고). 이 경우에는 사용자에게 제공업체 목록을 제공하는 방법을 정하고 자체 동의 양식을 사용자에게 제공해야 합니다.

사용자가 동의를 선택하면 동의 SDK에 사용자의 동의 선택을 저장하도록 요청할 수 있습니다(게시자 관리 동의 저장의 설명 참고).

동의를 수집할 때 사용자가 개인 맞춤이 아닌 광고만 수신하는 데 동의했다면 Google 모바일 광고 SDK에 동의를 전달해야 합니다.

AdMob 미디에이션을 사용하는 경우

동의 SDK를 사용하여 AdMob에서 광고 기술 제공업체의 전체 목록을 동적으로 가져올 수 있습니다(게시자 관리 동의 수집 참고). 동의를 위해 다른 광고 네트워크에서 사용자에게 제시해야 하는 광고 기술 제공업체를 정해야 합니다.

앱 개발자는 동의 SDK가 반환한 광고 기술 제공업체와 다른 광고 네트워크의 제공업체 모두에 대해 사용자 동의를 수집해야 합니다. 또한 사용자가 개인 맞춤이 아닌 광고만 수신하는 데 동의한 경우에는 사용자 동의 응답을 직접 저장하고 동의를 Google 모바일 광고 SDK에 전달해야 합니다.

현재 Google에서는 미디에이션 네트워크에 대한 동의를 받거나 처리하지 못하므로 각 광고 네트워크에 대한 동의를 개별적으로 받아서 처리해야 합니다. Google에서는 업데이트된 설명서를 통해 오픈소스 및 버전이 지정된 미디에이션 네트워크 전체에 동의 전달 방법에 대한 세부정보를 적극적으로 제공하고 있습니다. 아래의 미디에이션 네트워크의 경우 온라인 설명서가 이미 제공되고 있습니다.

동의 상태 업데이트

동의 SDK를 사용할 때 앱을 실행할 때마다 사용자의 동의 상태를 확인하는 것이 좋습니다. 이렇게 하려면 PACConsentInformation 인스턴스에서 requestConsentInfoUpdateForPublisherIdentifiers:completionHandler:를 호출하세요.

Swift

import PersonalizedAdConsent
...
class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    PACConsentInformation.sharedInstance.
    requestConsentInfoUpdate(
    forPublisherIdentifiers: ["pub-0123456789012345"])
    {(_ error: Error?) -> Void in
      if let error = error {
        // Consent info update failed.
      } else {
        // Consent info update succeeded. The shared PACConsentInformation
        // instance has been updated.
      }
    }
  }

Objective-C

#import <PersonalizedAdConsent/PersonalizedAdConsent.h>
...
@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  [PACConsentInformation.sharedInstance
      requestConsentInfoUpdateForPublisherIdentifiers:@[ @"pub-0123456789012345" ]
          completionHandler:^(NSError *_Nullable error) {
            if (error) {
              // Consent info update failed.
            } else {
              // Consent info update succeeded. The shared PACConsentInformation
              // instance has been updated.
            }
          }];
}

requestConsentInfoUpdateForPublisherIdentifiers:completionHandler: 호출에서는 다음과 같은 두 개의 인수가 필요합니다.

  • 앱에서 광고를 요청하는 일련의 유효하고 완전히 활성화된 게시자 ID입니다. 게시자 ID를 찾으세요.

  • NSError를 입력 매개변수로 허용하는 블록. 실패한 동의 업데이트 요청에 대한 정보를 제공합니다.

동의 정보가 성공적으로 업데이트되면 PACConsentInformation.sharedInstance.consentStatus에서 업데이트된 동의 상태를 제공합니다. 동의 상태에 적용될 수 있는 값은 다음과 같습니다.

동의 상태 정의
PACConsentStatusPersonalized 사용자가 개인 맞춤 광고에 대해 동의했습니다.
PACConsentStatusNonPersonalized 사용자가 개인 맞춤이 아닌 광고에 대해 동의했습니다.
PACConsentStatusUnknown 사용자가 개인 맞춤 광고 또는 개인 맞춤이 아닌 광고에 대해 동의하지도 거부하지도 않았습니다.

동의 정보가 성공적으로 업데이트되면 PACConsentInformation.sharedInstance.requestLocationInEEAOrUnknown을 통해 사용자가 유럽 경제 지역에 거주하는지 또는 요청 위치를 알 수 없는지를 확인할 수 있습니다.

requestLocationInEEAOrUnknown 속성이 NO이면 사용자가 유럽 경제 지역에 거주하지 않는 것으로 EU 사용자 동의 정책에 동의하지 않아도 됩니다. Google 모바일 광고 SDK에 광고를 요청할 수 있습니다.

requestLocationInEEAOrUnknown 속성이 YES 인 경우:

  • PACConsentStatusPACConsentStatusPersonalized 또는 PACConsentStatusNonPersonalized이면 사용자가 이미 동의한 것입니다. 이제 동의를 Google 모바일 광고 SDK에 전달할 수 있습니다.

  • 사용자가 PACConsentStatusUnknown 동의를 한 경우 동의를 수집하는 유틸리티 메서드의 사용에 대해 설명한 아래의 동의 수집 섹션을 참고하세요.

Google의 동의 SDK 에서는 두 가지 방법으로 사용자 동의를 수집할 수 있습니다.

사용자에게 동의 변경 또는 철회 옵션을 제공해야 합니다.

Google이 렌더링한 동의 양식은 앱의 콘텐츠 위에 전체 화면으로 표시됩니다. 사용자에게 다음과 같은 옵션의 조합이 표시되도록 동의 양식을 구성할 수 있습니다.

  • 개인 맞춤 광고 보기에 대한 동의
  • 개인 맞춤이 아닌 광고 보기에 대한 동의
  • 광고를 보는 대신 유료 버전의 앱 사용

동의 문구를 신중하게 검토해야 합니다. 기본으로 표시되는 문구는 Google을 활용해 앱에서 수익을 창출하는 경우에 적합할 수 있는 메시지입니다. 단, Google에서는 게시자에게 적합한 동의 문구에 대해 법률 자문을 제공할 수 없습니다. Google이 렌더링한 동의 양식의 동의 문구를 업데이트하려면 필요에 따라 동의 SDK에 포함된 consentform.html 파일을 수정하세요.

Google이 렌더링한 동의 양식은 PACConsentForm 클래스를 이용해 구성 및 표시됩니다. 다음 코드에는 세 가지 양식 옵션이 모두 적용된 PACConsentForm을 생성하는 방법이 나와 있습니다.

Swift

// TODO: Replace with your app's privacy policy url.
guard let privacyUrl = URL(string: "https://www.your.com/privacyurl"),
  let form = PACConsentForm(applicationPrivacyPolicyURL: privacyUrl) else {
    print("incorrect privacy URL.")
    return
}
form.shouldOfferPersonalizedAds = true
form.shouldOfferNonPersonalizedAds = true
form.shouldOfferAdFree = true

Objective-C

// TODO: Replace with your app's privacy policy url.
NSURL *privacyURL = [NSURL URLWithString:@"https://www.your.com/privacyurl"];
PACConsentForm *form = [[PACConsentForm alloc] initWithApplicationPrivacyPolicyURL:privacyURL];
form.shouldOfferPersonalizedAds = YES;
form.shouldOfferNonPersonalizedAds = YES;
form.shouldOfferAdFree = YES;

PACConsentForm의 속성에 대해서는 아래에서 자세히 설명합니다.

shouldOfferPersonalizedAds
동의 양식에 개인 맞춤 광고 옵션이 표시되어야 하는지를 나타냅니다. 기본값은 YES입니다.
shouldOfferNonPersonalizedAds
동의 양식에 개인 맞춤이 아닌 광고 옵션이 표시되어야 하는지를 나타냅니다. 기본값은 YES입니다.
shouldOfferAdFree
동의 양식에 무광고 앱 옵션이 표시되어야 하는지를 나타냅니다. 기본값은 NO입니다.

PACConsentForm 객체를 만들고 구성한 후에는 아래와 같이 PACConsentFormloadWithCompletionHandler: 메서드를 실행하여 동의 양식을 로드하세요.

Swift

form.load {(_ error: Error?) -> Void in
  print("Load complete.")
  if let error = error {
    // Handle error.
    print("Error loading form: \(error.localizedDescription)")
  } else {
    // Load successful.
  }
}

Objective-C

[form loadWithCompletionHandler:^(NSError *_Nullable error) {
  NSLog(@"Load complete. Error: %@", error);
  if (error) {
    // Handle error.
  } else {
    // Load successful.
  }
}];

사용자에게 Google이 렌더링한 동의 양식을 제공하려면 로드된 PACConsentForm에서 presentFromViewController:dismissCompletion:을 호출하세요(아래 참고).

Swift

form.present(from: self) { (error, userPrefersAdFree) in
      if let error = error {
        // Handle error.
      } else if userPrefersAdFree {
        // User prefers to use a paid version of the app.
      } else {
        // Check the user's consent choice.
        let status =
             PACConsentInformation.sharedInstance.consentStatus
      }
    }

Objective-C

 [form presentFromViewController:self
     dismissCompletion:^(NSError *_Nullable error, BOOL userPrefersAdFree) {
       if (error) {
         // Handle error.
       } else if (userPrefersAdFree) {
         // The user prefers to use a paid version of the app.
       } else {
         // Check the user's consent choice.
         PACConsentStatus status =
             PACConsentInformation.sharedInstance.consentStatus;
       }
     }];

presentFromViewController:dismissCompletion: 호출에서는 다음과 같은 두 개의 인수가 필요합니다.

  • 양식을 제공할 UIViewController

  • NSErrorBOOL을 입력 매개변수로 허용하는 블록. 동의 양식을 표시하는 과정에서 오류가 발생하면 NSError를 통해 정보를 제공합니다. 사용자가 광고를 보는 대신 유료 버전의 앱을 사용하기로 선택한 경우에는 userPrefersAdFree BOOLYES 값이 적용됩니다.

사용자가 옵션을 선택하고 양식을 닫으면 동의 SDK가 사용자의 선택 정보를 저장하고 dismissCompletion: 블록을 호출합니다. 사용자의 선택 정보를 읽고 동의를 Google 모바일 광고 SDK에 전달할 수 있습니다.

게시자 관리 동의 수집

동의를 직접 수집하기로 선택한 경우 PACConsentInformation 클래스의 adProviders 속성을 이용해 앱에서 사용된 게시자 ID와 연결된 광고 기술 제공업체를 가져올 수 있습니다. 게시자 ID로 구성된 광고 기술 제공업체의 전체 목록에 대해 동의가 필요합니다.

PACConsentInformationadProviders 속성에 액세스하기 전에 사용자의 동의 상태가 성공적으로 업데이트될 때까지 기다려야 합니다 (업데이트 동의 상태 섹션 참고).

Swift

let adProviders = PACConsentInformation.sharedInstance.adProviders

Objective-C

NSArray *adProviders = PACConsentInformation.sharedInstance.adProviders;

그런 다음 광고 기술 제공업체 목록을 사용하여 동의를 직접 받을 수 있습니다.

동의를 받았을 때 PACConsentInformation 클래스의 status 속성을 이용해 사용자의 응답에 해당하는 PACConsentStatus를 기록하세요.

Swift

PACConsentInformation.sharedInstance.consentStatus = .personalized

Objective-C

PACConsentInformation.sharedInstance.consentStatus = PACConsentStatusPersonalized;

동의 SDK에 동의를 보고한 후 동의를 Google 모바일 광고 SDK에 전달할 수 있습니다.

사용자가 동의를 업데이트할 수 있게 하려면, 사용자가 동의 상태를 업데이트하기로 선택할 때 동의 수집 섹션에 설명된 단계를 반복하기만 하면 됩니다.

사용자가 동의 연령 미만임을 게시자가 알고 있는 경우 모든 광고 요청에서 TFUA(유럽 동의 연령 미만 사용자용 태그)를 설정해야 합니다. 앱에서 실행하는 모든 광고 요청에 이 태그를 포함하려면 tagForUnderAgeOfConsent 속성을 YES로 설정하세요. 이 설정은 이후의 모든 광고 요청에 적용됩니다.

Swift

PACConsentInformation.sharedInstance.isTaggedForUnderAgeOfConsent = true

Objective-C

PACConsentInformation.sharedInstance.tagForUnderAgeOfConsent = YES;

TFUA 설정을 사용하면 Google이 렌더링한 동의 양식이 로드되지 않습니다. TFUA가 포함된 광고 요청으로는 개인 맞춤 광고 및 리마케팅을 사용할 수 없습니다. TFUA는 광고 측정 픽셀 및 외부 광고 서버와 같은 제3자 광고 기술 제공업체에 대한 요청을 비활성화합니다.

광고 요청에서 TFUA를 삭제하려면 tagForUnderAgeOfConsent 속성을 NO로 설정하세요.

테스트

동의 SDK는 PACConsentInformation.sharedInstance.requestLocationInEEAOrUnknown의 값에 따라 작동 방식이 달라집니다. 예를 들어 사용자가 EEA에 거주하지 않으면 동의 양식이 로드되지 않습니다.

동의 SDK는 EEA 안팎에서 앱을 더 쉽게 테스트할 수 있도록 디버그 옵션을 지원합니다. 이 옵션은 동의 SDK의 다른 메서드를 호출하기 전에 설정할 수 있습니다.

  1. 기기의 광고 ID를 가져옵니다. 다음 코드를 사용하여 광고 ID를 기록할 수 있습니다.

    #import <AdSupport/AdSupport.h>
    // ...
    
    NSLog(@"Advertising ID: %@",
          ASIdentifierManager.sharedManager.advertisingIdentifier.UUIDString);

    그런 다음 콘솔에서 확인하세요.

    Advertising ID: 41E538F6-9C98-4EF2-B3EE-D7BD8CAF8339
  2. 콘솔의 광고 ID를 이용해 내 기기를 허용 목록에 디버그 기기로 등록하세요.

    PACConsentInformation.sharedInstance.debugIdentifiers =
        @[ @"41E538F6-9C98-4EF2-B3EE-D7BD8CAF8339" ];
  3. 마지막으로, 테스트를 위해 debugGeography를 원하는 지역으로 설정합니다.

    // Geography appears as in EEA for debug devices.
    PACConsentInformation.sharedInstance.debugGeography = PACDebugGeographyEEA;
    // Geography appears as not in EEA for debug devices.
    PACConsentInformation.sharedInstance.debugGeography = PACDebugGeographyNotEEA;

이 단계를 완료하면 동의 상태 업데이트 호출에서 디버그 지역을 고려합니다.

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

Google 모바일 광고 SDK는 기본적으로 개인 맞춤 광고를 게재합니다. 사용자가 개인 맞춤이 아닌 광고만 수신하는 데 동의한 경우에는 개인 맞춤이 아닌 광고만 요청하도록 GADRequest 객체를 구성할 수 있습니다. 다음 코드를 사용하면 사용자가 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];

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

앱 측정 지연(선택사항)

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

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

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

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

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

FAQ

동의 SDK에서는 몇 군데의 광고 기술 제공업체를 지원하나요?
동의 SDK에서는 게시자가 사용하기로 선택하는 광고 기술 제공업체의 수에 제한을 두지 않습니다.
AdMob UI에서 내 선택 정보를 변경하면 SDK에서 반환한 광고 기술 제공업체 목록이 자동으로 업데이트되나요?
예, 맞습니다. AdMob UI에서 광고 기술 제공업체 목록을 변경하면 약 1시간 후에 변경사항이 Google 광고 서버에 전송됩니다.