Integrar utilizando LLMs (IA) – Utilize o seguinte prompt:
Adicione o SDK do Tenjin ao meu projeto utilizando: https://raw.githubusercontent.com/tenjin/sdk-llm-guides/main/guides/unity/llm-guide.md
Resumo #
A documentação abaixo descreve o SDK do Unity para o Tenjin. Para saber mais sobre o Tenjin e a nossa gama de produtos, visite https://www.tenjin.com.
- Consulte as nossas Notas de Lançamento para ver o histórico detalhado das alterações introduzidas nas versões.
- O Tenjin Unity SDK suporta tanto o iOS como o Android.
- Consulte as documentações do iOS e do Android e aplique as definições adequadas da plataforma às suas compilações. (iOS, Android)
- Em caso de dúvidas ou para obter assistência, contacte: support@tenjin.com.
Se estiver a utilizar o Unity SDK v1.12.29 ou uma versão anterior, siga as instruções em estes passos antes de concluir a integração do SDK.
Para atualizar para a versão 1.12.30 ou superior a partir de versões anteriores, certifique-se de que remove os ficheiros binários do Tenjin antes de instalar a versão mais recente do Unity.
Se receber este erro ao compilar no iOS: Biblioteca não carregada: @rpath/TenjinSDK.framework/TenjinSDK, tem de aceder a “Frameworks, Libraries and Embedded Content” e adicionar o TenjinSDK; em seguida, selecione ‘Embed & Sign’
Se tiver libTenjinSDK.a e/ou libTenjinSDKUniversal.a de versões mais antigas do SDK da Tenjin, por favor, elimine-os e execute pod Install para o integrar no iOS
Gestor de Pacotes do Unity (UPM) #
Para instalar um pacote UPM a partir de um URL do Git:
- Abra a janela do Gestor de Pacotes, caso ainda não esteja aberta.
- Abra o menu «Adicionar» (+) na barra de ferramentas do Gestor de Pacotes.
- Selecione Instalar pacote a partir do URL do Git no menu Instalar. Aparecem uma caixa de texto e um botão Instalar.
- Introduza o seguinte URL válido do Git na caixa de texto (deve acrescentar
#seguido da etiqueta da versão):https://github.com/tenjin/tenjin-unity-sdk.git#1.16.5 - Clique em Instalar.
Instalação manual (.unitypackage) #
- Descarregue a versão mais recente do SDK do Unity a partir de aqui.
- Importe o
TenjinUnityPackage.unitypackagepara o seu projeto:Assets -> Importar Pacote.
Nota importante sobre o Android #
Para garantir que o Tenjin funcione na perfeição com as funcionalidades e correções mais recentes, certifique-se de que as suas dependências do Maven (Gradle) estão atualizadas, uma vez que distribuímos o nosso SDK Tenjin Android através do Maven. Verificámos que alguns programadores ainda utilizam versões desatualizadas, o que pode causar problemas.
Se estiver a compilar através do Android Studio, certifique-se de que executa a sincronização do Gradle para atualizar as dependências.
Se não utilizar o Android Studio, atualize as suas dependências no Unity seguindo estes passos:
- Abra o Unity.
- Aceda a Ativos > Gestor de Dependências Externas > Android Resolver.
- Selecione «Force Resolve» para atualizar as suas dependências do Gradle para as versões mais recentes.
Google Play #
Por predefinição, unspecified é a App Store predefinida. Atualize o valor da App Store para googleplay, se distribuir a sua aplicação na Google Play Store.
Defina o valor de «Tipo de App Store» para googleplay:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.googleplay);O SDK do Tenjin requer as seguintes autorizações:
<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) -->Os Serviços do Google Play exigem que todas as aplicações com nível de API 32 (Android 13) que utilizem o advertising_id (Android Advertising ID (AAID)) declarem a autorização AD_ID dos Serviços do Google Play (conforme indicado abaixo) no seu ficheiro de manifesto. É necessário atualizar o tenjin-android-sdk para a versão 1.12.8 para poder utilizar a permissão abaixo.
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>ID de publicidade Android (AAID) e Referenciador de instalação #
Adicione o ID de publicidade Android (AAID) e Install Referrer, e adicione-as ao seu ficheiro build.gradle.
dependencies {
implementation 'com.google.android.gms:play-services-ads-identifier:{version}'
implementation 'com.android.installreferrer:installreferrer:{version}'
}Para poder recolher o Install Referrer da Meta, adicione estas consultas ao seu manifesto Android:
<queries>
<package android:name="com.facebook.katana" />
</queries>
<queries>
<package android:name="com.instagram.android" />
</queries>Em seguida, adicione o seguinte ao seu ficheiro strings.xml (pode criar este ficheiro modelo para armazenar o valor da string com base neste este guia):
<string name="facebook_app_id" translatable="false">YOUR_META_APP_ID</string>Loja Amazon #
Por predefinição, não especificado é a App Store predefinida. Atualize o valor da App Store para amazon, se distribuir a sua aplicação na loja Amazon.
Defina o valor de «Tipo de App Store» para amazon:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.amazon);OAID e outras lojas de aplicações Android #
O Tenjin permite promover a sua aplicação noutras lojas de aplicações Android utilizando o Android OAID. Temos os seguintes requisitos para a integração das bibliotecas OAID. Se pretender lançar a sua aplicação fora do Google Play, certifique-se de que implementa estas bibliotecas OAID.
MSA OAID #
O MSA OAID é um identificador publicitário para dispositivos fabricados na China, fornecido pela MSA (Mobile Security Alliance). Para integração com a biblioteca MSA, descarregue o seguinte oaid\_sdk\_1.0.25.aar.
Coloque o ficheiro oaid_sdk_1.0.25.aar no diretório "Android libs" do seu projeto: /Assets/Plugins/Android
Defina o valor de «Tipo de App Store» para other:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.other);Huawei OAID #
Fora da China, pode obter o OAID utilizando a biblioteca fornecida pela Huawei. Para integração com a biblioteca OAID da Huawei, descarregue o seguinte ficheiro AAR da Huawei: huawei-ads-identifier.aar. Se a sua aplicação estiver na Huawei App Gallery, descarregue e adicione o ficheiro Huawei Install Referrer: huawei-ads-installreferrer.aar.
Coloque os ficheiros da Huawei no diretório «libs» do seu projeto Android: /Assets/Plugins/Android
Defina o valor de «Tipo de App Store» para other:
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetAppStoreType(AppStoreType.other);Definições do 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*Se estiver a utilizar bibliotecas da Huawei, pode utilizar estas definições:
-keep class com.huawei.hms.ads.** { *; }
-keep interface com.huawei.hms.ads.** { *; }Inicialização da aplicação #
- Obtenha a sua
SDK_KEYna página da sua aplicação. Nota:SDK_KEYé única para cada uma das suas aplicações. Pode criar até 3 chaves para a mesma aplicação.

- No método
Start()do seu projeto, adicione a seguinte linha de código. Adicione também aoOnApplicationPause()se pretender enviar dados da sessão quando um utilizador retomar a utilização da aplicação a partir do 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: Certifique-se de que implementa este código em todos os métodos Start() e OnApplicationPause(), e não apenas na primeira vez que a aplicação for aberta.
App Store #
Suportamos três opções de lojas de aplicações,
- googleplay
- Amazon
- outro
Por predefinição, não especificado é a App Store predefinida. Se estiver a publicar numa App Store específica, atualize o valor da App Store para o valor adequado. O valor da App Store outros é utilizado para a Huawei AppGallery e outras lojas de aplicações:
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 da versão iOS 14, tem a opção de apresentar o aviso inicial de autorizações do ATTrackingManager e a seleção para os utilizadores aceitarem ou recusarem a participação.
- Se o dispositivo não aceitar a autorização de rastreamento, o IDFA passará a ser zero. Se o dispositivo aceitar a autorização de rastreamento, o método
Connect()enviará o IDFA para os nossos servidores. - Também pode continuar a chamar a função
connect()do Tenjin, sem utilizar o ATTrackingManager. Pode optar por não implementar o ATT se não pretender aceder ao IDFA de nenhum utilizador nem o transmitir ao 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
}
}Exibir um aviso de autorização da ATT #
Para cumprir as diretrizes da Apple relativas à ATT, deve fornecer uma descrição para o aviso de autorização da ATT e, em seguida, implementar o pedido de autorização na sua aplicação.
> Nota: É necessário implementar o pedido de autorização antes de exibir anúncios no seu jogo.
Configurar uma descrição de acompanhamento do utilizador #
A Apple exige uma descrição para o aviso de autorização ATT. Tem de definir a descrição com a chave NSUserTrackingUsageDescription no ficheiro Info.plist do seu projeto Xcode. Deve fornecer uma mensagem que informe o utilizador sobre o motivo pelo qual está a solicitar permissão para utilizar dados de rastreamento do dispositivo:
- No navegador de projetos do Xcode, abra o ficheiro
Info.plist. - Clique no botão «Adicionar» (+) ao lado de qualquer chave no editor da lista de propriedades para criar uma nova chave de propriedade.
- Introduza o nome da chave
NSUserTrackingUsageDescription. - Selecione um tipo de valor de cadeia de caracteres.
- Introduza a mensagem de transparência relativa ao rastreio de aplicações no campo de valor. Alguns exemplos incluem:
- “Iremos utilizar os seus dados para lhe proporcionar uma experiência publicitária melhor e personalizada.”
- “Procuramos apresentar anúncios de aplicações e produtos que sejam mais do seu interesse, com base nas aplicações que utiliza, no dispositivo que está a utilizar e no país em que se encontra.”
- “Procuramos apresentar anúncios de aplicações e produtos que sejam mais do seu interesse, com base nas aplicações que utiliza.”
> Nota: A Apple disponibiliza orientações específicas da App Store que definem a utilização aceitável e as mensagens a transmitir relativamente a todas as funcionalidades relacionadas com a privacidade destinadas aos utilizadores finais. A Tenjin não presta aconselhamento jurídico. Por conseguinte, a informação contida nesta página não substitui a procura de aconselhamento jurídico para determinar os requisitos legais da sua empresa e dos seus processos, bem como a forma de os cumprir.
SKAdNetwork e valores de conversão #
No âmbito da SKAdNetwork, criámos um método wrapper para updatePostbackConversionValue(_:). O nosso método irá registar os métodos equivalentes da SKAdNetwork e também enviar os valores de conversão para os nossos servidores.
updatePostbackConversionValue(_:) O valor de 6 bits deve corresponder ao evento na aplicação e não deve ser introduzido como representação binária, mas sim como um número inteiro entre 0 e 63. O nosso servidor rejeitará quaisquer valores inválidos.
A partir da versão iOS 16.1, que suporta o SKAdNetwork 4.0, já é possível enviar coarseValue (String, com as variantes possíveis “low”, “medium” ou “high”) e lockWindow (Boolean) como parâmetros no método de postback de atualização:
updatePostbackConversionValue(conversionValue: Integer, coarseValue: String)
updatePostbackConversionValue(conversionValue: Integer, coarseValue: String, lockWindow: Bool)
- Na versão 16.1+ do iOS, que suporta o SKAdNetwork 4.0, pode chamar este método quantas vezes quiser e definir o valor da conversão para um valor inferior ou superior ao valor anterior.
- Para versões do iOS anteriores à 16.1 que suportem versões do SKAdNetwork anteriores à 4.0, pode chamar este método e o nosso SDK irá detetar automaticamente a versão do iOS e atualizar apenas
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 e iOS: Postbacks de anunciantes para maiores de 15 anos #
Para definir a Tenjin como destino dos seus postbacks da SK Ad Network, proceda da seguinte forma:
- Selecione
Info.plistno navegador do projeto no Xcode. - Clique no botão «Adicionar» (+) ao lado de uma chave no editor da lista de propriedades e prima a tecla Return.
- Digite o nome da chave
NSAdvertisingAttributionReportEndpoint. - Selecione «String» no menu suspenso da coluna «Tipo».
- Entrar
https://tenjin-skan.com
Estes passos foram adaptados das instruções da Apple disponíveis em https://developer.apple.com/documentation/storekit/skadnetwork/configuring_an_advertised_app.
RGPD #
No âmbito da conformidade com o RGPD, com o SDK da Tenjin pode ativar ou desativar a participação de dispositivos/utilizadores, ou selecionar quais os parâmetros específicos relacionados com o dispositivo que pretende ativar ou desativar. OptOut() não enviará quaisquer pedidos de API à Tenjin, e não processaremos quaisquer eventos.
Para subscrever/cancelar a subscrição:
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 ativar ou desativar parâmetros específicos relacionados com o dispositivo, pode utilizar a função
OptInParams()ouOptOutParams(). A função OptInParams()enviará apenas os parâmetros relacionados com o dispositivo que forem especificados.OptOutParams()enviará todos os parâmetros relacionados com o dispositivo, exceto aqueles que forem especificados.- Por favor, tenha em atenção que necessitamos dos seguintes parâmetros para efetuar o acompanhamento adequado dos dispositivos no sistema da Tenjin. Se algum destes parâmetros obrigatórios estiver em falta, o evento não será processado nem registado.
- Para o Android,
advertising_id
- Para iOS
developer_device_id
- Se pretender direcionar anúncios para redes publicitárias baseadas em IMEI e/ou OAID no modelo Android, adicione:
imeioaid
- Se pretender utilizar o Google AdWords, terá também de adicionar:
platformos_versionapp_versionlocaledevice_modelbuild_idadvertising_iddeveloper_device_id(para iOS)
Se pretender obter apenas parâmetros específicos relacionados com o dispositivo, utilize OptInParams(). No exemplo abaixo, iremos utilizar apenas estes parâmetros relacionados com o dispositivo: ip_address, advertising_id, developer_device_id, limit_ad_tracking, e 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();Se pretender enviar TODOS os parâmetros, exceto parâmetros específicos relacionados com o dispositivo, utilize OptOutParams(). No exemplo abaixo, iremos enviar TODOS os parâmetros relacionados com o dispositivo, exceto: locale, timezone e build_id.
BaseTenjin instance = Tenjin.getInstance("SDK_KEY");
List<string> optOutParams = new List<string> {"locale", "timezone", "build_id"};
instance.OptOutParams(optOutParams);
instance.Connect();Ativar/desativar através do CMP #
Pode ativar ou desativar automaticamente esta funcionalidade utilizando os seus consentimentos CMP (finalidade 1), que já se encontram guardados no dispositivo do utilizador. O método devolve um valor booleano para indicar se a funcionalidade está ativada ou desativada.
OptInOutUsingCMP()
BaseTenjin instance = Tenjin.getInstance(" ");
optInOut = instance.OptInOutUsingCMP(); Parâmetros relacionados com o dispositivo #
| Param | Descrição | Plataforma |
|---|---|---|
| endereço_IP | Endereço IP | Todos |
| id_publicitário | ID de publicidade do dispositivo | Todos |
| identificador_do_dispositivo_do_desenvolvedor | N.º de identificação do fornecedor | iOS |
| oaid | ID de Publicidade Aberta | Android |
| IMEI | IMEI do dispositivo | Android |
| limitar_o_rastreio_de_publicidade | rastreamento de anúncios limitado ativado | Todos |
| plataforma | plataforma | Todos |
| referente | Referência de instalação do Google Play | Android |
| os_version | versão do sistema operativo | Todos |
| dispositivo | nome do dispositivo | Todos |
| fabricante_do_dispositivo | fabricante de dispositivos | Android |
| modelo_do_dispositivo | modelo do dispositivo | Todos |
| marca_do_dispositivo | marca do dispositivo | Android |
| produto_dispositivo | produto de equipamento | Android |
| nome_do_modelo_do_dispositivo | dispositivo máquina | iOS |
| device_cpu | nome da CPU do dispositivo | iOS |
| transportadora | operadora de telemóvel | Android |
| tipo_de_ligação | rede móvel ou Wi-Fi | Android |
| largura_do_ecrã | largura do ecrã do dispositivo | Android |
| altura_do_ecrã | altura do ecrã do dispositivo | Android |
| os_version_release | versão do sistema operativo | Todos |
| build_id | ID da compilação | Todos |
| configuração regional | configuração regional do dispositivo | Todos |
| país | país de localização | Todos |
| fuso horário | fuso horário | Todos |
Eventos de compra #
Validação do IAP iOS #
A validação do recibo iOS requer o transactionId e o recibo. A assinatura será definida como nula. No que diz respeito ao recibo, certifique-se de que envia o Payload do recibo (o recibo ASN.1 codificado em base64) a partir do Unity.
IMPORTANTE: Se tiver uma subscrição IAP, terá de adicionar a chave pública da sua aplicação no painel de controlo do Tenjin. Pode obter o seu segredo partilhado específico da aplicação iOS em Console do iTunes Connect > Selecione a sua aplicação > Informações da aplicação > Segredo partilhado específico da aplicação.
Validação do IAP Android #
Loja de aplicações do Google Play
A validação do recibo no Google Play exige a apresentação do recibo e uma assinatura (o «transactionId» está definido como nulo).
IMPORTANTE: Terá de adicionar a chave pública da sua aplicação no painel de controlo do Tenjin (na página de ‘edição’ da aplicação). Pode obter a sua chave pública RSA codificada em Base64 no Google Play Developer Console > Selecione a sua aplicação > Monetizar > Configuração de monetização > Faturação do Google Play > Licenciamento: Chave pública RSA codificada em Base64. Tenha em atenção que, no caso do Android, atualmente só suportamos transações IAP a partir do Google Play.
(NOTA) No Google Play, certifique-se de que ‘confirma’ o evento de compra antes de o enviar para a Tenjin. Para mais detalhes, leia aqui
Amazon AppStore
A validação de recibos da AppStore do Amazon requer os parâmetros receiptId e userId.
IMPORTANTE: Terá de adicionar a chave partilhada da sua aplicação Amazon no painel de controlo do Tenjin. A chave secreta pode ser encontrada na secção "Chave Partilhada" da sua conta de programador na conta da Amazon Appstore
Exemplo de IAP iOS e Android #
No exemplo abaixo, estamos a utilizar a biblioteca MiniJSON, amplamente utilizada, para a deserialização de JSON.
Se estiver a utilizar a versão 5 ou superior do Unity IAP:
No caso dos produtos consumíveis, o recibo só está disponível em PendingOrder. Assim que for confirmado (ConfirmedOrder), o recibo fica vazio. Processe sempre as compras e envie-as para a Tenjin em OnPurchasePending no caso de produtos consumíveis.
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);
}Se estiver a utilizar a versão 4 (ou anterior) do IAP do Unity:
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);
}(Configuração flexível da comissão da App Store) Escolha entre 0%, 15% e 30% como comissão sobre as receitas da App Store através da nossa nova configuração. Os passos são os seguintes: –
- Vá a CONFIGURAR –> Aplicações
- Clique na aplicação que pretende alterar
- Na secção ‘Comissão da App Store’, clique em ‘Editar’
- Escolha 30%, 15% ou 0% como a comissão que pretende receber da loja de aplicações.
- Selecione a data de início e a data de fim (ou pode deixar a data de fim em branco, se não quiser definir uma data de fim)
- Clique em «Guardar» (nota: a comissão só pode ser aplicada a datas futuras e não a datas passadas. Por isso, defina a data de início a partir da data em que efetuar a alteração e para a frente)
Assinatura IAP #
- É da sua responsabilidade enviar uma transação de subscrição uma vez durante cada intervalo de subscrição (ou seja, por exemplo, no caso de uma subscrição mensal, terá de nos enviar uma transação por mês). Na linha temporal de exemplo abaixo, só deve ser enviado um evento de transação nos eventos “Primeira cobrança” e “Renovação”. Durante o período de avaliação, não envie o evento de transação à Tenjin.
- O Tenjin não elimina as transações duplicadas.
- Se tiver uma subscrição IAP do iOS, terá de adicionar a chave pública da sua aplicação no painel de controlo do Tenjin. Pode obter o seu segredo partilhado específico da aplicação iOS em Console do iTunes Connect \> Selecione a sua aplicação \> Funcionalidades \> Compras na aplicação \> Segredo partilhado específico da aplicação.
- Para mais informações sobre as subscrições do iOS, consulte: Documentação da Apple sobre como trabalhar com subscrições
- Para mais informações sobre as subscrições do Android, consulte: Documentação sobre subscrições do Google Play Billing
Eventos personalizados #
IMPORTANTE: Limite os nomes dos eventos personalizados a menos de 80 caracteres. Não exceda os 500 nomes únicos de eventos personalizados.
- Inclua a pasta «Assets» no seu projeto do Unity
- No método do evento personalizado dos seus projetos, escreva o seguinte para um evento com nome:
Tenjin.getInstance("").SendEvent("name")e o seguinte para um evento com nome e um valor inteiro:Tenjin.getInstance("").SendEvent("nameWithValue","value") - Certifique-se de que
valorpassado é um valor inteiro (por exemplo, “2000”, e não “0,02”). Sevalornão for um valor inteiro, o parâmetrovalorserá omitido.
Eis um exemplo do 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") destina-se a eventos que são marcadores estáticos ou marcos. Isto inclui elementos como tutorial_complete, registration ou level_1.
.SendEvent("name", "value") destina-se a eventos em que se pretende realizar cálculos matemáticos sobre uma propriedade desse evento. Por exemplo, ("coins_purchased", "100") permite-lhe calcular a soma ou a média das moedas adquiridas nesse evento.
Integração entre servidores #
A Tenjin oferece integração servidor a servidor. Isto permite-lhe enviar os seus eventos de instalação e pós-instalação diretamente dos seus servidores para os servidores da Tenjin, sem necessidade de integração de um SDK.
Parâmetro «Subversion» da aplicação para testes A/B #
Se estiver a realizar testes A/B e pretender comunicar as diferenças, podemos acrescentar um valor numérico à versão da sua aplicação utilizando o método AppendAppSubversion(). Por exemplo, se a versão da sua aplicação for 1.0.1 e definir AppendAppSubversion(8888), a versão da aplicação será apresentada como 1.0.1.8888.
Estes dados serão apresentados no DataVault, onde poderá gerar relatórios utilizando os valores de subversão da aplicação.
BaseTenjin instance = Tenjin.getInstance(" ");
instance.AppendAppSubversion(8888);
instance.Connect();Campanhas LiveOps #
O Tenjin permite a recuperação de informações de atribuição do utilizador, tais como a rede publicitária de origem e a campanha, a partir do SDK. Isto permitirá aos programadores recolher e analisar dados de atribuição ao nível do utilizador em tempo real. Aqui estão os possíveis casos de utilização com as Campanhas Tenjin LiveOps:
- Se tiver a sua própria ferramenta de análise de dados, o callback S2S permitir-lhe-á associar os dados de atribuição aos seus dados no jogo, ao nível de cada dispositivo.
- Mostre conteúdos diferentes na aplicação, dependendo da origem do utilizador. Por exemplo, se o utilizador A for atribuído ao tráfego orgânico e o utilizador B for atribuído ao Facebook, e se for provável que o utilizador B se envolva mais com a sua aplicação, então convém mostrar-lhe uma oferta especial no jogo depois de o utilizador instalar a aplicação. Se quiser discutir casos de utilização mais específicos, escreva para support@tenjin.com.
Pode encontrar mais informações sobre como utilizar o LiveOps aqui.
ID de utilizador do cliente #
Pode definir e obter o ID de utilizador do cliente para o enviar como parâmetro nos eventos.
.SetCustomerUserId("user_id")
.GetCustomerUserId()
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetCustomerUserId("user_id");
string userId = instance.GetCustomerUserId(); ID de instalação do Analytics #
Pode obter o ID de análise, que é gerado aleatoriamente e guardado no armazenamento local do dispositivo. GetAnalyticsInstallationId()
BaseTenjin instance = Tenjin.getInstance(" ");
analyticsId = instance.GetAnalyticsInstallationId; Eventos de nova tentativa/cache #
Pode ativar ou desativar a repetição de tentativas e o armazenamento em cache de todos os eventos quando as solicitações falham ou os utilizadores não têm ligação à Internet. Estes eventos serão enviados depois de um novo evento ter sido adicionado à fila e de o utilizador ter recuperado a ligação.
.SetCacheEventSetting(true)
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetCacheEventSetting(true); Parâmetros do Google DMA #
Se já tiver uma CMP integrada, os parâmetros do Google DMA serão recolhidos automaticamente pelo SDK do Tenjin. Não é necessário implementar nada no SDK do Tenjin se tiver uma CMP integrada. Se pretender substituir a sua CMP ou, simplesmente, criar os seus próprios mecanismos de consentimento, pode utilizar o seguinte:
SetGoogleDMAParameters(bool, bool)
BaseTenjin instance = Tenjin.getInstance(" ");
instance.SetGoogleDMAParameters(adPersonalization, adUserData); Para gerir explicitamente a recolha de parâmetros do Google DMA, tem a flexibilidade de ativar ou desativar esta funcionalidade a qualquer momento. Embora a configuração predefinida seja a ativação, pode ajustar facilmente as suas preferências utilizando os métodos OptInGoogleDMA ou OptOutGoogleDMA, garantindo assim o controlo total sobre as suas definições de privacidade de dados:
instance.OptInGoogleDMA();
instance.OptOutGoogleDMA(); Perfil do utilizador – LiveOps Metrics #
O SDK do Tenjin monitoriza e agrega automaticamente métricas relativas às sessões dos utilizadores e às receitas, que podem ser utilizadas em campanhas LiveOps, na segmentação de utilizadores e em análises. A funcionalidade «Perfil do Utilizador» proporciona acesso em tempo real a estas métricas para cada utilizador individualmente.
Métricas monitorizadas #
O SDK monitoriza automaticamente as seguintes métricas por utilizador:
| Métrico | Descrição | Tipo |
|---|---|---|
session_count | Número total de sessões | Número inteiro |
total_session_time | Tempo acumulado da sessão em milissegundos | Número |
average_session_length | Duração média da sessão em milissegundos | Número |
last_session_length | Duração da última sessão concluída em milissegundos | Número |
iap_transaction_count | Número total de transações IAP | Número inteiro |
total_ilrd_revenue_usd | Receitas totais de publicidade da ILRD em dólares americanos | Número |
first_session_date | Carimbo de data/hora ISO 8601 da primeira sessão | String |
last_session_date | Carimbo de data/hora ISO 8601 da sessão concluída mais recente | String |
current_session_length | Duração da sessão ativa atual em milissegundos | Número |
iap_revenue_by_currency | Discriminação das receitas por código de moeda | Cadeia de caracteres JSON |
purchased_product_ids | Matriz de IDs de produtos adquiridos | Cadeia de caracteres JSON |
ilrd_revenue_by_network | Receitas do ILRD por rede de publicidade | Cadeia de caracteres JSON |
Nota: Os campos condicionais (datas, sessão atual, mapas de receitas, matrizes de produtos) só são incluídos no dicionário se existirem dados.
Métodos disponíveis #
Obter o dicionário de perfis de utilizador #
Devolve um dicionário que contém todas as métricas monitorizadas para o utilizador atual. Todos os valores são devolvidos como cadeias de caracteres (os números, os vetores JSON e os objetos JSON são convertidos em cadeias 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");
}Redefinir perfil de utilizador #
Limpa todas as métricas monitorizadas do utilizador atual. Útil para testes ou quando um utilizador termina a sessão.
BaseTenjin instance = Tenjin.getInstance("<SDK_KEY>");
instance.ResetUserProfile();
Debug.Log("User profile has been reset");Notas específicas da plataforma #
Disponibilidade de dados:
Os dados do perfil do utilizador ficam disponíveis após o registo da primeira sessão. O método GetUserProfileDictionary() devolve dados em tempo real a partir da cache em memória do SDK.
Unidades de tempo:
- Todos os valores de tempo estão agora expressos em milissegundos, tanto no iOS como no Android, por uma questão de consistência
- Converta para segundos, se necessário:
milliseconds / 1000.0
Tipos de dados complexos:
- Os mapas de receitas (
iap_revenue_by_currency,ilrd_revenue_by_network) são devolvidos como cadeias de caracteres JSON:{"USD":99,99,"EUR":49,99} - As matrizes de IDs de produtos (
purchased_product_ids) são devolvidas como cadeias de caracteres JSON:["product1","product2"]
Integração das receitas publicitárias com base no número de impressões #
O Tenjin suporta a integração com a funcionalidade «Impression Level Ad Revenue» (ILRD) da,
- AppLovin MAX
- Unity LevelPlay
- HyperBid
- AdMob
- TopOn
- CAS
- TradPlus
- CloudX
Esta funcionalidade permite-lhe receber eventos relacionados com as suas receitas publicitárias, que são afetadas por cada anúncio apresentado a um utilizador. Pode aceder ao guia de integração aqui.
Testes #
Pode verificar se a integração está a funcionar corretamente com a nossa Ferramenta de Dados de Dispositivos em Teste ao Vivo. Adicione o seu advertising_id ou IDFA/GAID à lista de dispositivos de teste. Pode encontrar esta informação em Suporte -> Dispositivos de Teste. Aceda à página Ferramenta de Eventos em Tempo Real e envie os eventos de teste a partir da sua aplicação. Deverá ver os eventos em tempo real a chegar:
