Los eventos personalizados permiten que los publicadores que usan la mediación de AdMob agreguen mediación en cascada para una red de publicidad de terceros que no sea una de las redes de publicidad compatibles. En esta guía, se explica cómo usar un evento personalizado existente compilado para Android y iOS en un proyecto de Unity.
Requisitos previos
Completa Comenzar. Tu app para Unity ya debería tener importado el complemento Google Mobile Ads para Unity.
Adaptadores de eventos personalizados ya compilados para Android y iOS Para crear adaptadores de eventos personalizados, consulta nuestras guías de eventos personalizados para Android y iOS.
Define un evento personalizado
Para que un evento personalizado participe en la mediación, debe definirse en la interfaz web de AdMob. Agrega un evento personalizado a tus grupos de mediación de Android y iOS.
En esta captura de pantalla, se muestra una configuración de eventos personalizados de muestra:
Cómo completar los parámetros | |
---|---|
Nombre de la clase (iOS) |
Para iOS, ingresa el nombre de la clase que implementa el evento personalizado. Si tu clase se implementa en Swift, debes anteponer el nombre de la clase con
el nombre de su módulo de app o framework (por ejemplo,
El nombre del objetivo es obligatorio si tienes varios objetivos en tu proyecto o si el nombre del proyecto es diferente del nombre del objetivo. Con el nombre del destino, se verá de la siguiente manera: |
Nombre de la clase (Android) | Para Android, asegúrate de que el valor que proporciones para Class Name sea el nombre de clase completamente calificado para Android (por ejemplo, com.google.ads.mediation.sample.customevent.SampleCustomEvent ).
|
Etiqueta | Ingresa un nombre único para el evento. |
Parámetro | Si deseas pasar un argumento de cadena a tu evento personalizado, por ejemplo, un ID de unidad de anuncios. |
Importa bibliotecas de eventos personalizados
Es posible que los eventos personalizados requieran bibliotecas adicionales para funcionar correctamente. Por ejemplo, es posible que debas incluir las siguientes bibliotecas:
- SDK de terceros de Android
- Evento personalizado de terceros de Android
- SDK de anuncios de terceros para iOS
- Evento personalizado de terceros de iOS
Tipos de bibliotecas
Existen varias formas de importar código de Android o iOS a un proyecto de Unity, como las siguientes:
- Importa artefactos de Android o iOS compilados previamente con el Administrador de dependencias external para Unity
- Cómo importar complementos AAR y bibliotecas de Android
- Importa archivos fuente de Java y Kotlin
- Cómo importar archivos fuente y bibliotecas estáticas de iOS
Según la forma en que se empaqueten las bibliotecas que usas, es posible que necesites una estrategia de importación diferente para cada una. Más adelante, se analiza cada opción con más detalle.
(Recomendado) Importa artefactos precompilados de Android o iOS
Importa artefactos precompilados de Maven o CocoaPods con el External Dependency Manager for Unity. Este complemento se incluye con el complemento GoogleMobileAds.
Para importar artefactos existentes, crea un archivo de configuración para definir tus importaciones. El nombre de archivo y la ruta de acceso tienen los siguientes requisitos:
- El archivo debe existir en la carpeta
/Editor/
. - El nombre del archivo debe terminar con
Dependencies.xml
.
Por ejemplo, para importar los adaptadores de eventos personalizados de una red de publicidad hipotética llamada AdPub
, crea el siguiente archivo:
Assets/AdPub/Editor/AdPubDependencies.xml
A continuación, define tus dependencias dentro del archivo AdPubDependencies.xml
. Las reglas para configurar las importaciones se encuentran en External Dependency Manager for Unity Getting Started. El siguiente fragmento de código incluye el SDK de Android y iOS, y las bibliotecas de eventos personalizados para una red publicitaria hipotética "AdPub".
Assets/AdPub/Editor/AdPubDependencies.xml
<dependencies>
<androidPackages>
<androidPackage spec="com.adpub.android:adpub-sdk:1.0.0" />
<androidPackage spec="com.adpub.android:adpub-custom-event:1.0.0">
<repositories>
<repository>https://repo.maven.apache.org/maven2/</repository>
<repository>https://dl.google.com/dl/android/maven2/</repository>
</repositories>
</androidPackage>
</androidPackages>
<iosPods>
<iosPod name="AdPubSDK" version="1.0" />
<iosPod name="AdPubCustomEvent" version="1.0">
<sources>
<source>https://github.com/CocoaPods/Specs</source>
</sources>
</iosPod>
</iosPods>
</dependencies>
Si tu artefacto de evento personalizado ya tiene una dependencia en el SDK de la red de publicidad requerido, no es necesario que definas la dependencia del SDK de forma explícita: Ejemplo
El Administrador de dependencias externas supervisa automáticamente los cambios de configuración y resuelve las dependencias. También puedes ejecutar la resolución manual con el siguiente comando del menú:
Assets > External Dependency Manager > Android Resolver > Force Resolve
Cómo importar complementos AAR y bibliotecas de Android
Unity admite la importación de archivos *.aar
, así como de proyectos de bibliotecas de Android. Si tu evento personalizado de Android se empaqueta de esta manera, consulta Complementos de AAR y bibliotecas de Android para obtener instrucciones sobre cómo incluir esos archivos en tu proyecto de Unity.
Cómo importar archivos fuente de Java y Kotlin
A partir de Unity 2018.2 o versiones posteriores, si tu código de evento personalizado de Android consta de archivos *.java
o *.kt
sin compilar, puedes usar archivos fuente de Java o Kotlin como complementos.
Importa archivos de origen y bibliotecas estáticas de iOS
Unity admite artefactos *.framework
, archivos fuente *.h
y *.m
. La importación de artefactos y archivos de origen de iOS se explica en la guía de Unity para complementos nativos.
Prueba eventos personalizados con el inspector de anuncios
El inspector de anuncios se puede usar para probar que los eventos personalizados se hayan importado correctamente a tu aplicación. El inspector de anuncios se puede abrir solo con gestos o de forma programática con un código mínimo.
Llama a métodos nativos de SDK de terceros desde secuencias de comandos de C# (opcional)
Los SDKs de redes publicitarias de terceros pueden tener requisitos especiales que requieran llamar a métodos de Android o iOS directamente. El proceso para llamar a estos métodos directamente es el siguiente:
- Define una interfaz común para los clientes de la plataforma
- Implementa un cliente predeterminado para plataformas no compatibles
- Implementa un cliente de Android para llamar a métodos de Android
- Implementa un cliente de iOS para llamar a métodos de iOS
- Implementa una fábrica de clientes para cambiar de forma condicional entre clientes de iOS y Android
- Define una API para acceder a todas las funciones del SDK de la red de publicidad de terceros
En la siguiente sección, se muestra cómo se implementan estos pasos para una red hipotética de anuncios llamada "AdPub" en una API de C# que puede llamar a los métodos en Android y iOS:
Android
package com.adpub.android;
public class AdPubSdk
{
public static void setHasUserConsent(boolean hasUserConsent);
}
iOS
@interface AdPubSdk : NSObject
+ (void)setHasUserConsent:(BOOL)hasUserConsent;
@end
Define una interfaz común para los clientes de la plataforma
Crea una interfaz IAdPubClient
con un método que represente la API subyacente de Android y iOS.
Assets/AdPub/Common/IAdPubClient.cs
namespace AdPub.Common
{
public interface IAdPubClient
{
///<summary>
/// Sets a flag indicating if the app has user consent for advertisement.
///</summary>
void SetHasUserConsent(bool hasUserConsent);
}
}
Define un cliente predeterminado para plataformas no compatibles
Crea una clase DefaultClient
que implemente la interfaz IAdPubClient
que solo registre el nombre del método. Usa esta implementación para el editor de Unity y todas las plataformas que no sean Android o iOS.
Assets/AdPub/Common/DefaultClient.cs
namespace AdPub.Common
{
public class DefaultClient : IAdPubClient
{
public void SetHasUserConsent(bool hasUserConsent)
{
Debug.Log("SetHasUserConsent was called.");
}
}
}
Implementa un cliente de plataforma de iOS
Crea una clase iOSAdPubClient
que implemente la interfaz IAdPubClient
en iOS. Esta implementación usa InteropServices para llamar al método setHasUserConsent()
en la clase AdPubSdk
de iOS.
Assets/AdPub/Platforms/iOS/iOSAdPubClient.cs
// Wrap this class in a conditional operator to make sure it only runs on iOS.
#if UNITY_IOS
// Reference InteropServices to include the DLLImportAttribute type.
using System.Runtime.InteropServices;
using AdPub.Common;
namespace AdPub.Platforms.Android
{
public class iOSAdPubClient : IAdPubClient
{
public void SetHasUserConsent(bool hasUserConsent)
{
GADUAdPubSetHasUserConsent(hasUserConsent);
}
[DllImport("__Internal")]
internal static extern void GADUAdPubSetHasUserConsent(bool hasUserConsent);
}
}
#endif
A continuación, implementa el método GADUAdPubSetHasUserConsent()
que se definió anteriormente. Crea AdPubClientBridge.m
con un método C
GADUAdPubSetHasUserConsent()
para controlar la llamada al método desde Unity y, luego, invoca AdPubSDK
.
AdPubClientBridge
es un archivo de origen de iOS y debe colocarse dentro de la carpeta Plugins/iOS
, como se explica en la guía de Unity para complementos nativos.
Assets/AdPub/Plugins/iOS/AdPubClientBridge.m
#import <AdPubSDK/AdPubSDK.h>
void GADUAdPubSetHasUserConsent(BOOL hasUserConsent) {
[AdPubSDK setHasUserConsent:hasUserConsent];
}
Implementa un cliente de plataforma de Android
Crea una clase AndroidAdPubCient
que implemente la interfaz IAdPubClient
en Android. Esta implementación usa las clases de ayuda de Java de Android para llamar al método estático setHasUserConsent()
de Android.
Como las clases auxiliares de Java de Android solo están disponibles durante el entorno de ejecución de Android, puedes evitar errores de compilación con la directiva del compilador UNITY_ANDROID
para unir la clase como se muestra en el fragmento de código. Como alternativa, puedes usar las definiciones de ensamblado en Unity 2017.4 y versiones posteriores para resolver este problema.
Assets/AdPub/Platforms/Android/AndroidAdPubClient.cs
// Wrap this class in a conditional operator to make sure it only runs on Android.
#if UNITY_ANDROID
// Reference the UnityEngine namespace which contains the JNI Helper classes.
using UnityEngine;
using AdPub.Common;
namespace AdPub.Platforms.Android
{
public class AndroidAdPubClient : IAdPubClient
{
public void SetHasUserConsent(bool hasUserConsent)
{
// Make a reference to the com.adpub.AdPubSDK.
AndroidJavaClass adPubSdk = new AndroidJavaClass("com.adpub.AdPubSdk");
// Call the native setHasUserConsent method of com.adpub.AdPubSDK.
adPubSdk.CallStatic("setHasUserConsent", hasUserConsent);
}
}
}
#endif
Crea un método de fábrica para mostrar la implementación de cliente correcta
Ahora que tienes implementaciones del cliente para cada plataforma, crea una clase AdPubClientFactory
para mostrar la implementación correcta de la interfaz IAdPubClient
según la plataforma del entorno de ejecución. Esta clase usa directivas del compilador para mostrar el cliente IAdPubClient
correcto.
Assets/AdPub/Common/AdPubClientFactory.cs
namespace AdPub.Common
{
public class AdPubClientFactory
{
// Return the correct platform client.
public static IAdPubClient GetClient()
{
#if !UNITY_EDITOR && UNITY_ANDROID
return new AdPub.Platforms.Android.AndroidAdPubClient();
#elif !UNITY_EDITOR && UNITY_IOS
return new AdPub.Platforms.iOS.iOSAdPubClient();
#else
// Returned for the Unity Editor and unsupported platforms.
return new DefaultClient();
#endif
}
}
}
Define una API pública para cada método de interfaz
Crea una clase AdPubApi
que tenga llamadas a métodos para cada método de cliente en tu interfaz IAdPubClient
. Esta clase usa AdPubClientFactory
para obtener una instancia de IAdPubClient
y llama a ese cliente para las funciones subyacentes del SDK.
Assets/AdPub/AdPubApi.cs
using AdPub.Common;
namespace AdPub
{
public class AdPubApi
{
private static readonly IAdPubClient client = GetAdPubClient();
// Returns the correct client for the current runtime platform.
private static IAdPubClient GetAdPubClient()
{
return AdPubClientFactory.GetClient();
}
// Sets the user consent using the underlying SDK functionality.
public static void SetHasUserConsent(bool hasUserConsent)
{
client.SetHasUserConsent(hasUserConsent);
}
}
}
Llama a tu API recién definida
A continuación, te mostramos cómo puedes llamar a la API definida anteriormente:
Assets/Scripts/AdPubController.cs
using UnityEngine;
using AdPub;
public class AdPubController : MonoBehaviour
{
// TODO: Get consent from the user and update this userConsent field.
public bool userConsent;
// Called on startup of the GameObject it's assigned to.
public void Start()
{
// Pass the user consent to AdPub.
AdPubApi.SetHasUserConsent(userConsent);
}
}
Ejemplos adicionales de adaptadores de redes de publicidad de terceros
Visita el repositorio de GitHub del complemento Google Mobile Ads para Unity para ver ejemplos adicionales de adaptadores de mediación de terceros que implementan APIs de C# para unir llamadas a métodos de iOS y Android.