애드몹 GDPR 메시지 대응하기

liko apps·2023년 7월 10일
1

iOS 앱 개발

목록 보기
1/2

최신 대응 내용은 링크 를 참고해주세요.


최근 애드몹 들어가면 올해말까지 GDPR 메시지 작성해야 한다는 경고가 보이기 시작했는데, 원래는 이미 구현했어야 하는건데 그냥 무시하고 있었다. 경고까지 뜨기 시작하니 더 이상 미룰 수 없어서 '이모지박스' 업데이트 준비하면서 같이 구현해보았습니다.


GDPR 이란?

일단 GDPR이 뭔지는 알아야 할 것 같아서 링크 간단히 정리.


애드몹 GDPR 메시지 작성 단계


애드몹 GDPR 메시지 구현하기

  1. Admob GDPR 메시지 작성하기
  • 애드몹 -> 개인정보 보호 및 메시지 -> GDPR -> 메시지 만들기 -> 가이드 따라서 잘 작성합니다.

2. Admob GDPR 구현하기

(기존에 admob sdk 를 사용중이면 이미 UserMessagingPlatform 는 포함되어있음. 별도 작업 안해도 됨.)

  1. 코드 구현 순서는 다음과 같습니다.

1) ATT (광고 식별자 추적) 요청을 먼저한다. (그래야 GDPR form이 로드 됨)
2) GDPR 메시지 폼을 로드한다.
3) 사용자에게 노출해야 하는지 확인한다. (영국+유럽인 경우만 노출하면 되겠죠? - 애드몹 설정에서 전체 국가 노출도 가능, 메시지 설정에 달려있음)
4) 사용자에게 노출 가능하면 GDPR 메시지를 노출한다.
5) GDPR 메시지 - 사용자 승인 / 거절 확인

1) 이전에 GDPR 요청한 상태를 확인 후 요청한 적이 없으면 GDPR 폼을 로드
2) GDPR 폼 로드하면 GDPR 메시지 노출한다.
3) GDPR 승인 여부 확인
3.1) GDPR 사용자 승인 시 -> 광고 식별자 추적 요청하기
3.2) GDPR 사용자 거부 시 -> 애드몹 광고 로드 안됨 !!!
-> 광고 로드가 안되기 때문에 유료 구독/구매 (광고 제거 등)를 한 경우에만 진행 된다고 가이드해주기
or GDPR 승인해야 사용 할 수 있다고 해주기 (GDPR 요청 리셋 기능 활용)

(GDPR 메시지 설정에 따라 거절 버튼이 추가 될 수도 있고, 우 상단에 닫힘 버튼 같은게 추가될수도 있습니다.)

  1. 구현 예시
private func prepareGDPRMessage(completionHandler: @escaping () -> Void) {
        #if DEBUG
            // TODO: GDPR 테스트시에만 사용하기
            // https://developers.google.com/admob/ios/privacy?hl=ko#present-form
            UMPConsentInformation.sharedInstance.reset()

            let parameters = UMPRequestParameters()
            let debugSettings = UMPDebugSettings()

            debugSettings.testDeviceIdentifiers = [ASIdentifierManager.shared().advertisingIdentifier.uuidString]
            debugSettings.geography = UMPDebugGeography.EEA
            parameters.debugSettings = debugSettings

        #else
            let parameters = UMPRequestParameters()
            parameters.tagForUnderAgeOfConsent = false
        #endif
        
        UMPConsentInformation.sharedInstance
            .requestConsentInfoUpdate(with: parameters,
                                      completionHandler: { [self] error in
                                          // The consent information has updated.
                                          if error != nil {
                                              self.completionHandler()
                    
                                          } 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 {
                                                  self.loadGDPRForm(completionHandler: completionHandler)
                                              } else {
                                                  self.completionHandler()
                                              }
                                          }
                                      })
    }
    
    private func loadGDPRForm(completionHandler: @escaping () -> Void) {
        UMPConsentForm.load(completionHandler: { [self] form, loadError in
            if loadError != nil {
                // Handle the error.
                self.completionHandler()
                
            } else {
                // Present the form. You can also hold on to the reference to present
                // later.
                if let vc = UIApplication.topViewController(), UMPConsentInformation.sharedInstance.consentStatus == UMPConsentStatus.required {
                    Log.d("UMPConsentInformation.sharedInstance.consentStatus : \(UMPConsentInformation.sharedInstance.consentStatus)")
                    
                    form?.present(
                        from: vc,
                        completionHandler: { dismissError in
                            if UMPConsentInformation.sharedInstance.consentStatus == UMPConsentStatus.obtained {
                                // App can start requesting ads.
                                self.completionHandler()
                                return
                            }
                            
                            // Handle dismissal by reloading form.
                            self.loadGDPRForm(completionHandler: completionHandler)
                        })
                } else {
                    // Keep the form available for changes to user consent.
                    self.completionHandler()
                }
            }
        })
    }

SwiftUI 에서 구현한거라 vc를 가져오는 방식이 UIApplication.topViewController() 이런식인데 UIKit이면 현재 vc를 전달하면 되고, SwiftUI이면 UIViewControllerRepresentable 등을 활용해도 됩니다.

앱 업데이트시에는 사용자에게 바로 요청하고,
신규 사용자의 경우는 온보딩 단계에서 광고 식별자 접근 요청을 한 뒤에 사용자가 접근 허가를 하면 위 코드를 호출해서 GDPR 메시지를 전달하면 됩니다.


마무리

GDPR 동의하지 않은 경우 애드몹은 어떤 광고도 내려주지 않습니다. (광고를 위해 기기에 일부 데이터를 저장해야 하는데 이 저장 승인 여부까지가 GDPR 요청이라서) 그렇기 때문에 광고앱의 경우 광고가 아예 노출이 안될 수 있어서 (no ads, no fill 상태) 이때 광고 제거 상품을 구독/구입해야 진행되게 처리하거나, GDPR을 반드시 승인받고 앱을 사용할 수 있는 별도의 UX가 필요합니다.

애드몹의 GDPR 구현 기준이 올해말까지 (2023년)이므로 일단 구현 보류하고 지켜보는 것도 좋을것 같습니다.


최신 대응 내용은 링크 를 참고해주세요.


끝.

profile
제주에서 iOS 앱을 만들고 있습니다. 개발관련 회고 / 정리 블로그

2개의 댓글

comment-user-thumbnail
2023년 11월 26일

근데 어차피 광고를 꼭 보여줘야하는 상황이라면, 콘솔에서 GDPR 메시지를 만들 때, 동의하지 않음 버튼을 '없음'으로 설정하면 되지 않나요? 무조건 동의만 하게

1개의 답글