최근 애드몹 들어가면 올해말까지 GDPR 메시지 작성해야 한다는 경고가 보이기 시작했는데, 원래는 이미 구현했어야 하는건데 그냥 무시하고 있었다. 경고까지 뜨기 시작하니 더 이상 미룰 수 없어서 '이모지박스' 업데이트 준비하면서 같이 구현해보았습니다.
일단 GDPR이 뭔지는 알아야 할 것 같아서 링크 간단히 정리.
요약하면 앱 개인정보보호방침이 있어야 함, 어떤걸 포함할지 옵션 정리하고, GDPR 메시지를 만들고, 앱 내에 UserMessagingPlatform 을 활용해 메시지를 출력해줍니다.
(기존에 admob sdk 를 사용중이면 이미 UserMessagingPlatform 는 포함되어있음. 별도 작업 안해도 됨.)
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 메시지 설정에 따라 거절 버튼이 추가 될 수도 있고, 우 상단에 닫힘 버튼 같은게 추가될수도 있습니다.)
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년)이므로 일단 구현 보류하고 지켜보는 것도 좋을것 같습니다.
끝.
근데 어차피 광고를 꼭 보여줘야하는 상황이라면, 콘솔에서 GDPR 메시지를 만들 때, 동의하지 않음 버튼을 '없음'으로 설정하면 되지 않나요? 무조건 동의만 하게