Guia de integração do Unity SDK

 

Novo: Guia em vídeo

Assista a este vídeo para obter uma visão detalhada do processo de integração e teste. Recomendamos usar tanto o vídeo quanto o guia escrito abaixo.

Antes de começar: Pré-requisitos do SDK

Siga as etapas em Integração de um SDK Singular:Planejamento e pré-requisitos.

Essas etapas são pré-requisitos para qualquer integração do Singular SDK.

1. Instalação do SDK

1.1. Download e importação do pacote do SDK

Importando o pacote personalizado do Unity

Se estiver atualizando da versão 4.3.2 ou anterior?

Navegue até Assets > Plugins > iOS e remova os seguintes arquivos antes de importar o novo unitypackage!

  • Attributes.h
  • Events.h
  • libSingular.a
  • Singular.h
  • SingularAdData.h
  • SingularConfig.h
  • SingularLinkParams.h
  1. Faça o download do arquivo New Singular SDK unitypackage v4.4.1 arquivo.
  2. No menu Unity, navegue até:

    • Assets > Import Package > Custom package
    • Selecione o arquivo baixado unitypackage
    • Selecione Import (Importar)

1.2. Configuração para Android

DICA: Como atualizar o AndroidManifest ao usar o Unity.
  1. A partir do Unity v2018.3, você pode adicionar seu próprio arquivo AndroidManifest simplesmente ativando a propriedade Manifesto principal personalizado na janela Player (que pode ser acessada por File > Build Settings > Player Settings > Publishing settings). Isso gera um arquivo AndroidManifest.xmlpadrão para você, que pode ser editado.

    O arquivo estará no local: Assets/Plugins/Android/AndroidManifest.xml

    Fonte: https://docs.unity3d.com/2023.2/Documentation/Manual/android-manifest.html

  2. Em vez de usar o arquivo de manifesto principal personalizado do Unity, você pode acessar o AndroidManifest.xml do Android Studio depois de exportar o aplicativo do Unity.

DICA: Como atualizar as configurações do Gradle ao usar o Unity.
  1. A partir do Unity v2018.3, você pode adicionar o seu próprio habilitando a propriedade Custom Gradle Template na janela Player (que pode ser acessada pelo custom Gradle build file simplesmente pelo File > Build Settings > Player Settings > Publishing settings). Isso gera um arquivo mainTemplate.gradlepadrão para você, que pode ser editado.

    O arquivo estará no local: Assets/Plugins/Android/mainTemplate.gradle

    Fonte: https://docs.unity3d.com/2023.2/Documentation/Manual/android-gradle-overview.html

  2. Em vez de usar o arquivo de compilação Gradle personalizado do Unity, você pode acessar o Apps build.gradle do Android Studio depois de exportar o aplicativo do Unity.

DICA: você planeja oferecer suporte a dispositivos Android 12?

Adicione o arquivo play-services-ads-identifier-18.0.1.aar à sua pasta Assets/Plugins/Android/ para que o Unity inclua a dependência necessária para capturar o Google Advertising Identifier. Se você já tiver essa dependência, poderá pular esta etapa.

Atualize as permissões do AndroidManifest

Em seu arquivo AndroidManifest.xml, adicione as seguintes permissões:


<!--  Essa permissão é necessária para usar a conectividade com a Internet  -->
<uses-permission android:name="android.permission.INTERNET" />

<!--  Essa permissão é necessária para verificar se há uma conexão ativa com a Internet  -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<!--  Essa permissão é necessária para recuperar os dados do Google Play Referrer  -->
<uses-permission android:name="BIND_GET_INSTALL_REFERRER_SERVICE" />

<!--  Essa permissão é necessária para validar o Google Install Fraud  -->
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
	
Você desativou as dependências transitivas para o Singular SDK?
  1. Se você desativou as dependências transitivas para o SDK da Singular, adicione o seguinte ao build.gradle do seu aplicativo.

    implementation 'com.android.installreferrer:installreferrer:2.2'
    implementation 'com.google.android.gms:play-services-appset:16.0.0'
  2. O Singular SDK requer a API do Google Mobile Ads, parte das APIs do Google Play Services 17.0.0+. Se você já integrou o Google Play Services ao seu aplicativo, o requisito foi atendido. Caso contrário, você poderá integrar o Google Mobile Ads individualmente, incluindo a seguinte dependência no arquivo build.gradle do seu aplicativo:

    implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1+'

    Para obter mais informações, consulte o guia do Google para configurar o Google Play Services.

Você está usando o Proguard ou o Eclipse?

Se estiver usando o Proguard, adicione as seguintes linhas de código ao seu arquivo proguard-unity.txt:

-keep class com.singular.sdk.** { *; }
-keep public class com.android.installreferrer.** { *; }
-keep public class com.singular.unitybridge.** { *; }

Se estiver criando com o Eclipse, use um dos métodos a seguir para integrar a AAR ao seu projeto do Eclipse:

  1. Descompacte singular_sdk-12.x.x.aar.
  2. Renomeie classes.jar para singular_sdk-12.x.x.jar (esse é o jar principal do SDK).
  3. Integre o jar acima e libs/installreferrer-release.jar (a biblioteca da API do Google Referrer) em seu projeto Eclipse da maneira que preferir.
  4. Copie a permissão BIND_GET_INSTALL_REFERRER_SERVICE do AndroidManifest.xml contido no AAR para o seu AndroidManifest.xml.

1.3. Configuração para iOS

Depois de compilar a partir do Unity, vincule as seguintes bibliotecas/frameworks ao seu projeto Unity XCode. Navegue até o destino UnityFramework e escolha Build Phases > Link Binary with Libraries. Adicione o seguinte:

  • WebKit.framework
  • libsqlite3.0.tbd
  • libz.tbd
  • AdServices.framework (Deve ser adicionado, mas marque-o como Opcional , pois só está disponível para dispositivos com iOS 14.3 e superior). Também é obrigatório se você planeja executar no Apple Search Ads!

Importante: o AdServices.framework é necessário no App Build se você planeja utilizar o Apple Search Ad Campaigns e deseja rastrear a atribuição.

2. Integração do SDK

2.1. Configuração do objeto SingularSDKObject

No painel Hierarquia da plataforma Unity:

  1. Adicione um"Empty GameObject" à sua cena principale dê a ele o nome exato de: SingularSDKObject.

  2. Adicione um componente de script em SingularSDKObject e selecione o script SingularSDK.

  3. No painel Inspection (Inspeção) do SingularSDKObject, cole sua Singular SDK Key e SDK Secretnos respectivos campos. Para recuperar a chave e o segredo do SDK, faça login em sua conta do Singular e acesse "Developer Tools > SDK Integration > SDK Keys").

    Se a chave e o segredo do SDK da Singular forem aplicados incorretamente, os dados não serão enviados à Singular.
    Teste sua implementação usando o Console do Singular SDK para verificar o comportamento correto.

Observação: Configurações padrão do painel de inspeção para o site SingularSDKObject:

As seguintes opções estão ativadas no painel de inspeção:

  • Initialize On Awake (marcada)

    Essa configuração permite que o Unity controle a inicialização do Singular SDK com base no status Awake do aplicativo.

    Certifique-se de seguir a conformidade de privacidade para os requisitos de seu aplicativo e atualize essa opção conforme necessário. Desmarcar a opção desativa a inicialização do SDK da Singular no status Awake e exigiria a inicialização manual.

  • SKAN Enabled (marcada)

    A partir da versão 4.0.17 do SDK do Unity, a SKAdNetwork é ativada por padrão. Ela está ativada no Managed Mode (no qual a Singular atualiza o valor de conversão SKAN para você usando um modelo de conversão que você escolhe no painel da Singular).

    Desde que você esteja usando a versão mais recente do SDK, não é necessário definir mais nada nem adicionar nenhum código para usar a SKAdNetwork.

  • Wait For Tracking Authorization definido como 0 (desativado)

    Se o seu aplicativo estiver exibindo o prompt App Tracking Transparency (ATT), é recomendável definir esse tempo limite como 300 segundos. A adição do tempo limite atrasa a sessão do Singular SDK, permitindo que o usuário autorize/negue o consentimento do AppTrackingTransparency antes de registrar eventos nos servidores da Singular. Quando o usuário responder ao prompt ATT, o SDK da Singular continuará sem atrasos. Isso permite a captura do identificador IDFA para Atribuição de instalação quando o consentimento é fornecido. Se você não estiver exibindo ATT, o valor padrão dessa opção deverá permanecer 0 (sem espera).

  • Enable Logging (verificado)

    Ativa o registro de log detalhado do SDK da Singular. Deve ser usado com a opção "Log Level" (Nível de registro).

  • Log Level definido como 3

    Permite que o Singular SDK exiba os registros de aviso na saída do LogCat.

  • Ddl Timeout Sec definido como 0

    Por padrão, a configuração "0" usa um tempo limite de 60 segundos, o que informa ao servidor Singular por quanto tempo deve procurar um valor de deep link vinculado ao último atributo de toque. Se um deferred deep link for encontrado, ele será enviado de volta ao aplicativo na resposta da sessão do SDK e processado. Se nenhum deferred deep link for encontrado em 60 segundos, o servidor interromperá a busca.

  • Session Timeout Sec definido como 0

    Esse é o tempo limite em segundos antes que o Singular SDK registre uma nova sessão quando o aplicativo estava em segundo plano e retorna ao primeiro plano. Por padrão, a configuração de "0" usa um tempo limite de 60 segundos. Você pode ajustar essa configuração para uma janela maior, se necessário.

  • Shortlink Resolve Timeout definido como 0

    Por padrão, a configuração "0" usa um tempo limite de 10 segundos. Esse tempo limite protege a experiência do usuário e, se o shortlink fornecido não for resolvido no tempo especificado, nenhum manipulador de deeplink será acionado pelo Singular SDK.

Outras opções do painel de inspeção:

Habilitar Facebook (META Install Referrer)

Para dar suporte ao método de atribuição META Install Referrer, adicione sua ID de aplicativo do Facebook ao painel de inspeção no SingularSDKObject.

  1. Clique no SingularSDKObject em sua cena principal.
  2. Abra o painel de inspeção e localize o campo "Facebook App ID".
  3. Adicione sua ID de aplicativo do Facebook

2.2. Usando SKAdNetwork

A partir da versão 4.0.17 do Unity SDK, a SKAdNetwork é ativada por padrão. Ela está ativada no Managed Mode (no qual a Singular atualiza o valor de conversão SKAN para você usando um modelo de conversão que você escolhe no painel da Singular).

Desde que você esteja usando a versão mais recente do SDK, não é necessário definir mais nada nem adicionar nenhum código para usar a SKAdNetwork.

Informações adicionais

Como ativar a SKAdNetwork em versões mais antigas do SDK

Se estiver usando uma versão mais antiga do SDK, será necessário ativar a SKAdNetwork de uma das seguintes maneiras:

  • Vá para SingularSDKObject e defina SKANEnabled como True.
  • Chame SingularSDK.SkanRegisterAppForAdNetworkAttribution() no código do seu aplicativo.
Uso da SKAdNetwork no modo manual (avançado)

Se você optar por gerenciar o valor de conversão SKAN manualmente usando sua própria lógica, precisará fazer o seguinte:

  • Acesse SingularSDKObject e defina manualSKANConversionManagement como True.
  • Use os seguintes métodos em seu código para definir e recuperar o valor de conversão.
Método SingularSDK.SkanUpdateConversionValue
Descrição

Atualiza o valor de conversão de SKAdNetwork.

Observação: use esse método se você tiver selecionado a atualização manual do valor de conversão SKAdNetwork. Esse método funcionará somente se manualSKANConversionManagement estiver definido como True.

Assinatura public void SkanUpdateConversionValue(int value)
Exemplo de uso
// Aconteceu um evento de registro
Singular.Event("SignUp");

// Atualize o valor de conversão para 7
SingularSDK.SkanUpdateConversionValue(7);
Método SingularSDK.SkanGetConversionValue
Descrição Obtém o valor de conversão atual rastreado pelo Singular SDK.
Assinatura public int? SkanGetConversionValue()
Exemplo de uso
int? value = SingularSDK.SkanGetConversionValue();
Método SingularSDK.SetConversionValueUpdatedHandler
Descrição Define um manipulador para receber notificações quando o valor de conversão for atualizado.
Assinatura public void SetConversionValueUpdatedHandler(SingularConversionValueUpdatedHandler handler)
Exemplo de uso
public class Main : MonoBehaviour, SingularConversionValueUpdatedHandler {
  void Awake() {
    SingularSDK.SetConversionValueUpdatedHandler(this);
  }

  void OnConversionValueUpdated(int value) {
    // Use the conversion value
  }
}

2.3. Manipulação do consentimento do iOS App Tracking Transparency (ATT)

Você está exibindo o prompt App Tracking Transparency (ATT)?

A partir do iOS 14.5, os aplicativos são obrigados a solicitar o consentimento do usuário (usando a estrutura App Tracking Transparency) antes de poderem acessar e compartilhar alguns dados do usuário que são úteis para fins de rastreamento, incluindo o IDFA do dispositivo.

A Singular se beneficia muito de ter o IDFA para identificar dispositivos e realizar a atribuição de instalações (embora existam maneiras de realizar a atribuição sem o IDFA). Recomendamos enfaticamente que você solicite o consentimento do usuário para obter o IDFA.

Recomenda-se atrasar a inicialização do Singular SDK até que o usuário responda ao prompt ATT.

Por padrão, o Singular SDK envia uma sessão de usuário quando é inicializado. Quando uma sessão é enviada de um novo dispositivo, ela aciona imediatamente o processo de atribuição da Singular - que é realizado com base apenas nos dados disponíveis para a Singular naquele momento. Portanto, é essencial solicitar o consentimento e recuperar o IDFA antes que o SDK da Singular envie a primeira sessão.

DICA: se o seu aplicativo estiver exibindo o prompt App Tracking Transparency (ATT), é recomendável definir o tempo limite para 300 segundos. Se você não estiver exibindo o ATT, o valor padrão dessa opção deverá permanecer 0 (sem espera).

Para configurar o waitForTrackingAuthorizationWithTimeoutInterval, ajuste a opção de configuração no painel SingularSDKObject Inspection. Isso define o tempo máximo (em segundos) que o SDK da Singular aguardará para que o usuário autorize/negue o consentimento de AppTrackingTransparency antes de registrar eventos nos servidores da Singular.

2.4. Tratamento de deep links

Deep links são links que levam a um conteúdo específico dentro de um aplicativo. Quando um usuário clica em um deep link em um dispositivo que tem o aplicativo instalado, o aplicativo é aberto e mostra um produto ou uma experiência específica.

Os links de rastreamento singulares podem incluir links diretos, bem como links diretos diferidos(consulte as Perguntas frequentes sobre links diretos e as Perguntas frequentes sobre links singulares para obter mais informações).

As instruções abaixo mostrarão a você como:

  1. Acessar o link de rastreamento que levou à abertura do seu aplicativo,
  2. Ler o destino do deep link e
  3. Mostrar o conteúdo apropriado.

Observações:

Configuração de pré-requisitos de deep linking

  1. Pré-requisitos para iOS e Android: Siga as instruções em Pré-requisitos do Singular Links.

  2. Configuração adicional para Unity: No arquivo AndroidManifest.xml do aplicativo, altere a propriedade do nome da atividade do padrão UnityPlayerActivity:

    <activity android:name="com.unity3d.player.UnityPlayerActivity"

    para:

    <activity android:name="com.singular.unitybridge.SingularUnityActivity"

    ou:

    Observação: se você tiver implementado uma atividade personalizada, chame esse método em onNewIntent em sua atividade:

    @Override
    protected void onNewIntent(Intent intent) {
        setIntent(intent);
    
        // Call this method from your custom activity in onNewIntent
        SingularUnityBridge.onNewIntent(intent);
    }

Adição de um manipulador de Deep Links

O Singular SDK fornece um mecanismo de manipulador para ler os detalhes do link de rastreamento que levou à abertura do aplicativo.

Para usar o manipulador:

  1. Implemente a interface SingularLinkHandler.
  2. Chame o método SetSingularLinkHandler em qualquer ponto da classe para registrar a classe como o manipulador de deep links.
  3. Quando você chama SetSingularLinkHandler, o Singular SDK obtém o link de rastreamento e chama o método OnSingularLinkResolved, passando os detalhes do link de rastreamento para ele. Substitua esse método para ler os detalhes do link e processá-los.

O código de exemplo a seguir mostra as três etapas:

public class Main : SingularLinkHandler {
    // ...
    void Awake () {
      // Registre a classe como o manipulador do Singular Link.
      // Você pode chamar esse método em qualquer ponto da execução do aplicativo. Ele buscará os detalhes do link de rastreamento e chamará OnSingularLnkResolved.
      SingularSDK.SetSingularLinkHandler(this);
    }
    
    public void OnSingularLinkResolved(SingularLinkParams linkParams) {
      // O destino do deep link, conforme configurado na página Gerenciar links
      string deeplink = linkParams.Deeplink;
      
      // Os parâmetros de passagem adicionados ao link, se houver.
      string passthrough = linkParams.Passthrough;
      
      // Se o link está configurado como um deep link diferido.
      bool isLinkDeferred = linkParams.IsDeferred;
      
      // Adicione o código aqui para processar o deeplink
    }
    
    // ...

Referência do método

SetSingularLinkHandler
Método SetSingularLinkHandler
Descrição Registre um manipulador que recupera os detalhes do link de rastreamento que levou à abertura do aplicativo.
Assinatura
public void SetSingularLinkHandler(SingularLinkHandler 
handler)
Exemplo de uso
public class Main : MonoBehaviour, SingularLinkHandler {
    void Awake () {
        SingularSDK.SetSingularLinkHandler(this)
    }
}
OnSingularLinkResolved
OnSingularLinkResolved Method
Descrição Método de retorno de chamada para SetSingularLinkHandler. Leia os detalhes do link de rastreamento e processe-os.
Assinatura
public void OnSingularLinkResolved(SingularLinkParams
linkParams)

Observação: O objeto SingularLinkParams contém os seguintes valores:

  • Deeplink - O destino do deep link, conforme configurado na página Manage Links na plataforma Singular.
  • Passthrough - Parâmetros de passagem adicionados ao link, se houver.
  • IsDeferred - O link está configurado como um deep link diferido.
Exemplo de uso
public void OnSingularLinkResolved(SingularLinkParams
linkParams){ // Read the tracking link details and log them Debug.Log("deeplink: " + linkParams.Deeplink); Debug.Log("passthrough: " + linkParams.Passthrough); Debug.Log("is_deferred: " + linkParams.IsDeferred); }

Manuseio de deep links com links herdados

Se você é um cliente mais antigo da Singular, pode estar usando links de rastreamento herdados (o mecanismo de link de rastreamento mais antigo da Singular) em vez dos links mais recentes da Singular. Os links herdados são gerenciados nas páginas Create Link e View Links e também fornecem a funcionalidade de deep linking e de deferred deep linking.

Se a sua organização usa links herdados, você precisa implementar um manipulador para links profundos chamado SingularDeferredDeepLinkHandler em vez do SingularLinksHandler descrito acima. A implementação é muito semelhante.

2.5. Inicialização do SDK

Observação: lembre-se de manter a conformidade com as várias leis de privacidade promulgadas nas regiões em que você faz negócios, incluindo GDPR, CCPA, COPPA e outras, ao implementar os SDKs da Singular. Para obter mais informações, consulte Práticas de aceitação e exclusão de SDK.

O código de inicialização do SDK deve ser chamado sempre que seu aplicativo for aberto, pois é um pré-requisito para todas as funcionalidades de atribuição da Singular e também envia uma nova sessão para a Singular que é usada para calcular a retenção de usuários.

Por padrão, o SingularSDK.cs inicializa o SDK automaticamente quando a cena é criada, por meio do método Awake.

Inicialização manual

Se preferir inicializar o SDK manualmente em um momento posterior da execução do aplicativo, faça o seguinte:

  1. Desative a opção Initialize on Awake no painel de inspeção do objeto SingularSDK.
  2. Use o método estático SingularSDK.InitializeSingularSDK para inicializar o SDK:
Método SingularSDK.InitializeSingularSDK
Descrição Inicializa o Singular SDK se ele não tiver sido inicializado no Awake.
Assinatura
public void InitializeSingularSDK()
Exemplo de uso
// A chave SDK e o segredo SDK são definidos no 
// objeto de jogo associado ao SingularSDK SingularSDK.InitializeSingularSDK();

Observação sobre segurança de thread: O Singular Unity SDK deve ser sempre chamado da mesma thread, da mesma forma que você chama outros métodos do Unity.

2.6. Configuração do tempo limite da sessão (opcional)

Por padrão, se o aplicativo for executado em segundo plano por 60 segundos ou mais antes de retornar ao primeiro plano, o Singular SDK registrará uma nova sessão. Você pode alterar o valor de tempo limite padrão modificando a propriedade Session Timeout Sec de seu SingularSDKObject.

2.7. Envio da ID de usuário para a Singular (opcional)

Você pode enviar seu ID de usuário interno para a Singular usando um método do Singular SDK.

Observação: Se você usar a solução Cross-Device da Singular, deverá coletar o ID de usuário em todas as plataformas.

  • O ID do usuário pode ser qualquer identificador e não deve expor PII (Informações Pessoais Identificáveis). Por exemplo, você não deve usar o endereço de e-mail, nome de usuário ou número de telefone de um usuário. A Singular recomenda o uso de um valor hash exclusivo apenas para seus dados primários.
  • O valor do ID de usuário passado para a Singular também deve ser o mesmo ID de usuário interno que você captura em todas as plataformas (Web/Mobile/PC/Console/Offline).
  • A Singular incluirá o ID de usuário nas exportações em nível de usuário, ETL e postbacks de BI interno (se configurado). O ID do usuário é um dado primário e a Singular não o compartilha com terceiros.
  • O valor da ID de usuário, quando definido com o método Singular SDK, persistirá até que seja desfeito usando o método UnsetCustomUserId ou até que o aplicativo seja desinstalado. O fechamento ou a reinicialização do aplicativo não desinstala a ID de usuário.

Para definir a ID de usuário, use o método SetCustomUserId. Para desmarcá-la (por exemplo, se o usuário fizer "logout" da conta), chame UnsetCustomUserId.

Observação: se vários usuários usarem um único dispositivo, recomendamos a implementação de um fluxo de logout para definir e cancelar a definição da ID de usuário para cada login e logout.

Se você já souber a ID do usuário quando o aplicativo for aberto, ligue para SetCustomUserId antes de inicializar o SDK da Singular. Dessa forma, a Singular pode ter a ID de usuário desde a primeira sessão. No entanto, a ID do usuário normalmente não está disponível até que o usuário se registre ou faça um login. Nesse caso, chame SetCustomUserId após a conclusão do fluxo de registro.

Método SingularSDK.SetCustomUserId
Descrição Envia o ID do usuário para o Singular.
Assinatura public void SetCustomUserId(string customUserId)
Exemplo de uso
SingularSDK.SetCustomUserId("custom_user_id");
Método SingularSDK.UnsetCustomUserId
Descrição Desfaz a definição do ID de usuário que foi enviado para a Singular.
Assinatura public void UnsetCustomUserId()
Exemplo de uso
SingularSDK.UnsetCustomUserId();

Opcional: Mapeamento de dispositivo de ID de usuário personalizado

Importante: esse recurso avançado da Enterprise só está disponível em casos excepcionais. Consulte um dos engenheiros de soluções da Singular antes de implementá-lo.

A Singular pode receber dados adicionais de rastreamento de eventos móveis por meio de uma integração de servidor para servidor. Para utilizar esse recurso, você deve mapear o ID do usuário para o identificador de rastreamento de dispositivos móveis da Singular.

Observação: chame esse método o mais rápido possível após a inicialização do SDK da Singular ou assim que tiver o ID do usuário.

Método SingularSDK.SetDeviceCustomUserId
Descrição Define o ID de usuário personalizado igual ao login e o mapeia para o identificador de rastreamento da Singular.
Assinatura public void SetDeviceCustomUserId(string customUserId)
Exemplo de uso
SingularSDK.SetDeviceCustomUserId('CustomUserId');

3. Rastreamento de eventos e receita

3.1. Rastreamento de eventos (não receita)

A Singular pode coletar dados sobre eventos in-app para ajudar a analisar o desempenho de suas campanhas e medir KPIs. Por exemplo, sua organização pode querer coletar dados sobre logins de usuários, registros, conclusões de tutoriais ou aumento de nível em um aplicativo de jogos.

A Singular oferece suporte a uma variedade de eventos padrão, que são comumente usados pelas redes de anúncios para geração de relatórios e otimização. Outra vantagem é que, quando você usa nomes de eventos padrão, a Singular os reconhece automaticamente e os adiciona à lista de eventos sem que você precise defini-los manualmente. Recomendamos o uso de eventos padrão sempre que possível.

A lista de eventos enviados à Singular (com os atributos que os acompanham) deve ser compilada pela equipe de UA/marketing/negócios com base nos KPIs de marketing da sua organização. A equipe de negócios pode seguir o guia em How to Track In-App Events: Guide For Singular Attribution Customers (Guia para clientes de atribuição singular).

Com cada evento que você rastreia, é possível passar vários atributos. Veja os atributos padrão recomendados por evento.

Em seu código, envie eventos padrão para a Singular usando os métodos event ou eventWithArgs.

Observação: para eventos padrão, use o nome Unity do evento como ele aparece na Lista de eventos e atributos padrão do Unity SDK, por exemplo, sngLogin.

Para eventos personalizados, eventos que sua organização deseja medir e que não correspondem a nenhum dos eventos padrão da Singular, use qualquer nome personalizado (máximo de 32 caracteres). Recomendamos o uso de nomes em inglês para compatibilidade com quaisquer parceiros de rede de anúncios que possam receber o evento da Singular para fins de otimização.

Método SingularSDK.Event
Descrição Envie eventos do usuário ao Singular para rastreamento.
Assinatura
public static void Event(string name)
public static void Event(string name, params object[] args)
public static void Event(Dictionary<string, object> args,
string name)

Observação: Ao passar dicionários, os valores do dicionário devem ter um destes tipos: string, int, long, float, double, null, ArrayList, Dictionary<String,object>

Exemplo de uso

// Envie o Login do evento padrão
SingularSDK.Event(sngLogin);
  
// Um exemplo de evento personalizado passando dois pares de valores-chave
SingularSDK.Event("Myevent", "Key1", "Value1", "Key2", 1234);
// Um exemplo de JSONEvent passando um dicionário SingularSDK.Event(new Dictionary<string, object>() { {"Key1", "Value1"}, {"Key2", new Dictionary<string, object>() { {"SubKey1", "SubValue1"}, {"SubKey2", "SubValue2"} } }}, "JSONEvent");

3.2. Rastreamento de receita

A Singular pode coletar dados sobre a receita obtida por meio do aplicativo para ajudar a analisar o desempenho e o ROI de suas campanhas. A Singular disponibilizará os dados em relatórios, exportação de registros e postbacks.

Observações: Qualquer receita relatada em uma moeda diferente será convertida automaticamente para a moeda preferida de sua organização, conforme definido em sua conta da Singular.

Você pode rastrear eventos de receita usando o objeto IAP (In-App Purchases) integrado do Unity. Dessa forma, a Singular obtém todas as informações disponíveis sobre a compra para gerar relatórios mais completos. A Singular também obtém o recibo de compra, que a Singular usa no back-end para validar a compra e descartar fraudes de atribuição.

Método SingularSDK.InAppPurchase
Descrição Envie um produto IAP para a Singular para rastrear o evento de compra.
Assinatura
public static void InAppPurchase(Product product,
Dictionary<string, object> attributes, bool isRestored = false)
public static void InAppPurchase(string eventName,
Product product, Dictionary<string, object> attributes,
bool isRestored = false)
public static void InAppPurchase(IEnumerable<Product> products, Dictionary<string, object> attributes, bool isRestored = false)
public static void InAppPurchase(string eventName,
IEnumerable<Product> products, Dictionary<string, object>
attributes, bool isRestored = false)

Observaçãos:

  • product é o objeto do produto recebido do IAP: UnityEngine.Purchasing.Product
  • attributes:Use este parâmetro para passar informações adicionais ao Singular. Se você não tiver nenhum atributo para passar, basta passar null.
  • isRestored: Indique se a transação foi restaurada. Padrão: false.
Exemplo de uso
// IAP com um único produto e sem atributos extras
SingularSDK.InAppPurchase(myProduct, null);
// IAP com um único produto e atributos var attr = new Dictionary<string, object>() { ["my_first_attribute"] = "value1", ["my_second_attribute"] = "value2"}; SingularSDK.InAppPurchase(myProduct, attr); // IAP com um único produto, sem atributos extras e um nome de evento personalizado. SingularSDK.InAppPurchase("MyCustomProduct", myProduct, null); // IAP com lista de produtos, sem atributos extras SingularSDK.InAppPurchase(myProductList, null); // IAP com lista de produtos, sem atributos extras e nome de evento personalizado. SingularSDK.InAppPurchase("MyCustomProducts", myProductList, null);
Maneira alternativa de rastrear a receita: Métodos Revenue e CustomRevenue

Se você não puder usar o IAP do Unity, o SDK da Singular fornece dois métodos para passar informações sobre uma compra para a Singular "manualmente":

  • Use Revenue para passar informações sobre uma compra para a Singular, detalhando a moeda da transação, o valor da transação e outros detalhes opcionais.
  • O CustomRevenue é muito semelhante, mas também permite que você dê um nome personalizado ao evento.

Observação: se você usar Revenue/CustomRevenue em vez de InAppPurchase, a Singular não poderá verificar o recibo da compra.

Método SingularSDK.Revenue
Descrição Envie um evento de receita para o Singular.
Assinatura
public static void Revenue(string currency, double amount)

public static void Revenue(string currency,
double amount, string productSKU, string productName,
string productCategory, int productQuantity, double productPrice)
Observação: Passe a moeda como um código de moeda ISO 4217 de três letras, como "USD", "EUR", "INR".
Exemplo de uso
// Envie um evento de receita sem detalhes do produto
SingularSDK.Revenue("USD", 9.99);

// Envie um evento de receita com detalhes do produto
SingularSDK.Revenue("USD", 50.50, "abc123", "myProductName", 
"myProductCategory", 2, 25.50)
Método SingularSDK.CustomRevenue
Descrição Envie um evento de receita com um nome personalizado para o Singular.
Assinatura
public static void CustomRevenue(string eventName, 
string currency, double amount) public static void CustomRevenue(string eventName,
string currency, double amount, string productSKU,
string productName, string productCategory, int productQuantity,
double productPrice)
Observação: Pass currency as a three-letter ISO 4217 currency code, such as "USD", "EUR", "INR".
Exemplo de uso
// Envie um evento de receita com um nome personalizado
SingularSDK.CustomRevenue("MyCustomRevenue", "USD", 9.99);

// Envie um evento de receita com um nome personalizado + detalhes do produto
SingularSDK.CustomRevenue("MyCustomRevenue", "USD", 50.50, 
"abc123", "myProductName", "myProductCategory", 2, 25.50)

3.3. Rastreamento híbrido de eventos (avançado)

A Singular recomenda o envio de todos os eventos e receitas por meio do SDK da Singular integrado ao seu aplicativo. No entanto, a Singular pode coletar eventos e receitas de outras fontes.

Qualquer evento NÃO enviado pelo SDK da Singular deve estar em conformidade com os requisitos de documentação de eventos de servidor para servidor da Singular e fornecer o identificador de dispositivo correspondente para atribuir corretamente um evento.

Importante:

Ocorrerão discrepâncias se os identificadores de dispositivo usados nas solicitações de eventos Server-to-Server não tiverem um identificador de dispositivo correspondente no Singular. Esteja ciente das seguintes possibilidades:

  • Se uma solicitação de evento for recebida "antes" de o SDK do Singular ter registrado o identificador do dispositivo, a partir de uma sessão de aplicativo, a solicitação de evento será considerada a "primeira sessão" do dispositivo desconhecido, e o Singular atribuirá o dispositivo como uma atribuição orgânica.
  • Se o Singular SDK tiver registrado um identificador de dispositivo, mas o identificador do Singular SDK for diferente do identificador de dispositivo especificado na solicitação de evento de servidor para servidor, o evento será atribuído incorretamente.

Guias de rastreamento de eventos híbridos

Envio de eventos de um servidor interno

A Singular pode coletar dados sobre a receita de seu servidor para ajudar a analisar o desempenho e o ROI de suas campanhas.

Requisitos:

  • A partir de um evento de registro ou login no aplicativo, capture e passe os identificadores de dispositivo e armazene esses dados com o ID do usuário no seu servidor. Como os identificadores de dispositivo podem mudar para um usuário, certifique-se de atualizar os identificadores quando um usuário gerar uma sessão de aplicativo. Isso garante que o evento no lado do servidor será atribuído ao dispositivo correto.
  • Os eventos do lado do servidor são específicos da plataforma e só devem ser enviados com o identificador de dispositivo correspondente à plataforma do dispositivo (por exemplo, IDFA ou IDFV para dispositivos iOS).
  • Você pode usar o mecanismo de postback do Singular Internal BI para enviar um evento em tempo real para seu endpoint interno, de modo que possa atualizar o conjunto de dados no lado do servidor. Consulte as Perguntas frequentes sobre postback do BI interno.
  • Consulte a seção "Rastreamento de receita" no guia Integração servidor a servidor para obter detalhes.
Envio de eventos de um provedor de receita
Provedores de terceiros, como RevenueCat ou adapty, podem fornecer receita de compra e assinatura para a Singular.

Siga os links abaixo para obter detalhes sobre como habilitar esses parceiros.

Envio de eventos do segmento

Para permitir que o Segment envie eventos para a Singular, em paralelo com o SDK da Singular, você deve adicionar um destino "Cloud-Mode" no Segment. Siga nosso guia AQUI.

4. Opções avançadas

4.1. Criação de links de referência curtos

Observação: essa funcionalidade está disponível na versão 4.0.16+ do SDK.

Use links curtos para transformar Links Singulares longos e cheios de parâmetros em links mais curtos e mais seguros que sejam convenientes para compartilhamento.

Normalmente, você desejará criar links curtos dinamicamente para que os usuários do seu aplicativo possam compartilhá-los com amigos e convidá-los a usar o aplicativo.

Para criar um link curto, você precisa de:

  • Um Singular Link que leve ao download do aplicativo (consulte as Perguntas frequentes sobre Singular Links).
  • Quaisquer parâmetros que você queira adicionar ao link dinamicamente (consulte Parâmetros do link de rastreamento para obter a lista de opções).
  • O nome e o ID do usuário de referência, se você quiser rastrear as novas instalações do aplicativo até o usuário que compartilhou o link.

Use o método createReferrerShortLink para criar um link curto, como no exemplo abaixo.

void callback(string shortLinkURL, string error){
    // Adicione sua lógica de compartilhamento aqui se shortLinkURL não for nulo. 
// Se houve um erro, adicione lógica para tentar novamente/abortar/modificar
// os parâmetros passados para a função, com base na causa do erro. } SingularSDK.createReferrerShortLink( "https://sample.sng.link/B4tbm/v8fp?_dl=https%3A%2F%2Fabc.com", "John Doe", // Nome do referenciador "342", // ID de referência new Dictionary<string, string>() { // um objeto Dicionário contendo quaisquer parâmetros que você deseja adicionar {"channel", "sms"} }, callback );

4.2. Adição de suporte à atribuição de receita de anúncios

Observação: a partir da versão 3.0.0, a Singular adicionou a opção de configurar a atribuição de receita de anúncios por meio do SDK da Singular.

A atribuição de receita de anúncios ainda pode ser configurada da maneira antiga, usando chamadas de API, sem atualizar o Singular SDK em seus aplicativos. No entanto, se você quiser medir a receita de anúncios para campanhas da SKAdNetwork, será necessário configurar a atribuição de receita de anúncios por meio do SDK.

Para adicionar suporte à atribuição de receita de anúncios no SDK da Singular:

  1. Atualize para a versão mais recente do Singular SDK.
  2. Adicione o trecho de código apropriado à sua integração do Singular SDK, dependendo da plataforma de mediação que você usa para dados de receita de anúncios.

Observação: Passe a moeda como um código de moeda ISO 4217 de três letras, por exemplo, "USD", "EUR", "INR".

AdMob
    1. Observação: Esse recurso precisa ser ativado em sua conta da Admob.

      See https://support.google.com/admob/answer/11322405#getstarted

Observação:O SDK do Google AdMob Unity foi alterado!

Para saber mais sobre a migração mais recente para versões atuais e anteriores do SDK do Google AdMob Unity. Consulte a documentação do Google aqui: Migração do SDK do Google AdMob Mobile Ads (Unity)

Admob Unity SDK v8.0.0+ (C#) Admob Unity SDK Legacy (C#)

O código a seguir é para o Admob Unity SDK v8.0.0+

Ouça os eventos de anúncio premiado conforme documentado na documentação do Google AdMob AQUI

private void RegisterEventHandlers(RewardedAd ad)
{
// Aumentado quando se estima que o anúncio tenha rendido dinheiro.
ad.OnAdPaid += (AdValue adValue) =>
{
    // Construir e enviar um evento singular do AdMon
    SingularAdData data = new SingularAdData(
       "Admob",
        adValue.CurrencyCode,
        adValue.Value/1000000f);
    Singular.AdRevenue(data);
};
}
AppLovinMax
  1. Recuperar o objeto recebido do evento do AppLovin MAX, OnInterstitialAdRevenuePaidEvent
C#
MaxSdkBase.AdInfo impressionData;
string adUnitId;
double revenue = MaxSdk.GetAdInfo(adUnitId).Revenue;

SingularAdData data = new SingularAdData(
"AppLovin",
"USD",
revenue); Singular.AdRevenue(data);
IronSource
  1. Recupere o objeto recebido do evento do IronSource, OnImpressionSuccess
  2. Certifique-se de que o sinalizador de postbacks do ARM SDK no IronSource esteja ativado
  3. Consulte https://developers.is.com/ironsource-mobile/general/ad-revenue-measurement-postbacks/#step-1
C#
IronSourceImpressionData impressionData;
SingularAdData data = new SingularAdData(
"IronSource",
"USD",
impressionData.revenue); Singular.AdRevenue(data);
TradPlus
  1. Recupere o objeto recebido do evento TradplusAds: AddGlobalAdImpression
  2. Adicionar Singular ao retorno de chamada do TradPlusAdImpression
C#
TradplusAds.Instance().AddGlobalAdImpression(OnGlobalAdImpression);

void OnGlobalAdImpression(Dictionary<string, object="object"> adInfo) {
   double revenue = 0;
   double.TryParse(
adInfo["ecpm"].ToString(),
NumberStyles.Float| NumberStyles.AllowThousands,
CultureInfo.InvariantCulture, out revenue); if(revenue != 0) revenue = revenue / 1000; SingularAdData data = new SingularAdData(
"TradPlus",
"USD",
revenue); SingularSDK.AdRevenue(data); }
Outro (genérico)
  1. Inicializar o objeto SingularAdData com os dados relevantes
  2. Informar os dados à Singular
C#
SingularAdData data = new SingularAdData(
   SUA_PLATAFORMA_DE_ANÚNCIOS,
   CÓDIGO DA MOEDA,
   9.90);

SingularSDK.AdRevenue(data);

4.3. Rastreamento de desinstalações

Observação: o rastreamento de desinstalação está disponível apenas para clientes Enterprise.

Rastreamento de desinstalação do Android

Para ativar o rastreamento de desinstalações para seu aplicativo Android, primeiro configure o aplicativo na plataforma Singular, conforme detalhado em Configuração do rastreamento de desinstalações. Em seguida, siga as instruções abaixo.

Observação: o Google descontinuou as APIs do GCM em abril de 2018. Use o FCM para rastreamento de desinstalação.

Como ativar o rastreamento de desinstalação usando o Firebase Cloud Messaging (FCM):

1.Faça a integração com o FCM:

Para rastrear desinstalações, você pode usar os serviços da plataforma Firebase Cloud Messaging (FCM). Se ainda não estiver usando o FCM, siga as instruções do Google sobre como configurar um aplicativo cliente do Firebase Cloud Messaging no Android.

Requisitos do FCM(fonte)

Os clientes FCM exigem dispositivos com Android 4.1 ou superior que também tenham o aplicativo Google Play Store instalado ou um emulador com Android 4.1 com APIs do Google. Observe que você não está limitado a implantar seus aplicativos Android por meio da Google Play Store.

Os usuários/dispositivos que não estiverem executando versões compatíveis do Android não estarão disponíveis para o rastreamento de desinstalação da Singular.

2. Atualize o arquivo AndroidManifest.xml:

Atualize seu arquivo AndroidManifest.xml para adicionar o filtro de intenção necessário para seu aplicativo (substitua MyFirebaseMessagingService por sua classe que implementa o Firebase Service):

<service android:name=".java.MyFirebaseMessagingService" android:exported="false">
  <intent-filter>
    <action android:name="com.google.firebase.MESSAGING_EVENT" />
  </intent-filter> 
</service>

3.Registre e envie o token de dispositivo FCM:

Depois de recuperar o token FCM, passe-o como parâmetro para o método "RegisterTokenForUninstall":

SingularSDK.RegisterTokenForUninstall(String fcmDeviceToken);

Observe que o método "RegisterTokenForUninstall" deve ser chamado antes dométodo "SingularSDK.InitializeSingularSDK()".

Rastreamento de desinstalação do iOS

O rastreamento de desinstalação no iOS é baseado na tecnologia de notificação push da Apple. Se o seu aplicativo não for compatível com notificações por push, consulte o guia da Apple. Se o seu aplicativo já for compatível com notificações por push, tudo o que você precisa fazer é passar o token do dispositivo retornado do APNS usando o método RegisterTokenForUninstall, depois que o SDK for inicializado.

Método SingularSDK.RegisterTokenForUninstall
Descrição Passe o token do dispositivo retornado do APNS. Observação que o token APNS geralmente é um dado binário na forma nativa, mas você precisa passá-lo como uma string.
Assinatura
public static void RegisterTokenForUninstall
(string APNSToken)
Exemplo de uso
// passe o token APNS como uma string hexadecimal
  SingularSDK.RegisterTokenForUninstall("ba85ab31a7c7
f5c2f012587f29fb0e596d4b67e7b7b2838fa1a8582c1f7dbdee");

4.4. Adição de propriedades globais

O Singular SDK permite que você defina propriedades adicionais personalizadas para enviar aos servidores Singular com cada sessão e evento enviado pelo aplicativo. Essas propriedades podem representar qualquer informação que você queira sobre o usuário, o modo ou o status do aplicativo ou qualquer outra coisa. Depois de definir essas propriedades, elas ficam disponíveis como dimensões em seus relatórios e você pode usá-las para detalhar seus dados.

Por exemplo, se você tiver um aplicativo de jogos, poderá definir uma propriedade chamada "Nível" e configurá-la inicialmente como "0". Qualquer sessão e evento enviado pelo aplicativo será enviado com "Level": "0". Quando o usuário subir de nível, redefina a propriedade para "1" e assim por diante. Em seguida, você poderá obter seus relatórios, incluindo sessões, contagens de eventos e dados de receita, divididos por nível de usuário.

  • Você pode definir até 5 propriedades globais.
  • Elas persistem entre as execuções do aplicativo (com o valor mais recente que você lhes deu) até que você as desfaça ou o usuário desinstale o aplicativo.
  • Cada nome e valor de propriedade pode ter até 200 caracteres. Se você passar um nome ou valor de propriedade mais longo, ele será truncado em 200 caracteres.
  • As propriedades globais são acessíveis e estão disponíveis em exportações e postbacks no nível do usuário. No futuro, será adicionado o suporte a relatórios agregados. Entre em contato com o gerente de sucesso do cliente da Singular se tiver alguma dúvida ou se estiver interessado em atualizações do suporte a propriedades globais!

Definição de propriedades globais antes da inicialização

Você pode usar o método SetGlobalProperty para definir propriedades globais por meio do SingularSDK antes de inicializar o SDK. Desative o sinalizador 'Initialize On awake' se quiser que suas propriedades globais sejam incluídas na sessão.

Observe que, como as propriedades globais e seus valores persistem entre as execuções do aplicativo, a propriedade que você está definindo pode já estar definida com um valor diferente. Use o parâmetro overrideExisting para informar ao SDK se deve ou não substituir uma propriedade existente pelo novo valor.

Definição de propriedades globais após a inicialização

Use os seguintes métodos para definir, cancelar a definição e recuperar propriedades globais a qualquer momento durante a execução do aplicativo.

SingularSDK.SetGlobalProperty Método
Descrição

Defina uma propriedade global para um determinado valor.

Observaçãos:

  • Se a propriedade ainda não existir e já existirem 5 outras propriedades globais, a propriedade não será adicionada.
  • Se a propriedade já tiver sido definida, o parâmetro overrideExisting determinará se o valor existente será substituído.
  • O Método retorna verdadeiro se a propriedade foi definida com sucesso ou falso caso contrário.
Assinatura public static bool SetGlobalProperty(string key, string value, bool overrideExisting)
Exemplo de uso
bool result = SingularSDK.SetGlobalProperty("key", "value", false);
SingularSDK.GetGlobalProperties Método
Descrição Recupere todas as propriedades globais e seus valores atuais como um Mapa.
Assinatura public static Dictionary<string, string> GetGlobalProperties()
Exemplo de uso
Dictionary<string, string> props = SingularSDK.GetGlobalProperties();
SingularSDK.UnsetGlobalProperty Método
Descrição Remova uma propriedade global.
Assinatura public static void UnsetGlobalProperty(string key)
Exemplo de uso
SingularSDK.UnsetGlobalProperty(“test_key”);
SingularSDK.ClearGlobalProperties Método
Descrição Remova todas as propriedades globais.
Assinatura public static void ClearGlobalProperties()
Exemplo de uso
SingularSDK.clearGlobalProperties();

4.5. Coletando o referenciador de instalação em dispositivos Android mais antigos

No Android, o referenciador de instalação é a ferramenta mais precisa da Singular para determinar a atribuição, além de ajudar a Singular a detectar e analisar tentativas de fraude. Trata-se de um identificador fornecido pela Google Play Store que aponta para o anúncio no qual o usuário clicou antes de instalar o aplicativo.

Em dispositivos que possuem a versão mais recente da Google Play Store, o SDK da Singular coleta o valor do referenciador de instalação automaticamente (uma vez que a Singular está integrada à API de referenciador da Google Play mais recente).

Para coletar o referenciador de instalação em dispositivos mais antigos, siga as instruções no guia do SDK do Android.

5. Conformidade com as leis de privacidade de dados

5.1. Limitar o compartilhamento de dados

A Singular fornece a funcionalidade de proteção da privacidade para ajudá-lo a cooperar com quaisquer parceiros que possam estar em conformidade com as leis de privacidade do consumidor, como GDPR e CCPA(California Consumer Privacy Act). Esses parceiros querem ser notificados se o usuário final consentiu em compartilhar suas informações privadas.

Limite o compartilhamento de dados

Se você tiver implementado uma forma de solicitar o consentimento dos usuários para compartilhar suas informações, use o método limitDataSharing para notificar a Singular sobre a escolha do usuário:

  • Use limitDataSharing:NO para indicar que o usuário consentiu (optou por participar) em compartilhar suas informações.
  • Use limitDataSharing:YES se o usuário não consentiu.

A Singular usa LimitDataSharing em"Postbacks de privacidade do usuário", bem como repassa essas informações a parceiros que as exigem para cumprir os regulamentos relevantes. Consulte"Privacidade do usuário e Limite de compartilhamento de dados" para obter mais informações.

Observação: o uso do método é opcional, mas pode haver informações de atribuição que o parceiro compartilhará com a Singular somente se for especificamente notificado de que o usuário optou por participar.

SingularSDK.LimitDataSharing Método
Assinatura SingularSDK.LimitDataSharing(bool shouldLimitDataSharing)
Descrição Notifique a Singular sobre o consentimento do usuário (opt-in) para compartilhar dados privados.
Exemplo de uso
// O usuário optou por compartilhar dados
SingularSDK.LimitDataSharing(false);

5.2. Métodos adicionais para conformidade com o GDPR

O SDK da Singular fornece vários métodos para ajudá-lo a cumprir as políticas do GDPR e informar a Singular sobre o consentimento ou não consentimento do usuário para rastreamento.

SingularSDK.TrackingOptIn Método
Descrição Notifique a Singular sobre o consentimento do usuário (opt-in) para rastreamento.
Exemplo de uso
SingularSDK.TrackingOptIn();
SingularSDK.StopAllTracking Método
Descrição Interrompa todas as atividades de rastreamento deste usuário neste app.
Observação:Chamar este Método desativa efetivamente o SDK, mesmo após a reinicialização do aplicativo (o estado é persistente)! A única maneira de reativar o rastreamento é chamando resumeAllTracking().
Exemplo de uso
SingularSDK.StopAllTracking();
SingularSDK.ResumeAllTracking Método
Descrição Retomar o rastreamento deste usuário neste app.
Exemplo de uso
SingularSDK.ResumeAllTracking();
SingularSDK.IsAllTrackingStopped Método
Descrição Verifique o status de rastreamento deste usuário neste aplicativo. Retornará verdadeiro se o rastreamento tiver sido interrompido usando StopAllTracking() e não retomado.
Exemplo de uso
SingularSDK.IsAllTrackingStopped();