En esta guía para desarrolladores, se describe cómo implementar Google Tag Manager en una aplicación para dispositivos móviles.
Introducción
Google Tag Manager permite que los desarrolladores cambien los valores de configuración en sus aplicaciones para dispositivos móviles con la interfaz de Google Tag Manager sin tener que volver a compilar y enviar los archivos binarios de la aplicación a los mercados de aplicaciones.
Esto es útil para administrar cualquier valor o marca de configuración en tu aplicación que puedas necesitar cambiar en el futuro, incluidos los siguientes:
- Varios parámetros de configuración de la IU y cadenas de visualización
- Tamaños, ubicaciones o tipos de anuncios publicados en tu aplicación
- Configuración de juegos
Los valores de configuración también se pueden evaluar en el tiempo de ejecución con reglas, lo que permite configuraciones dinámicas como las siguientes:
- Usar el tamaño de la pantalla para determinar el tamaño del banner publicitario
- Usar el idioma y la ubicación para configurar elementos de la IU
Google TagManager también permite la implementación dinámica de etiquetas de seguimiento y píxeles en las aplicaciones. Los desarrolladores pueden enviar eventos importantes a una capa de datos y decidir más adelante qué etiquetas de seguimiento o píxeles se deben activar. TagManager admite las siguientes etiquetas:
- Google Analytics para aplicaciones móviles
- Etiqueta de llamada a función personalizada
Antes de comenzar
Antes de usar esta guía de introducción, necesitarás lo siguiente:
- Una cuenta de Google Tag Manager
- Un contenedor de Tag Manager nuevo y una macro de recopilación de valores
- Una aplicación para dispositivos móviles para Android en la que se implementará Google Tag Manager
- El SDK de servicios de Google Analytics, que contiene la biblioteca de Tag Manager
Si es la primera vez que usas Google Tag Manager, te recomendamos que obtengas más información sobre los contenedores, las macros y las reglas (Centro de ayuda) antes de continuar con esta guía.
Comenzar
En esta sección, se guiará a los desarrolladores a través de un flujo de trabajo típico de Tag Manager:
- Agrega el SDK de Google Tag Manager a tu proyecto
- Establece valores predeterminados del contenedor
- Abre el contenedor
- Obtén valores de configuración del contenedor
- Envía eventos a la capa de datos
- Obtén una vista previa del contenedor y publícalo
1. Agrega el SDK de Google Tag Manager a tu proyecto
Antes de usar el SDK de Google Tag Manager, deberás extraer el paquete del SDK, agregar la biblioteca a la ruta de acceso de compilación de tu proyecto y agregar permisos a tu archivo AndroidManifest.xml.
Primero, agrega la biblioteca de Google Tag Manager a la carpeta /libs de tu proyecto.
Luego, actualiza tu archivo AndroidManifest.xml para usar los siguientes permisos:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
2. Agrega un archivo de contenedor predeterminado a tu proyecto
Google Tag Manager usa un contenedor predeterminado en la primera ejecución de tu aplicación. El contenedor predeterminado se usará hasta que la app pueda recuperar un contenedor nuevo a través de la red.
Para descargar y agregar un objeto binario de contenedor predeterminado a tu aplicación, sigue estos pasos:
- Accede a la interfaz web de Google Tag Manager.
- Selecciona la versión del contenedor que deseas descargar.
- Haz clic en el botón Descargar para recuperar el archivo binario del contenedor.
- Agrega el archivo binario a
la siguiente ruta de acceso:
<project-root>/assets/tagmanager/
El nombre de archivo predeterminado debe ser el ID del contenedor (por ejemplo GTM-1234). Una vez que hayas
descargado el archivo binario, asegúrate de quitar el sufijo de la versión del nombre de archivo
para asegurarte de seguir la convención de nomenclatura correcta.
Aunque se recomienda usar el archivo binario, si tu contenedor no contiene reglas ni etiquetas,
puedes usar un archivo JSON. El archivo debe ubicarse en una carpeta /assets/tagmanager
nueva de tu proyecto de Android y debe seguir esta convención de nomenclatura:
<Container_ID>.json. Por ejemplo, si el ID de tu contenedor
es GTM-1234, debes agregar los valores predeterminados del contenedor a
/assets/tagmanager/GTM-1234.json.
3. Abre un contenedor
Antes de recuperar valores de un contenedor, tu aplicación debe abrirlo. Si abres un contenedor, se cargará desde el disco (si está disponible) o se solicitará desde la red (si es necesario).
La forma más sencilla de abrir un contenedor en Android es usar ContainerOpener.openContainer(..., Notifier notifier), como en el siguiente ejemplo:
import com.google.tagmanager.Container; import com.google.tagmanager.ContainerOpener; import com.google.tagmanager.ContainerOpener.OpenType; import com.google.tagmanager.TagManager; import android.app.Activity; import android.os.Bundle; public class RacingGame { // Add your public container ID. private static final String CONTAINER_ID = "GTM-YYYY"; volatile private Container mContainer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TagManager mTagManager = TagManager.getInstance(this); // The container is returned to containerFuture when available. ContainerOpener.openContainer( mTagManager, // TagManager instance. CONTAINER_ID, // Tag Manager Container ID. OpenType.PREFER_NON_DEFAULT, // Prefer not to get the default container, but stale is OK. null, // Time to wait for saved container to load (ms). Default is 2000ms. new ContainerOpener.Notifier() { // Called when container loads. @Override public void containerAvailable(Container container) { // Handle assignment in callback to avoid blocking main thread. mContainer = container; } } ); // Rest of your onCreate code. } }
En este ejemplo, se usa ContainerOpener.openContainer(..., Notifier notifier) para solicitar un contenedor guardado del almacenamiento local. Si controlamos la asignación de mContainer en la devolución de llamada containerAvailable, nos aseguramos de que no se bloquee el subproceso principal. Si el contenedor guardado tiene más de 12 horas, la llamada también programará una solicitud para recuperar de forma asíncrona un contenedor nuevo a través de la red.
Esta implementación de muestra representa la forma más sencilla de abrir y recuperar valores de un contenedor con la clase de conveniencia ContainerOpener.
Para obtener opciones de implementación más avanzadas, consulta Configuración avanzada.
4. Obtén valores de configuración del contenedor
Una vez que el contenedor esté abierto, se podrán recuperar los valores de configuración con
los get<type>Value() métodos:
// Retrieving a configuration value from a Tag Manager Container. // Get the configuration value by key. String title = mContainer.getStringValue("title_string");
Las solicitudes realizadas con una clave inexistente mostrarán un valor predeterminado adecuado para el tipo solicitado:
// Empty keys will return a default value depending on the type requested. // Key does not exist. An empty string is returned. string subtitle = container.getStringValue("Non-existent-key"); subtitle.equals(""); // Evaluates to true.
5. Envía valores a la capa de datos
La capa de datos es un mapa que permite que la información del tiempo de ejecución sobre tu app, como los eventos táctiles o las vistas de pantalla, esté disponible para las macros y las etiquetas de Tag Manager en un contenedor.
Por ejemplo, si envías información sobre las vistas de pantalla al mapa de la capa de datos, puedes configurar etiquetas en la interfaz web de Tag Manager para activar píxeles de conversión y llamadas de seguimiento en respuesta a esas vistas de pantalla sin necesidad de codificarlas de forma rígida en tu app.
Los eventos se envían a la capa de datos con push() y el
DataLayer.mapOf() método auxiliar:
// // MainActivity.java // Pushing an openScreen event with a screen name into the data layer. // import com.google.tagmanager.TagManager; import com.google.tagmanager.DataLayer; import android.app.Activity; import android.os.Bundle; public MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } // This screen becomes visible when Activity.onStart() is called. public void onStart() { super.onStart(); // The container should have already been opened, otherwise events pushed to // the DataLayer will not fire tags in that container. DataLayer dataLayer = TagManager.getInstance(this).getDataLayer(); dataLayer.push(DataLayer.mapOf("event", "openScreen", // The event type. This value should be used consistently for similar event types. "screenName", // Writes a key "screenName" to the dataLayer map. "Home Screen") // Writes a value "Home Screen" for the "screenName" key. ); } // Rest of the Activity implementation }
En la interfaz web, ahora puedes crear etiquetas (como las de Google Analytics) para que se activen para cada vista de pantalla creando esta regla: es igual a "openScreen". Para pasar el nombre de la pantalla a una de estas etiquetas, crea una macro de capa de datos que haga referencia a la clave "screenName" en la capa de datos. También puedes crear una etiqueta (como un píxel de conversión de Google Ads) para que se active solo para vistas de pantalla específicas. Para ello, crea una regla en la que sea igual a "openScreen" && sea igual a "ConfirmationScreen".
6. Obtén una vista previa de un contenedor y publícalo
Los valores de las macros siempre corresponderán a la versión publicada actual. Antes de publicar la versión más reciente de un contenedor, puedes obtener una vista previa del contenedor en borrador.
Para obtener una vista previa de un contenedor, genera una URL de vista previa en la interfaz web de Google Tag Manager. Para ello, selecciona la versión del contenedor que deseas obtener una vista previa y, luego, selecciona Preview. Guarda esta URL de vista previa, ya que la necesitarás en pasos posteriores.
A continuación, agrega la siguiente actividad al archivo AndroidManifest.xml de tu aplicación:
<!-- Google Tag Manager Preview Activity --> <activity android:name="com.google.tagmanager.PreviewActivity" android:label="@string/app_name" android:noHistory="true" > <!-- Optional, removes the PreviewActivity from activity stack. --> <intent-filter> <data android:scheme="tagmanager.c.application_package_name" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE"/> </intent-filter> </activity>
Abre el vínculo en un emulador o dispositivo físico para obtener una vista previa del contenedor en borrador en tu app.
Cuando tengas todo listo para que los valores de configuración en borrador estén disponibles para tu aplicación, publica el contenedor.
Configuración avanzada
Google Tag Manager para dispositivos móviles tiene varias opciones de configuración avanzadas que te permiten seleccionar valores según las condiciones del tiempo de ejecución con reglas, actualizar el contenedor de forma manual y obtener opciones adicionales para abrir contenedores. En las siguientes secciones, se describen varias de las configuraciones avanzadas más comunes.
Opciones avanzadas para abrir contenedores
El SDK de Google Tag Manager proporciona varios métodos para abrir contenedores que pueden brindarte más control sobre el proceso de carga:
TagManager.openContainer()
TagManager.openContainer() es la API de nivel más bajo y más flexible para abrir un contenedor. Muestra un contenedor predeterminado de inmediato y también carga de forma asíncrona un contenedor desde el disco o la red si no existe un contenedor guardado o si el contenedor guardado no está actualizado (tiene más de 12 horas).
mContainer = tagManager.openContainer(CONTAINER_ID, new Container.Callback() { // Called when a refresh is about to begin for the given refresh type. @Override public void containerRefreshBegin(Container container, RefreshType refreshType) { // Notify UI that the Container refresh is beginning. } // Called when a successful refresh occurred for the given refresh type. @Override public void containerRefreshSuccess(Container container, RefreshType refreshType]) { // Notify UI that Container is ready. } // Called when a refresh failed for the given refresh type. @Override public void containerRefreshFailure(Container container, RefreshType refreshType, RefreshFailure refreshFailure) { // Notify UI that the Container refresh has failed. }
Durante todo el proceso de carga, TagManager.openContainer() emite varias devoluciones de llamada del ciclo de vida para que tu código pueda saber cuándo comienza la solicitud de carga, si falla o tiene éxito, y por qué, y si el contenedor se cargó finalmente desde el disco o la red.
A menos que sea aceptable que tu aplicación use los valores predeterminados, deberás usar estas devoluciones de llamada para saber cuándo se cargó un contenedor guardado o de red. Ten en cuenta que no podrás cargar un contenedor guardado o de red si es la primera vez que se ejecuta la app y no hay conexión de red.
TagManager.openContainer() pasa los siguientes valores enum como argumentos a estas devoluciones de llamada:
RefreshType
| Valor | Descripción |
|---|---|
Container.Callback.SAVED
|
La solicitud de actualización está cargando un contenedor guardado de forma local. |
Container.Callback.NETWORK
|
La solicitud de actualización está cargando un contenedor a través de la red. |
RefreshFailure
| Valor | Descripción |
|---|---|
Container.Callback.NO_SAVED_CONTAINER
|
No hay ningún contenedor guardado disponible. |
Container.Callback.IO_ERROR
|
Un error de E/S impidió la actualización del contenedor. |
Container.Callback.NO_NETWORK
|
No hay conexión de red disponible. |
Container.Callback.NETWORK_ERROR
|
Se produjo un error de red. |
Container.Callback.SERVER_ERROR
|
Se produjo un error en el servidor. |
Container.Callback.UNKNOWN_ERROR
|
Se produjo un error que no se puede categorizar. |
Métodos para abrir contenedores no predeterminados y nuevos
ContainerOpener encapsula TagManager.openContainer()
y proporciona dos métodos de conveniencia para abrir contenedores:
ContainerOpener.openContainer(..., Notifier notifier) y
ContainerOpener.openContainer(..., Long timeoutInMillis).
Cada uno de estos métodos toma una enumeración que solicita un contenedor no predeterminado o nuevo.
Se recomienda OpenType.PREFER_NON_DEFAULT para la mayoría de las aplicaciones y se intenta mostrar el primer contenedor no predeterminado disponible dentro de un período de tiempo de espera determinado, ya sea desde el disco o la red, incluso si ese contenedor tiene más de 12 horas. Si muestra un contenedor guardado obsoleto, también realizará una solicitud de red asíncrona para obtener uno nuevo.
Cuando se usa OpenType.PREFER_NON_DEFAULT, se mostrará un contenedor predeterminado si no hay ningún otro contenedor disponible o si se supera el período de tiempo de espera.
OpenType.PREFER_FRESH intenta mostrar un contenedor nuevo desde el disco o la red dentro del período de tiempo de espera determinado.
Muestra un contenedor guardado si no hay una conexión de red disponible o si se supera el período de tiempo de espera.
No se recomienda usar OpenType.PREFER_FRESH en lugares donde un tiempo de solicitud más largo puede afectar notablemente la experiencia del usuario, como con marcas de la IU o cadenas de visualización. También puedes usar
Container.refresh()
en cualquier momento
para forzar una solicitud de contenedor de red.
Ambos métodos de conveniencia no son bloqueadores.
ContainerOpener.openContainer(..., Long timeoutInMillis) muestra un
ContainerOpener.ContainerFuture objeto, cuyo get método muestra un
Container en cuanto se carga (pero se bloqueará hasta entonces).
El método ContainerOpener.openContainer(..., Notifier notifier) toma una sola devolución de llamada, a la que se llama cuando el contenedor está disponible, que se puede usar para evitar bloquear el subproceso principal.
Ambos métodos tienen un período de tiempo de espera predeterminado de 2000 milisegundos.
Evalúa macros en el tiempo de ejecución con reglas
Los contenedores pueden evaluar valores en el tiempo de ejecución con reglas. Las reglas pueden basarse en criterios como el idioma del dispositivo, la plataforma o cualquier otro valor de macro. Por ejemplo, las reglas se pueden usar para seleccionar una cadena de visualización localizada según el idioma del dispositivo en el tiempo de ejecución. Esto se puede configurar con la siguiente regla:
Luego, puedes crear macros de recopilación de valores para cada idioma y agregar esta regla a cada macro, insertando el código de idioma adecuado. Cuando se publique este contenedor, tu aplicación podrá mostrar cadenas de visualización localizadas, según el idioma del dispositivo del usuario en el tiempo de ejecución.
Ten en cuenta que, si tu contenedor predeterminado necesita reglas, debes usar un archivo de contenedor binario como contenedor predeterminado.
Obtén más información para configurar reglas (Centro de ayuda).
Archivos de contenedor predeterminados binarios
Los contenedores predeterminados que necesitan reglas deben usar un archivo de contenedor binario en lugar de un JSON archivo como contenedor predeterminado. Los contenedores binarios ofrecen compatibilidad para determinar los valores de las macros en el tiempo de ejecución con las reglas de Google Tag Manager, mientras que los archivos JSON no lo hacen.
Los archivos de contenedor binarios se pueden descargar desde la interfaz web de Google Tag Manager y deben agregarse a la carpeta de tu proyecto y seguir este patrón: , en el que el nombre de archivo representa el ID del contenedor./assets/tagmanager//assets/tagmanager/GTM-XXXX
En los casos en los que haya un archivo JSON y un archivo de contenedor binario, el SDK usará el archivo de contenedor binario como contenedor predeterminado.
Usa macros de llamada a función
Las macros de llamada a función son macros que se establecen en el valor que muestra una función especificada en tu aplicación. Las macros de llamada a función se pueden usar para incorporar valores de tiempo de ejecución con tus reglas de Google Tag Manager, como determinar en el tiempo de ejecución qué precio mostrar a un usuario según el idioma y la moneda configurados de un dispositivo.
Para configurar una macro de llamada a función, haz lo siguiente:
- Define la macro de llamada a función en la interfaz web de Google Tag Manager. De manera opcional, los argumentos se pueden configurar como pares clave-valor.
- Registra un
FunctionCallMacroHandleren tu aplicación conContainer.registerFunctionCallMacroHandler()y el nombre de la función que configuraste en la interfaz web de Google Tag Manager, anulando sugetValue()método:/** * Registers a function call macro handler. * * @param functionName The function name field, as defined in the Google Tag * Manager web interface. */ mContainer.registerFunctionCallMacroHandler(functionName, new FunctionCallMacroHandler() { /** * This code will execute when any custom macro's rule(s) evaluate to true. * The code should check the functionName and process accordingly. * * @param functionName Corresponds to the function name field defined * in the Google Tag Manager web interface. * @param parameters An optional map of parameters * as defined in the Google Tag Manager web interface. */ @Override public Object getValue(String functionName, Map<String, Object> parameters)) { if (functionName.equals("myConfiguredFunctionName")) { // Process and return the calculated value of this macro accordingly. return macro_value } return null; } });
Usa etiquetas de llamada a función
Las etiquetas de llamada a función permiten que se ejecuten funciones registradas previamente cada vez que
se envía un evento a la capa de datos y las reglas de la etiqueta
se evalúan como true.
Para configurar una etiqueta de llamada a función, haz lo siguiente:
- Define la etiqueta de llamada a función en la interfaz web de Google Tag Manager. De manera opcional, los argumentos se pueden configurar como pares clave-valor.
- Registra un controlador de etiquetas de llamada a función en tu aplicación con
Container.registerFunctionCallTagHandler():/** * Register a function call tag handler. * * @param functionName The function name, which corresponds to the function name field * Google Tag Manager web interface. */ mContainer.registerFunctionCallTagHandler(functionName, new FunctionCallTagHandler() { /** * This method will be called when any custom tag's rule(s) evaluates to true. * The code should check the functionName and process accordingly. * * @param functionName The functionName passed to the functionCallTagHandler. * @param parameters An optional map of parameters as defined in the Google * Tag Manager web interface. */ @Override public void execute(String functionName, Map<String, Object> parameters) { if (functionName.equals("myConfiguredFunctionName")) { // Process accordingly. } } });
Establece un período de actualización personalizado
El SDK de Google Tag Manager intentará recuperar un contenedor nuevo si la antigüedad del contenedor actual supera las 12 horas. Para establecer un período de actualización de contenedor personalizado, usa Timer, como en el siguiente ejemplo:
timer.scheduleTask(new TimerTask() { @Override public void run() { mContainer.refresh(); } }, delay, <new_period_in milliseconds>);
Depura con Logger
De forma predeterminada, el SDK de Google Tag Manager imprime errores y advertencias en los registros.
Habilitar un registro más detallado puede ser útil para la depuración y es posible implementando tu propio Logger con
TagManager.setLogger, como en este ejemplo:
TagManager tagManager = TagManager.getInstance(this); tagManager.setLogger(new Logger() { final String TAG = "myGtmLogger"; // Log output with verbosity level of DEBUG. @Override public void d(String arg0) { Log.d(TAG, arg0); } // Log exceptions when provided. @Override public void d(String arg0, Throwable arg1) { Log.d(TAG, arg0); arg1.printStackTrace(); } // Rest of the unimplemented Logger methods. });
También puedes establecer el LogLevel del Logger existente con
TagManager.getLogger().setLogLevel(LogLevel)
,
como en este ejemplo:
// Change the LogLevel to INFO to enable logging at INFO and higher levels. TagManager tagManager = TagManager.getInstance(this); tagManager.getLogger().setLogLevel(LogLevel.INFO);