Por quê?
Agora somos obrigados a adicionar uma mensagem de consentimento do GDPR aos nossos apps após 16 de janeiro de 2024, por causa dos requisitos do EEE de exibir anúncios para usuários na Europa.
Se não fizermos isso, a receita com os anúncios será bastante impactada.
Como?
Você pode assistir a este vídeo oficial do Google AdMob para aprender como implementar isso.
No entanto, como sempre, a documentação do Google só mostra a forma de adicionar isso com UIKit, não com SwiftUI.
Exemplo em SwiftUI
Depois de um dia explorando, finalmente consegui fazer funcionar usando SwiftUI puro.
Na verdade, é bem simples:
import SwiftUIimport UserMessagingPlatform
struct ContentView: View { @AppStorage("gdprConsentShown") var gdprConsentShown = false
var body: some View { VStack { } .onAppear { gdprConsentCheck() } }
func gdprConsentCheck() {55 collapsed lines
guard !gdprConsentShown else { return }
// Create a UMPRequestParameters object. let parameters = UMPRequestParameters() let debugSettings = UMPDebugSettings () // - This is for mimicking EEA users when you're outside the EU. // - Use a simulator so you can read the consent form. debugSettings.geography = .EEA parameters.debugSettings = debugSettings
// Set tag for under age of consent. false means users are not under the age of consent. If you turn this on, no consent form is presented. parameters.tagForUnderAgeOfConsent = false
// Request an update for the consent information. UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(with: parameters) { (requestConsentError) in if let consentError = requestConsentError { // Consent gathering failed. return print("Error: \(consentError.localizedDescription)") } // Load and present the consent form. loadAndPresentConsentForm() } }
func loadAndPresentConsentForm() { UMPConsentForm.load { (form, loadError) in if let error = loadError { // Consent form could not be loaded. return print("Error: \(error.localizedDescription)") }
if let form = form { if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene { if let window = windowScene.windows.first { if let rootViewController = window.rootViewController { form.present(from: rootViewController) { (dismissError) in if let error = dismissError { // Consent form could not be dismissed. print("Error: \(error.localizedDescription)") gdprConsentShown = false } else { // Consent form was dismissed. // Check the consent status. let status = UMPConsentInformation.sharedInstance.consentStatus print("Consent status: \(status)") gdprConsentShown = true } } } } } } } }}Sim, o if let fica feio, porque metade foi gerada pelo ChatGPT, mas você entendeu a ideia. Eu modifiquei e coloquei tudo em outra view.
Então, para cada app que faço, eu simplesmente copio e colo essa view. Veja como eu usaria na minha view principal:
//for ads and consent form @State var readyToShow = false @State private var bannerView: BannerView? = nil ///// context .onAppear() { // create the banner onAppear, readyToShow is false by default bannerView = BannerView(readyToShow: $readyToShow, adUnitID: "ca-app-pub-yourKeyHere") // This performs the consent form logic inside the bannerView, if everything goes well, toggle readyToShow to true. bannerView?.gdprConsentCheck() } .toolbar { ToolbarItem(placement: .bottomBar) { // So only users who passed the consent form will see this banner ad. if !adRemoved && readyToShow{6 collapsed lines
bannerView .frame(width: GADAdSizeBanner.size.width, height: GADAdSizeBanner.size.height) }
} }Anúncios personalizados
Para controlar se devemos exibir anúncios personalizados, costumávamos definir a opção de solicitação de anúncios para algo assim:
import GoogleMobileAds
let request = GADRequest()let extras = GADExtras()extras.additionalParameters = ["npa": "1"] // This means no personalized ads are shownrequest.register(extras)Lembre-se de que precisamos configurar o ATT para conformidade com a App Store.
No entanto, não faz sentido interagir com o Google AdMob agora. Isso porque, quando você usa o UserMessagingPlatform, o Google gerencia a “personalização” na plataforma deles.
“Caso isso ainda seja útil para alguém, confirmo que, ao usar o SDK UMP para Android, você não precisa definir npa=1. O SDK UMP grava a string TCF nas preferências compartilhadas (informações relacionadas em https://support.google.com/admob/answer/9760862), e o SDK Google Mobile Ads lê a string TCF nas solicitações de anúncios.” - Eric, Equipe do SDK Mobile Ads - Leia mais
Foi isso que li no fórum do Google AdMob.
Embora tenham dito que é para Android, presumo que funcione da mesma forma no iOS.
Mas, de qualquer forma, precisamos implementar o ATT para a Apple, então vou mantê-lo por enquanto.
Espero que este guia simplifique um pouco as coisas e ajude você.