Integrar utilizando modelos de lenguaje grande (LLM) (IA): utiliza el siguiente comando:
Añade el SDK de Tenjin a mi proyecto utilizando: https://raw.githubusercontent.com/tenjin/sdk-llm-guides/main/guides/unity/llm-guide.md
Resumen #
La documentación que figura a continuación describe el SDK de Unity para Tenjin. Para obtener más información sobre Tenjin y nuestra oferta de productos, visita https://www.tenjin.com.
- Consulta nuestras Notas de la versión para ver el historial detallado de los cambios realizados en cada versión.
- El SDK de Tenjin Unity es compatible tanto con iOS como con Android.
- Revisa la documentación de iOS y Android y aplica la configuración adecuada de la plataforma a tus compilaciones. (iOS, Android)
- Si tienes alguna duda o necesitas ayuda, ponte en contacto con: support@tenjin.com.
Si utilizas el SDK de Unity v1.12.29 o una versión anterior, sigue las instrucciones que encontrarás en estos pasos antes de completar la integración del SDK.
Para actualizar a la versión 1.12.30 o superior desde versiones anteriores, asegúrate de eliminar los archivos binarios de Tenjin antes de instalar la última versión de Unity.
Si te aparece este error al compilar en iOS: Biblioteca no cargada: @rpath/TenjinSDK.framework/TenjinSDK debes ir a “Frameworks, bibliotecas y contenido integrado” y añadir TenjinSDK; a continuación, selecciona ‘Integrar y firmar’.’
Si tienes libTenjinSDK.a y/o libTenjinSDKUniversal.a de versiones anteriores del SDK de Tenjin, elimínalos y ejecuta pod Install para integrarlo en iOS
Gestor de paquetes de Unity (UPM) #
Para instalar un paquete UPM desde una URL de Git:
- Abre la ventana del Gestor de paquetes, si aún no está abierta.
- Abre el menú «Añadir» (+) en la barra de herramientas del Gestor de paquetes.
- Selecciona Instalar paquete desde la URL de Git en el menú Instalar. Aparecerán un cuadro de texto y un botón «Instalar».
- Introduce la siguiente URL válida de Git en el cuadro de texto (debes añadir
#seguido de la etiqueta de versión):https://github.com/tenjin/tenjin-unity-sdk.git#1.16.5 - Haz clic en Instalar.
Instalación manual (.unitypackage) #
- Descarga la última versión del SDK de Unity desde aquí.
- Importa el
TenjinUnityPackage.unitypackagea tu proyecto:Recursos -> Importar paquete.
Nota importante sobre Android #
Para garantizar que Tenjin funcione a la perfección con las últimas funciones y correcciones, asegúrate de que tus dependencias de Maven (Gradle) estén actualizadas, ya que distribuimos nuestro SDK de Tenjin Android a través de Maven. Hemos observado que algunos desarrolladores siguen utilizando versiones obsoletas, lo que podría provocar problemas.
Si compilas el proyecto a través de Android Studio, asegúrate de ejecutar «Gradle sync» para actualizar las dependencias.
Si no utilizas Android Studio, actualiza tus dependencias en Unity siguiendo estos pasos:
- Abre Unity.
- Ve a «Activos» > «Gestor de dependencias externas» > «Resolver Android».
- Selecciona «Forzar resolución» para actualizar tus dependencias de Gradle a las últimas versiones.
Google Play #
Por defecto, sin especificar es la App Store predeterminada. Actualiza el valor de la tienda de aplicaciones a googleplay si distribuyes tu aplicación en Google Play Store.
Establece el valor de «Tipo de App Store» en googleplay:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.googleplay);El SDK de Tenjin requiere los siguientes permisos:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- Required to get network connectivity (i.e. wifi vs. mobile) -->Google Play Services exige que todas las aplicaciones de nivel de API 32 (Android 13) que utilicen el advertising_id (Android Advertising ID (AAID)) declaren el permiso AD_ID de Google Play Services (que se muestra a continuación) en su archivo de manifiesto. Es necesario actualizar el tenjin-android-sdk a la versión 1.12.8 para poder utilizar el permiso que se indica a continuación.
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>ID de publicidad de Android (AAID) y fuente de instalación #
Añade Android Advertising ID (AAID) y Install Referrer, y añádelas a tu archivo build.gradle.
dependencies {
implementation 'com.google.android.gms:play-services-ads-identifier:{version}'
implementation 'com.android.installreferrer:installreferrer:{version}'
}Para poder recopilar el «Install Referrer» de Meta, añade estas consultas a tu manifiesto Android:
<queries>
<package android:name="com.facebook.katana" />
</queries>
<queries>
<package android:name="com.instagram.android" />
</queries>A continuación, añade lo siguiente a tu archivo strings.xml (puedes crear este archivo de plantilla para almacenar el valor de la cadena basándote en esta guía):
<string name="facebook_app_id" translatable="false">YOUR_META_APP_ID</string>Tienda Amazon #
Por defecto, sin especificar es la App Store predeterminada. Actualiza el valor de la tienda de aplicaciones a amazon si distribuyes tu aplicación en la tienda Amazon.
Establece el valor de «Tipo de App Store» en amazon:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.amazon);OAID y otras tiendas de aplicaciones Android #
Tenjin te ayuda a promocionar tu aplicación en otras tiendas de aplicaciones de Android mediante el OAID de Android. Tenemos los siguientes requisitos para integrar las bibliotecas OAID. Si tienes pensado publicar tu aplicación fuera de Google Play, asegúrate de implementar estas bibliotecas OAID.
MSA OAID #
MSA OAID es un identificador publicitario para dispositivos fabricados en China que proporciona la MSA (Mobile Security Alliance). Para integrarla con la biblioteca MSA, descarga el siguiente oaid\_sdk\_1.0.25.aar.
Coloca el archivo oaid_sdk_1.0.25.aar en el directorio "Android libs" de tu proyecto: /Assets/Plugins/Android
Establece el valor de «Tipo de App Store» en other:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.other);OAID de Huawei #
Fuera de China, puedes obtener el OAID utilizando la biblioteca proporcionada por Huawei. Para la integración con la biblioteca OAID de Huawei, descarga el siguiente archivo AAR de Huawei: huawei-ads-identifier.aar. Si tu aplicación se encuentra en la Huawei App Gallery, descarga y añade el archivo Huawei Install Referrer: huawei-ads-installreferrer.aar.
Coloca los archivos de Huawei en el directorio «libs» de tu proyecto Android: /Assets/Plugins/Android
Establece el valor de «Tipo de App Store» en other:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.other);Configuración de Proguard #
-keep class com.tenjin.** { *; }
-keep public class com.google.android.gms.ads.identifier.** { *; }
-keep public class com.google.android.gms.common.** { *; }
-keep public class com.android.installreferrer.** { *; }
-keep class * extends java.util.ListResourceBundle {
protected java.lang.Object[][] getContents();
}
-keepattributes *Annotation*Si utilizas bibliotecas de Huawei, puedes utilizar esta configuración:
-keep class com.huawei.hms.ads.** { *; }
-keep interface com.huawei.hms.ads.** { *; }Inicialización de la aplicación #
- Consigue tu
SDK_KEYen la página de tu aplicación. Nota:SDK_KEYes única para cada una de tus aplicaciones. Puedes crear hasta 3 claves para la misma aplicación.

- En el primer método
Start()de tu proyecto, añade la siguiente línea de código. Añádela también aOnApplicationPause()si quieres enviar datos de sesión cuando un usuario reanude el uso de la aplicación desde el segundo plano.
using UnityEngine;
using System.Collections;
public class TenjinExampleScript : MonoBehaviour {
void Start() {
TenjinConnect();
}
void OnApplicationPause(bool pauseStatus) {
if (!pauseStatus) {
TenjinConnect();
}
}
public void TenjinConnect() {
BaseTenjin instance = Tenjin.getInstance(" ");
// Sends Install/open event to Tenjin
instance.Connect();
}
}NOTA: Asegúrate de implementar este código en cada llamada a Start() y OnApplicationPause(), no solo la primera vez que se abra la aplicación.
App Store #
Admitimos tres opciones de tiendas de aplicaciones,
- Google Play
- Amazon
- otros
Por defecto, sin especificar es la App Store predeterminada. Si vas a publicar en una App Store concreta, actualiza el valor de la App Store al correspondiente. El valor de la App Store otra se utiliza para Huawei AppGallery y otras tiendas de aplicaciones:
AndroidManifest.xml:
<meta-data
android:name="TENJIN_APP_STORE"
android:value="{{SET_APP_STORE_TYPE_VALUE}}" />SetAppStoreType():
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.{{SET_APP_STORE_TYPE_VALUE}});ATTrackingManager (iOS) #
- A partir de la versión iOS 14, tienes la opción de mostrar el mensaje inicial de permisos de ATTrackingManager y la selección para que los usuarios acepten o rechacen el uso de los mismos.
- Si el dispositivo no acepta el permiso de seguimiento, el IDFA pasará a ser cero. Si el dispositivo acepta el permiso de seguimiento, el método
Connect()enviará el IDFA a nuestros servidores. - También puedes seguir llamando a la función
connect()de Tenjin sin utilizar ATTrackingManager. Puedes optar por no implementar ATT si no tienes intención de acceder al IDFA de ningún usuario ni de transmitirlo a Tenjin.
using UnityEngine;
using System.Collections;
using UnityEngine.iOS;
public class TenjinExampleScript : MonoBehaviour {
void Start() {
TenjinConnect();
}
void OnApplicationPause(bool pauseStatus) {
if (!pauseStatus) {
TenjinConnect();
}
}
public void TenjinConnect() {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
#if UNITY_IOS
if (new Version(Device.systemVersion).CompareTo(new Version("14.0")) >= 0) {
// Tenjin wrapper for requestTrackingAuthorization
instance.RequestTrackingAuthorizationWithCompletionHandler((status) => {
Debug.Log("===> App Tracking Transparency Authorization Status: " + status);
// Sends Install/open event to Tenjin
instance.Connect();
});
}
else {
instance.Connect();
}
#elif UNITY_ANDROID
// Sends Install/open event to Tenjin
instance.Connect();
#endif
}
}Mostrar un mensaje solicitando permiso de ATT #
Para cumplir con las directrices de ATT de Apple, debes proporcionar una descripción para el mensaje de solicitud de permiso de ATT y, a continuación, implementar la solicitud de permiso en tu aplicación.
> Nota: Debes implementar la solicitud de permiso antes de mostrar anuncios en tu juego.
Configuración de una descripción del seguimiento de usuarios #
Apple exige una descripción para el mensaje de solicitud del permiso ATT. Debes configurar la descripción mediante la clave NSUserTrackingUsageDescription en el archivo Info.plist de tu proyecto de Xcode. Debes proporcionar un mensaje que informe al usuario de por qué solicitas permiso para utilizar los datos de seguimiento del dispositivo:
- En el navegador de proyectos de Xcode, abre el archivo
Info.plist. - Haz clic en el botón «Añadir» (+) situado junto a cualquier clave del editor de la lista de propiedades para crear una nueva clave de propiedad.
- Introduce el nombre de la clave
NSUserTrackingUsageDescription. - Selecciona un tipo de valor de cadena.
- Introduce el mensaje sobre la transparencia del seguimiento de aplicaciones en el campo de valor. Algunos ejemplos son:
- “Utilizaremos tus datos para ofrecerte una experiencia publicitaria mejor y más personalizada”.”
- “Intentamos mostrarte anuncios de aplicaciones y productos que te resulten más interesantes en función de las aplicaciones que utilizas, el dispositivo que estás utilizando y el país en el que te encuentras”.”
- “Intentamos mostrarte anuncios de aplicaciones y productos que te resulten más interesantes en función de las aplicaciones que utilizas”.”
> Nota: Apple ofrece unas directrices específicas de la App Store que definen el uso aceptable y los mensajes correspondientes a todas las funciones relacionadas con la privacidad dirigidas a los usuarios finales. Tenjin no ofrece asesoramiento jurídico. Por lo tanto, la información de esta página no sustituye la consulta con su propio asesor jurídico para determinar los requisitos legales de su empresa y sus procesos, así como la forma de cumplirlos.
SKAdNetwork y los valores de conversión #
Como parte de SKAdNetwork, hemos creado un método de envoltura para updatePostbackConversionValue(_:). Nuestro método registrará los métodos equivalentes de SKAdNetwork y también enviará los valores de conversión a nuestros servidores.
updatePostbackConversionValue(_:) El valor de 6 bits debe corresponder al evento de la aplicación y no debe introducirse como representación binaria, sino como un número entero comprendido entre 0 y 63. Nuestro servidor rechazará cualquier valor no válido.
A partir de la versión iOS 16.1, que es compatible con SKAdNetwork 4.0, ya puedes enviar coarseValue (cadena de caracteres, con posibles variantes como “low”, “medium” o “high”) y lockWindow (booleano) como parámetros en el método de respuesta de actualización:
updatePostbackConversionValue(conversionValue: Integer, coarseValue: String)
updatePostbackConversionValue(conversionValue: Integer, coarseValue: String, lockWindow: Bool)
- En la versión 16.1 o posterior de iOS, que es compatible con SKAdNetwork 4.0, puedes llamar a este método tantas veces como quieras y establecer el valor de conversión por encima o por debajo del valor anterior.
- Para las versiones de iOS anteriores a la 16.1 que sean compatibles con versiones de SKAdNetwork anteriores a la 4.0, puedes llamar a este método y nuestro SDK detectará automáticamente la versión de iOS y actualizará únicamente
conversionValue.
using UnityEngine;
using System.Collections;
public class TenjinExampleScript : MonoBehaviour {
void Start() {
TenjinConnect();
}
void OnApplicationPause(bool pauseStatus) {
if (!pauseStatus) {
TenjinConnect();
}
}
public void TenjinConnect() {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
#if UNITY_IOS
// Sends Install/open event to Tenjin
instance.Connect();
// Sets SKAdNetwork Conversion Value
// You will need to use a value between 0-63
instance.updatePostbackConversionValue(<Integer between 0 and 63>);
// For iOS 16.1+ (SKAN 4.0)
instance.updatePostbackConversionValue(<Integer between 0 and 63>, "medium");
instance.updatePostbackConversionValue(<Integer between 0 and 63>, "medium", true);
#elif UNITY_ANDROID
// Sends Install/open event to Tenjin
instance.Connect();
#endif
}
}SKAdNetwork y iOS: respuestas de los anunciantes para usuarios mayores de 15 años #
Para especificar Tenjin como destino de los postbacks de tu red publicitaria SK, sigue estos pasos:
- Selecciona
Info.plisten el navegador de proyectos de Xcode. - Haz clic en el botón «Añadir» (+) situado junto a una clave en el editor de la lista de propiedades y pulsa Retorno.
- Escribe el nombre de la clave
NSAdvertisingAttributionReportEndpoint. - Selecciona «Cadena» en el menú desplegable de la columna «Tipo».
- Introducir
https://tenjin-skan.com
Estos pasos se han adaptado a partir de las instrucciones de Apple que se encuentran en https://developer.apple.com/documentation/storekit/skadnetwork/configuring_an_advertised_app.
GDPR #
Como parte del cumplimiento del RGPD, con el SDK de Tenjin puedes activar o desactivar la participación de dispositivos o usuarios, o seleccionar qué parámetros específicos relacionados con los dispositivos deseas activar o desactivar. OptOut() no enviará ninguna solicitud de API a Tenjin, y no procesaremos ningún evento.
Para darse de alta o darse de baja:
void Start () {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
boolean userOptIn = CheckOptInValue();
if (userOptIn) {
instance.OptIn();
}
else {
instance.OptOut();
}
instance.Connect();
}
boolean CheckOptInValue()
{
// check opt-in value
// return true; // if user opted-in
return false;
}- Para activar o desactivar parámetros específicos relacionados con el dispositivo, puedes utilizar la función
OptInParams()oOptOutParams(). OptInParams()solo enviará los parámetros relacionados con el dispositivo que se hayan especificado.OptOutParams()enviará todos los parámetros relacionados con el dispositivo, excepto los que se hayan especificado.- Tenga en cuenta que necesitamos los siguientes parámetros para realizar un seguimiento adecuado de los dispositivos en el sistema de Tenjin. Si falta alguno de estos parámetros obligatorios, el evento no se procesará ni se registrará.
- Para Android,
advertising_id
- Para iOS
developer_device_id
- Si te diriges a redes publicitarias basadas en IMEI y/o OAID para Android, añade:
imeioaid
- Si tienes pensado utilizar Google AdWords, también tendrás que añadir:
platformos_versionapp_versionlocaledevice_modelbuild_idadvertising_iddeveloper_device_id(para iOS)
Si solo quieres obtener parámetros específicos relacionados con el dispositivo, utiliza OptInParams(). En el ejemplo siguiente, solo utilizaremos estos parámetros relacionados con el dispositivo: ip_address, advertising_id, developer_device_id, limit_ad_tracking, y referrer:
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
List<string> optInParams = new List<string> {"ip_address", "advertising_id", "developer_device_id", "limit_ad_tracking", "referrer", "iad"};
instance.OptInParams(optInParams);
instance.Connect();Si quieres enviar TODOS los parámetros excepto aquellos específicos relacionados con el dispositivo, utiliza OptOutParams(). En el ejemplo siguiente, enviaremos TODOS los parámetros relacionados con el dispositivo excepto: locale, timezone y build_id.
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
List<string> optOutParams = new List<string> {"locale", "timezone", "build_id"};
instance.OptOutParams(optOutParams);
instance.Connect();Activar o desactivar mediante CMP #
Puedes activar o desactivar automáticamente esta opción mediante los consentimientos de tu CMP (finalidad 1), que ya están guardados en el dispositivo del usuario. El método devuelve un valor booleano que indica si la opción está activada o desactivada.
OptInOutUsingCMP()
BaseTenjin instance = Tenjin.getInstance(" ");
optInOut = instance.OptInOutUsingCMP(); Parámetros relacionados con el dispositivo #
| Param | Descripción | Plataforma |
|---|---|---|
| dirección_IP | Dirección IP | Todos |
| id_publicitario | Identificador publicitario del dispositivo | Todos |
| identificador_del_dispositivo_del_desarrollador | N.º de identificación del proveedor | iOS |
| oaid | ID de publicidad abierto | Android |
| IMEI | IMEI del dispositivo | Android |
| limit_ad_tracking | Seguimiento publicitario activado | Todos |
| plataforma | plataforma | Todos |
| fuente de referencia | Referente de instalación de Google Play | Android |
| os_version | versión del sistema operativo | Todos |
| dispositivo | nombre del dispositivo | Todos |
| fabricante_del_dispositivo | fabricante de dispositivos | Android |
| modelo_del_dispositivo | modelo del dispositivo | Todos |
| marca_del_dispositivo | marca del dispositivo | Android |
| producto_dispositivo | producto de dispositivo | Android |
| nombre_del_modelo_del_dispositivo | dispositivo máquina | iOS |
| device_cpu | nombre de la CPU del dispositivo | iOS |
| transportista | operador de telefonía | Android |
| tipo_de_conexión | móvil o wifi | Android |
| ancho_de_pantalla | ancho de la pantalla del dispositivo | Android |
| altura_de_la_pantalla | altura de la pantalla del dispositivo | Android |
| os_version_release | versión del sistema operativo | Todos |
| build_id | ID de compilación | Todos |
| configuración regional | configuración regional del dispositivo | Todos |
| país | país de configuración regional | Todos |
| zona horaria | zona horaria | Todos |
Eventos de compra #
Validación de IAP iOS #
La validación del recibo iOS requiere el «transactionId» y el recibo. La firma se establecerá en «null». En cuanto al recibo, asegúrate de enviar el «Payload» del recibo (el recibo ASN.1 codificado en base64) desde Unity.
IMPORTANTE: Si tienes una suscripción IAP, tendrás que añadir la clave pública de tu aplicación en el panel de control de Tenjin. Puedes recuperar tu secreto compartido específico de la aplicación iOS en consola de iTunes Connect > Selecciona tu aplicación > Información de la aplicación > Secreto compartido específico de la aplicación.
Validación de IAP Android #
Tienda de aplicaciones de Google Play
La validación de recibos de Google Play requiere que se incluyan el recibo y la firma (el «transactionId» está establecido en «null»).
IMPORTANTE: Tendrás que añadir la clave pública de tu aplicación en el panel de control de Tenjin (en la página de ‘edición’ de la aplicación). Puedes recuperar tu clave pública RSA codificada en Base64 desde la Consola de desarrolladores de Google Play > Selecciona tu aplicación > Monetizar > Configuración de monetización > Facturación de Google Play > Licencias: Clave pública RSA codificada en Base64. Ten en cuenta que, para Android, actualmente solo admitimos transacciones IAP desde Google Play.
(NOTA) En el caso de Google Play, asegúrate de ‘confirmar’ el evento de compra antes de enviarlo a Tenjin. Para obtener más información, consulta aquí
Amazon AppStore
La validación de recibos de Amazon en la App Store requiere los parámetros receiptId y userId.
IMPORTANTE: Tendrás que añadir la clave compartida de tu aplicación Amazon en el panel de control de Tenjin. La clave compartida se encuentra en la sección "Shared Key" de tu cuenta de desarrollador en la cuenta de Amazon Appstore.
Ejemplo de IAP iOS y Android #
En el ejemplo siguiente, utilizamos la biblioteca MiniJSON, muy extendida, para la deserialización de JSON.
Si utilizas la versión 5 o superior de Unity IAP:
En el caso de los productos consumibles, el recibo solo está disponible en PendingOrder. Una vez confirmado (ConfirmedOrder), el recibo queda vacío. Procesa siempre las compras y envíalas a Tenjin en OnPurchasePending para los productos de consumo.
public static void OnPurchasePending(PendingOrder pendingOrder) {
ProcessOrder(pendingOrder);
// Confirm the purchase after processing
UnityIAPServices.DefaultPurchase().ConfirmPurchase(pendingOrder);
}
public static void ProcessOrder(Order order) {
// Get the first item from the cart
var item = order.CartOrdered.Items().FirstOrDefault();
if (item == null) return;
var product = item.Product;
var price = product.metadata.localizedPrice;
double lPrice = decimal.ToDouble(price);
var currencyCode = product.metadata.isoCurrencyCode;
var productId = product.definition.id;
var info = order.Info;
#if UNITY_ANDROID
// Parse the unified receipt JSON
var wrapper = Json.Deserialize(info.Receipt) as Dictionary<string, object>; // https://gist.github.com/darktable/1411710
if (wrapper == null) return;
var store = (string)wrapper["Store"];
var payload = (string)wrapper["Payload"];
if (store.Equals("GooglePlay")) {
var googleDetails = Json.Deserialize(payload) as Dictionary<string, object>;
var googleJson = (string)googleDetails["json"];
var googleSig = (string)googleDetails["signature"];
CompletedAndroidPurchase(productId, currencyCode, 1, lPrice, googleJson, googleSig);
}
if (store.Equals("AmazonAppStore")) {
var amazonDetails = Json.Deserialize(payload) as Dictionary<string, object>;
var amazonReceiptId = (string)amazonDetails["receiptId"];
var amazonUserId = (string)amazonDetails["userId"];
CompletedAmazonPurchase(productId, currencyCode, 1, lPrice, amazonReceiptId, amazonUserId);
}
#elif UNITY_IOS
// Try SK2 first (Unity IAP 5.1+ on iOS 15+), fall back to SK1
var receipt = info.Apple?.jwsRepresentation;
if (string.IsNullOrEmpty(receipt)) {
receipt = info.Apple?.AppReceipt;
}
if (string.IsNullOrEmpty(receipt)) {
Debug.LogError("No receipt available");
return;
}
var transactionId = info.TransactionID;
CompletedIosPurchase(productId, currencyCode, 1, lPrice, transactionId, receipt);
#endif
}
private static void CompletedAndroidPurchase(string ProductId, string CurrencyCode, int Quantity,
double UnitPrice, string Receipt, string Signature)
{
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.Transaction(ProductId, CurrencyCode, Quantity, UnitPrice, null, Receipt, Signature);
}
private static void CompletedIosPurchase(string ProductId, string CurrencyCode, int Quantity,
double UnitPrice, string TransactionId, string Receipt)
{
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.Transaction(ProductId, CurrencyCode, Quantity, UnitPrice, TransactionId, Receipt, null);
}
private static void CompletedAmazonPurchase(string ProductId, string CurrencyCode, int Quantity,
double UnitPrice, string ReceiptId, string UserId)
{
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.TransactionAmazon(ProductId, CurrencyCode, Quantity, UnitPrice, ReceiptId, UserId);
}Si utilizas la versión 4 (o anterior) de Unity IAP:
public static void OnProcessPurchase(PurchaseEventArgs purchaseEventArgs) {
var price = purchaseEventArgs.purchasedProduct.metadata.localizedPrice;
double lPrice = decimal.ToDouble(price);
var currencyCode = purchaseEventArgs.purchasedProduct.metadata.isoCurrencyCode;
var wrapper = Json.Deserialize(purchaseEventArgs.purchasedProduct.receipt) as Dictionary<string, object>;
// https://gist.github.com/darktable/1411710
if (null == wrapper) {
return;
}
var store = (string)wrapper["Store"]; // GooglePlay, AmazonAppStore, AppleAppStore, etc.
var payload = (string)wrapper["Payload"]; // For Apple: base64 encoded ASN.1 receipt. For Android: raw JSON receipt.
var productId = purchaseEventArgs.purchasedProduct.definition.id;
#if UNITY_ANDROID
if (store.Equals("GooglePlay")) {
var googleDetails = Json.Deserialize(payload) as Dictionary<string, object>;
var googleJson = (string)googleDetails["json"];
var googleSig = (string)googleDetails["signature"];
CompletedAndroidPurchase(productId, currencyCode, 1, lPrice, googleJson, googleSig);
}
if (store.Equals("AmazonApps")) {
var amazonDetails = Json.Deserialize(payload) as Dictionary<string, object>;
var amazonReceiptId = (string)amazonDetails["receiptId"];
var amazonUserId = (string)amazonDetails["userId"];
CompletedAmazonPurchase(productId, currencyCode, 1, lPrice, amazonReceiptId, amazonUserId);
}
#elif UNITY_IOS
var transactionId = purchaseEventArgs.purchasedProduct.transactionID;
CompletedIosPurchase(productId, currencyCode, 1, lPrice, transactionId, payload);
#endif
}
private static void CompletedAndroidPurchase(string ProductId, string CurrencyCode, int Quantity, double UnitPrice, string Receipt, string Signature) {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.Transaction(ProductId, CurrencyCode, Quantity, UnitPrice, null, Receipt, Signature);
}
private static void CompletedIosPurchase(string ProductId, string CurrencyCode, int Quantity, double UnitPrice, string TransactionId, string Receipt) {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.Transaction(ProductId, CurrencyCode, Quantity, UnitPrice, TransactionId, Receipt, null);
}
private static void CompletedAmazonPurchase(string ProductId, string CurrencyCode, int Quantity, double UnitPrice, string ReceiptId, string UserId) {
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
instance.TransactionAmazon(ProductId, CurrencyCode, Quantity, UnitPrice, ReceiptId, UserId);
}(Configuración flexible de la comisión de la App Store) Elige entre 0%, 15% y 30% como comisión sobre los ingresos de la App Store a través de nuestra nueva configuración. Los pasos son los siguientes:
- Ve a CONFIGURACIÓN –> Aplicaciones
- Haz clic en la aplicación para la que quieras realizar el cambio
- En la sección ‘Comisión de la App Store’, haz clic en ‘Editar’.’
- Elige entre 30%, 15% o 0% como comisión de la tienda de aplicaciones que prefieras.
- Selecciona la fecha de inicio y la fecha de finalización (o puedes dejar en blanco la fecha de finalización si no quieres que haya una).
- Haz clic en «Guardar» (nota: la comisión solo se puede aplicar a fechas futuras, no a fechas pasadas. Por lo tanto, establece la fecha de inicio a partir de la fecha en la que realices el cambio y en adelante).
Suscripción IAP #
- Eres responsable de enviar una transacción de suscripción una vez durante cada intervalo de suscripción (es decir, por ejemplo, en el caso de una suscripción mensual, deberás enviarnos una transacción al mes). En el ejemplo de cronograma que se muestra a continuación, solo se debe enviar un evento de transacción en los eventos “Primer cargo” y “Renovación”. Durante el periodo de prueba, no envíes el evento de transacción a Tenjin.
- Tenjin no elimina las transacciones duplicadas.
- Si tienes una suscripción IAP a iOS, tendrás que añadir la clave pública de tu aplicación en el panel de control de Tenjin. Puedes recuperar el secreto compartido específico de la aplicación de iOS en consola de iTunes Connect \> Selecciona tu aplicación \> Funciones \> Compras dentro de la aplicación \> Secreto compartido específico de la aplicación.
- Para obtener más información sobre las suscripciones a iOS, consulta: Documentación de Apple sobre cómo trabajar con suscripciones
- Para obtener más información sobre las suscripciones a Android, consulta: Documentación sobre las suscripciones de Google Play Billing
Eventos personalizados #
IMPORTANTE: Limita la longitud de los nombres de los eventos personalizados a menos de 80 caracteres. No superes los 500 nombres de eventos personalizados distintos.
- Incluye la carpeta «Assets» en tu proyecto de Unity
- En el método de tus proyectos para el evento personalizado, escribe lo siguiente para un evento con nombre:
Tenjin.getInstance("").SendEvent("name")y lo siguiente para un evento con nombre y valor entero:Tenjin.getInstance("").SendEvent("nameWithValue","value") - Asegúrate de que
valorque se pasa sea un valor entero (por ejemplo, “2000”, no “0,02”). Sivalorno es un valor entero, el parámetrovalorse omitirá.
Aquí tienes un ejemplo del código:
void MethodWithCustomEvent(){
//event with name
BaseTenjin instance = Tenjin.getInstance ("SDK_KEY");
instance.SendEvent("name");
//event with name and integer value
instance.SendEvent("nameWithValue", "value");
}.SendEvent("name") se utiliza para eventos que son marcadores estáticos o hitos. Esto incluiría elementos como tutorial_complete, registration o level_1.
.SendEvent("name", "value") sirve para aquellos eventos en los que se desea realizar cálculos matemáticos sobre una propiedad del evento. Por ejemplo, ("coins_purchased", "100") te permitirá calcular la suma o la media de las monedas compradas en ese evento.
Integración entre servidores #
Tenjin ofrece integración de servidor a servidor. Esto te permite enviar tus eventos de instalación y posteriores a la instalación directamente desde tus servidores a los servidores de Tenjin sin necesidad de integrar un SDK.
Parámetro «Subversion» de la aplicación para pruebas A/B #
Si estás realizando pruebas A/B y quieres informar de las diferencias, podemos añadir un valor numérico a la versión de tu aplicación utilizando el método AppendAppSubversion(). Por ejemplo, si la versión de tu aplicación es 1.0.1 y estableces AppendAppSubversion(8888), la versión de la aplicación se mostrará como 1.0.1.8888.
Estos datos aparecerán en DataVault, donde podrás generar informes utilizando los valores de subversión de la aplicación.
BaseTenjin instance = Tenjin.getInstance(" ");
instance.AppendAppSubversion(8888);
instance.Connect();Campañas LiveOps #
Tenjin permite recuperar información de atribución de los usuarios, como la red publicitaria de origen y la campaña, desde el SDK. Esto permitirá a los desarrolladores recopilar y analizar datos de atribución a nivel de usuario en tiempo real. A continuación se presentan los posibles casos de uso con Tenjin LiveOps Campaigns:
- Si dispones de tu propia herramienta de análisis de datos, la función de devolución de llamada S2S te permitirá vincular los datos de atribución a tus datos del juego a nivel de dispositivo.
- Muestra contenido diferente en la aplicación en función de la procedencia del usuario. Por ejemplo, si al usuario A se le atribuye el tráfico orgánico y al usuario B se le atribuye el tráfico procedente de Facebook, y es probable que el usuario B se involucre más con tu aplicación, entonces te interesará mostrarle una oferta especial dentro del juego una vez que haya instalado la aplicación. Si quieres comentar casos de uso más específicos, escribe a support@tenjin.com.
Puedes encontrar más información sobre cómo utilizar LiveOps aquí.
Número de usuario del cliente #
Puedes establecer y obtener el ID de usuario del cliente para enviarlo como parámetro en los eventos.
.SetCustomerUserId("user_id")
.GetCustomerUserId()
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetCustomerUserId("user_id");
string userId = instance.GetCustomerUserId(); ID de instalación de Analytics #
Puedes obtener el identificador de análisis, que se genera aleatoriamente y se guarda en el almacenamiento local del dispositivo. GetAnalyticsInstallationId()
BaseTenjin instance = Tenjin.getInstance(" ");
analyticsId = instance.GetAnalyticsInstallationId; Eventos de reintento/caché #
Puedes activar o desactivar el reenvío y el almacenamiento en caché de todos los eventos cuando las solicitudes fallen o los usuarios no dispongan de conexión a Internet. Estos eventos se enviarán una vez que se haya añadido un nuevo evento a la cola y el usuario haya recuperado la conexión.
.SetCacheEventSetting(true)
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetCacheEventSetting(true); Parámetros de Google DMA #
Si ya tienes una CMP integrada, el SDK de Tenjin recopilará automáticamente los parámetros de Google DMA. No es necesario implementar nada en el SDK de Tenjin si tienes una CMP integrada. Si deseas anular tu CMP o, simplemente, crear tus propios mecanismos de consentimiento, puedes utilizar lo siguiente:
SetGoogleDMAParameters(bool, bool)
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetGoogleDMAParameters(adPersonalization, adUserData); Para gestionar de forma explícita la recopilación de los parámetros de Google DMA, tienes la posibilidad de activar o desactivar esta opción en cualquier momento. Aunque la configuración predeterminada es la activación, puedes ajustar fácilmente tus preferencias mediante los métodos OptInGoogleDMA u OptOutGoogleDMA, lo que te garantiza un control total sobre tu configuración de privacidad de datos:
instance.OptInGoogleDMA();
instance.OptOutGoogleDMA(); Perfil de usuario – LiveOps Metrics #
El SDK de Tenjin realiza un seguimiento y agrega automáticamente métricas sobre sesiones de usuario e ingresos que pueden utilizarse para campañas de LiveOps, segmentación de usuarios y análisis. La función «Perfil de usuario» ofrece acceso en tiempo real a estas métricas para usuarios individuales.
Métricas analizadas #
El SDK realiza un seguimiento automático de las siguientes métricas por usuario:
| Métrico | Descripción | Tipo |
|---|---|---|
session_count | Número total de sesiones | Número entero |
total_session_time | Tiempo acumulado de la sesión en milisegundos | Número |
average_session_length | Duración media de la sesión en milisegundos | Número |
last_session_length | Duración de la última sesión completada en milisegundos | Número |
iap_transaction_count | Número total de transacciones IAP | Número entero |
total_ilrd_revenue_usd | Ingresos publicitarios totales de ILRD en dólares estadounidenses | Número |
first_session_date | Marca de tiempo ISO 8601 de la primera sesión | Cadena |
last_session_date | Marca de tiempo ISO 8601 de la sesión completada más reciente | Cadena |
current_session_length | Duración actual de la sesión activa en milisegundos | Número |
iap_revenue_by_currency | Desglose de los ingresos por código de divisa | Cadena JSON |
purchased_product_ids | Matriz de identificadores de productos adquiridos | Cadena JSON |
ilrd_revenue_by_network | Ingresos de ILRD por red publicitaria | Cadena JSON |
Nota: Los campos condicionales (fechas, sesión actual, mapas de ingresos, matrices de productos) solo se incluyen en el diccionario si existen datos.
Métodos disponibles #
Obtener el diccionario de perfiles de usuario #
Devuelve un diccionario que contiene todas las métricas registradas del usuario actual. Todos los valores se devuelven como cadenas de caracteres (los números, las matrices JSON y los objetos JSON se convierten en cadenas de caracteres).
BaseTenjin instance = Tenjin.getInstance("<SDK_KEY>");
Dictionary<string, string> profile = instance.GetUserProfileDictionary();
if (profile != null && profile.Count > 0)
{
Debug.Log("Session Count: " + profile["session_count"]);
Debug.Log("Total Session Time (ms): " + profile["total_session_time"]);
Debug.Log("Average Session Length (ms): " + profile["average_session_length"]);
Debug.Log("Last Session Length (ms): " + profile["last_session_length"]);
Debug.Log("IAP Transaction Count: " + profile["iap_transaction_count"]);
Debug.Log("Total ILRD Revenue USD: " + profile["total_ilrd_revenue_usd"]);
// Convert milliseconds to seconds if needed
long totalTimeMs = long.Parse(profile["total_session_time"]);
Debug.Log($"Total Session Time: {totalTimeMs / 1000.0:F1} seconds");
// Revenue by currency is a JSON string (conditional)
if (profile.ContainsKey("iap_revenue_by_currency"))
{
Debug.Log("IAP Revenue by Currency: " + profile["iap_revenue_by_currency"]);
// Example: {"USD":99.99,"EUR":49.99}
}
// Product IDs is a JSON array string (conditional)
if (profile.ContainsKey("purchased_product_ids"))
{
Debug.Log("Purchased Products: " + profile["purchased_product_ids"]);
// Example: ["com.app.coins100","com.app.coins500"]
}
}
else
{
Debug.Log("User profile not available yet");
}Restablecer el perfil de usuario #
Borra todas las métricas registradas del usuario actual. Resulta útil para realizar pruebas o cuando un usuario cierra sesión.
BaseTenjin instance = Tenjin.getInstance("<SDK_KEY>");
instance.ResetUserProfile();
Debug.Log("User profile has been reset");Notas específicas de cada plataforma #
Disponibilidad de los datos:
Los datos del perfil de usuario están disponibles una vez que se ha registrado la primera sesión. El método GetUserProfileDictionary() devuelve datos en tiempo real desde la caché en memoria del SDK.
Unidades de tiempo:
- Todos los valores de tiempo se expresan ahora en milisegundos tanto en iOS como en Android, en aras de la coherencia
- Convierte a segundos si es necesario:
milliseconds / 1000.0
Tipos de datos complejos:
- Los mapas de ingresos (
iap_revenue_by_currency,ilrd_revenue_by_network) se devuelven como cadenas JSON:{"USD":99.99,"EUR":49.99} - Las matrices de ID de productos (
purchased_product_ids) se devuelven como cadenas JSON:["product1","product2"]
Integración de los ingresos publicitarios por impresiones #
Tenjin es compatible con la función «Ingresos publicitarios por impresión» (ILRD) de,
- AppLovin MAX
- Unity LevelPlay
- HyperBid
- AdMob
- TopOn
- CAS
- TradPlus
- CloudX
Esta función te permite recibir notificaciones sobre los ingresos publicitarios que se generan cada vez que se muestra un anuncio a un usuario. Puedes acceder a la guía de integración aquí.
Pruebas #
Puedes comprobar si la integración funciona correctamente con nuestra herramienta de datos de dispositivos de prueba en tiempo real. Añade tu advertising_id o IDFA/GAID a la lista de dispositivos de prueba. Encontrarás esta información en Soporte -> Dispositivos de prueba. Ve a la página Herramienta de eventos en tiempo real y envía los eventos de prueba desde tu aplicación. Deberías ver cómo llegan los eventos en tiempo real:
