El SDK de Google User Messaging Platform (UMP) es una herramienta de privacidad y mensajería que te ayuda a administrar las opciones de privacidad. Para obtener más información, consulta Acerca de Privacidad y mensajería. Puedes ver una implementación de IMA en funcionamiento con el SDK de UMP en las apps de muestra de UMP para Objective-C o Swift.
Crea un tipo de mensaje
Crea mensajes para los usuarios con uno de los tipos de mensajes para los usuarios disponibles en la pestaña Privacidad y mensajería de tu cuenta de Ad Manager. El SDK de UMP intenta mostrar un mensaje de privacidad creado a partir del ID de aplicación de anuncios multimedia interactivos establecido en tu proyecto.
Para obtener más información, consulta Acerca de la privacidad y la mensajería.
Importa el SDK
El SDK de UMP no se incluye como dependencia del SDK de IMA, por lo que debes añadirlo de forma explícita.
CocoaPods (opción preferida)
La forma más sencilla de importar el SDK a un proyecto de iOS es usar CocoaPods. Abre el Podfile de tu proyecto y agrega esta línea al destino de tu app:
pod 'GoogleUserMessagingPlatform'
Luego, ejecuta el comando siguiente:
pod install --repo-update
Si es la primera vez que usas CocoaPods, consulta Cómo usar CocoaPods para obtener detalles sobre cómo crear y usar Podfiles.
Swift Package Manager
El SDK de UMP también admite Swift Package Manager. Sigue estos pasos para importar el paquete de Swift.
En Xcode, instala el paquete Swift del SDK de UMP. Para ello, navega a File > Add Packages….
En el mensaje que aparece, busca el repositorio de GitHub del paquete Swift del SDK de UMP:
https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git
Selecciona la versión del paquete Swift del SDK de UMP que deseas usar. Para proyectos nuevos, recomendamos usar la opción Hasta la siguiente versión principal.
Luego, Xcode resuelve las dependencias de tus paquetes y las descarga en segundo plano. Para obtener más detalles sobre cómo agregar dependencias de paquetes, consulta el artículo de Apple.
Agrega el ID de aplicación
Puedes encontrar el ID de tu aplicación en la IU de Ad Manager.
Agrega el ID a tu Info.plist
con el siguiente fragmento de código:
<key>UMPApplicationIdentifier</key>
<string>ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy</string>
Cómo obtener el consentimiento
Para obtener el consentimiento, completa los siguientes pasos:
- Solicita la información de consentimiento del usuario más reciente.
- Carga y presenta un formulario de consentimiento, si es necesario.
Solicitud de información de consentimiento
Debes solicitar una actualización de la información de consentimiento del usuario cada vez que se inicie la app con
requestConsentInfoUpdateWithParameters:completionHandler:
. Esta solicitud verifica lo siguiente:
- Si se requiere consentimiento. Por ejemplo, se requiere el consentimiento por primera vez o venció la decisión de consentimiento anterior.
- Si se requiere un punto de entrada de opciones de privacidad. Algunos mensajes de privacidad requieren que las apps permitan a los usuarios modificar sus opciones de privacidad en cualquier momento.
Cargar y presentar un formulario de mensaje de privacidad si es necesario
Después de recibir el estado de consentimiento más actualizado, llama a
loadAndPresentIfRequiredFromViewController:completionHandler:
para cargar los formularios necesarios para recopilar el consentimiento del usuario. Después de la carga, los formularios se presentan de inmediato.
En el siguiente código, se muestra cómo solicitar la información de consentimiento más reciente del usuario. Si es necesario, el código carga y presenta un formulario de mensaje de privacidad:
Swift
// Requesting an update to consent information should be called on every app launch.
UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(with: parameters) {
requestConsentError in
guard requestConsentError == nil else {
return consentGatheringComplete(requestConsentError)
}
UMPConsentForm.loadAndPresentIfRequired(from: consentFormPresentationviewController) {
loadAndPresentError in
// Consent has been gathered.
consentGatheringComplete(loadAndPresentError)
}
}
Objective-C
// Requesting an update to consent information should be called on every app launch.
[UMPConsentInformation.sharedInstance
requestConsentInfoUpdateWithParameters:parameters
completionHandler:^(NSError *_Nullable requestConsentError) {
if (requestConsentError) {
consentGatheringComplete(requestConsentError);
} else {
[UMPConsentForm
loadAndPresentIfRequiredFromViewController:viewController
completionHandler:^(
NSError
*_Nullable loadAndPresentError) {
// Consent has been gathered.
consentGatheringComplete(
loadAndPresentError);
}];
}
}];
Opciones de privacidad
Algunos formularios de mensajes de privacidad se presentan desde un punto de entrada de opciones de privacidad renderizado por el publicador, lo que permite a los usuarios administrar sus opciones de privacidad en cualquier momento. Para obtener más información sobre qué mensaje ven los usuarios en el punto de entrada de las opciones de privacidad, consulta Tipos de mensajes de usuario disponibles.
Verifica si se requiere un punto de entrada de opciones de privacidad
Después de llamar a
requestConsentInfoUpdateWithParameters:completionHandler:
, verifica
UMPConsentInformation.sharedInstance.privacyOptionsRequirementStatus
para determinar si se requiere un punto de entrada de opciones de privacidad para tu app:
Swift
var isPrivacyOptionsRequired: Bool {
return UMPConsentInformation.sharedInstance.privacyOptionsRequirementStatus == .required
}
Objective-C
- (BOOL)areGDPRConsentMessagesRequired {
return UMPConsentInformation.sharedInstance.privacyOptionsRequirementStatus ==
UMPPrivacyOptionsRequirementStatusRequired;
}
Agrega un elemento visible a tu app
Si se requiere un punto de entrada de privacidad, agrega a tu app un elemento de IU visible y que se pueda interactuar que presente el formulario de opciones de privacidad. Si no se requiere un punto de entrada de privacidad, configura el elemento de la IU para que no sea visible ni interactivo.
Swift
self.privacySettingsButton.isEnabled = ConsentManager.shared.isPrivacyOptionsRequired
Objective-C
// Set up the privacy options button to show the UMP privacy form.
// Check ConsentInformation.getPrivacyOptionsRequirementStatus
// to see the button should be shown or hidden.
strongSelf.privacySettingsButton.hidden =
!ConsentManager.sharedInstance.areGDPRConsentMessagesRequired;
Presenta el formulario de opciones de privacidad
Cuando el usuario interactúe con tu elemento, presenta el formulario de opciones de privacidad:
Swift
UMPConsentForm.presentPrivacyOptionsForm(
from: viewController, completionHandler: completionHandler)
Objective-C
[UMPConsentForm presentPrivacyOptionsFormFromViewController:viewController
completionHandler:completionHandler];
Solicitar anuncios
Antes de solicitar anuncios en tu app, verifica si obtuviste el consentimiento del usuario con
UMPConsentInformation.sharedInstance.canRequestAds
. Hay dos lugares que debes verificar mientras recopilas el consentimiento:
- Después de que se haya recopilado el consentimiento en la sesión actual.
- Inmediatamente después de llamar a
requestConsentInfoUpdateWithParameters:completionHandler:
. Es posible que se haya obtenido el consentimiento en la sesión anterior. Como práctica recomendada para la latencia, te recomendamos que no esperes a que se complete la devolución de llamada para que puedas comenzar a cargar anuncios lo antes posible después de que se inicie la app.
Si se produce un error durante el proceso de recopilación de consentimiento, debes verificar si puedes solicitar anuncios. El SDK de UMP usa el estado de consentimiento de la sesión anterior.
El siguiente código verifica si puedes solicitar anuncios durante el proceso de recopilación de consentimiento:
Swift
ConsentManager.shared.gatherConsent(from: self) { [weak self] consentError in
guard let self else { return }
if let consentError {
// Consent gathering failed. This sample loads ads using
// consent obtained in the previous session.
print("Error: \(consentError.localizedDescription)")
}
// ...
}
Objective-C
[ConsentManager.sharedInstance
gatherConsentFromConsentPresentationViewController:self
consentGatheringComplete:^(NSError *_Nullable consentError) {
if (consentError) {
// Consent gathering failed.
NSLog(@"Error: %@", consentError.localizedDescription);
}
__strong __typeof__(self) strongSelf = weakSelf;
if (!strongSelf) {
return;
}
// ...
if (ConsentManager.sharedInstance.canRequestAds) {
[strongSelf setupAdsLoader];
}
}];
// This sample attempts to load ads using consent obtained in the previous session.
if (ConsentManager.sharedInstance.canRequestAds) {
[self setupAdsLoader];
}
[self setUpContentPlayer];
}
- (IBAction)onPlayButtonTouch:(id)sender {
[self requestAds];
self.playButton.hidden = YES;
}
#pragma mark Content Player Setup
- (void)setUpContentPlayer {
// Load AVPlayer with path to our content.
NSURL *contentURL = [NSURL URLWithString:kTestAppContentUrl_MP4];
self.contentPlayer = [AVPlayer playerWithURL:contentURL];
// Create a player layer for the player.
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.contentPlayer];
// Size, position, and display the AVPlayer.
playerLayer.frame = self.videoView.layer.bounds;
[self.videoView.layer addSublayer:playerLayer];
// Set up our content playhead and contentComplete callback.
self.contentPlayhead = [[IMAAVPlayerContentPlayhead alloc] initWithAVPlayer:self.contentPlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contentDidFinishPlaying:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:self.contentPlayer.currentItem];
}
#pragma mark SDK Setup
- (void)setupAdsLoader {
self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:nil];
self.adsLoader.delegate = self;
}
- (void)requestAds {
// Create an ad display container for ad rendering.
IMAAdDisplayContainer *adDisplayContainer =
[[IMAAdDisplayContainer alloc] initWithAdContainer:self.videoView
viewController:self
companionSlots:nil];
// Create an ad request with our ad tag, display container, and optional user context.
IMAAdsRequest *request = [[IMAAdsRequest alloc] initWithAdTagUrl:kTestAppAdTagUrl
adDisplayContainer:adDisplayContainer
contentPlayhead:self.contentPlayhead
userContext:nil];
[self.adsLoader requestAdsWithRequest:request];
}
- (void)contentDidFinishPlaying:(NSNotification *)notification {
// Make sure we don't call contentComplete as a result of an ad completing.
if (notification.object == self.contentPlayer.currentItem) {
[self.adsLoader contentComplete];
}
}
#pragma mark AdsLoader Delegates
- (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData {
// Grab the instance of the IMAAdsManager and set ourselves as the delegate.
self.adsManager = adsLoadedData.adsManager;
self.adsManager.delegate = self;
// Create ads rendering settings to tell the SDK to use the in-app browser.
IMAAdsRenderingSettings *adsRenderingSettings = [[IMAAdsRenderingSettings alloc] init];
adsRenderingSettings.linkOpenerPresentingController = self;
// Initialize the ads manager.
[self.adsManager initializeWithAdsRenderingSettings:adsRenderingSettings];
}
- (void)adsLoader:(IMAAdsLoader *)loader failedWithErrorData:(IMAAdLoadingErrorData *)adErrorData {
// Something went wrong loading ads. Log the error and play the content.
NSLog(@"Error loading ads: %@", adErrorData.adError.message);
[self.contentPlayer play];
}
#pragma mark AdsManager Delegates
- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event {
// When the SDK notified us that ads have been loaded, play them.
if (event.type == kIMAAdEvent_LOADED) {
[adsManager start];
}
}
- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdError:(IMAAdError *)error {
// Something went wrong with the ads manager after ads were loaded. Log the error and play the
// content.
NSLog(@"AdsManager error: %@", error.message);
[self.contentPlayer play];
}
- (void)adsManagerDidRequestContentPause:(IMAAdsManager *)adsManager {
// The SDK is going to play ads, so pause the content.
[self.contentPlayer pause];
}
- (void)adsManagerDidRequestContentResume:(IMAAdsManager *)adsManager {
// The SDK is done playing ads (at least for now), so resume the content.
[self.contentPlayer play];
}
@end
El siguiente código configura el SDK de IMA DAI después de que se obtiene el consentimiento del usuario:
Swift
private func requestAds() {
// Create ad display container for ad rendering.
let adDisplayContainer = IMAAdDisplayContainer(
adContainer: videoView, viewController: self, companionSlots: nil)
// Create an ad request with our ad tag, display container, and optional user context.
let request = IMAAdsRequest(
adTagUrl: ViewController.testAppAdTagURL,
adDisplayContainer: adDisplayContainer,
contentPlayhead: contentPlayhead,
userContext: nil)
adsLoader.requestAds(with: request)
}
Objective-C
- (void)setupAdsLoader {
self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:nil];
self.adsLoader.delegate = self;
}
Prueba
Si quieres probar la integración en tu app mientras la desarrollas, sigue estos pasos para registrar tu dispositivo de prueba de forma programática. Asegúrate de quitar el código que establece estos IDs de dispositivos de prueba antes de lanzar la app.
- Llamar a
requestConsentInfoUpdateWithParameters:completionHandler:
Busca un mensaje similar al siguiente ejemplo en el resultado del registro, que muestra el ID de tu dispositivo y cómo agregarlo como dispositivo de prueba:
<UMP SDK>To enable debug mode for this device, set: UMPDebugSettings.testDeviceIdentifiers = @[2077ef9a63d2b398840261c8221a0c9b]
Copia el ID del dispositivo de prueba en el portapapeles.
Modifica tu código para llamar a
UMPDebugSettings().testDeviceIdentifiers
y pasar una lista de los IDs de tus dispositivos de prueba.Swift
let parameters = UMPRequestParameters() let debugSettings = UMPDebugSettings() debugSettings.testDeviceIdentifiers = ["TEST-DEVICE-HASHED-ID"] parameters.debugSettings = debugSettings // Include the UMPRequestParameters in your consent request. 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" ]; parameters.debugSettings = debugSettings; // Include the UMPRequestParameters in your consent request. [UMPConsentInformation.sharedInstance requestConsentInfoUpdateWithParameters:parameters completionHandler:^(NSError *_Nullable error){ // ... }];
Cómo forzar una ubicación geográfica
El SDK de UMP proporciona una forma de probar el comportamiento de tu app como si el dispositivo se ubicara en varias regiones, como el EEE o el Reino Unido, con
UMPDebugGeography
. Ten en cuenta que la configuración de depuración solo funciona en dispositivos de prueba.
Swift
let parameters = UMPRequestParameters()
let debugSettings = UMPDebugSettings()
debugSettings.testDeviceIdentifiers = ["TEST-DEVICE-HASHED-ID"]
debugSettings.geography = .EEA
parameters.debugSettings = debugSettings
// Include the UMPRequestParameters in your consent request.
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;
// Include the UMPRequestParameters in your consent request.
[UMPConsentInformation.sharedInstance
requestConsentInfoUpdateWithParameters:parameters
completionHandler:^(NSError *_Nullable error){
// ...
}];
Restablece el estado de consentimiento
Cuando pruebes tu app con el SDK de UMP, te recomendamos que restablezcas el estado del SDK para que puedas simular la primera experiencia de instalación de un usuario.
El SDK proporciona el método reset
para hacerlo.
Swift
UMPConsentInformation.sharedInstance.reset()
Objective-C
[UMPConsentInformation.sharedInstance reset];
Ejemplos en GitHub
Consulta un ejemplo completo de la integración del SDK de UMP que se describe en esta página en UmpExample de Swift y UmpExample de Objective-C.