Pular para o conteúdo principal

Introdução

O Nemu Flutter SDK (nemu_tracking_flutter) permite integrar o sistema de atribuição e Smart Links da Nemu diretamente no seu aplicativo Flutter. Com o SDK você pode:
  • Capturar a origem da instalação — saber de qual campanha, fonte ou mídia o usuário veio (UTMs)
  • Processar deep links diretos — quando o usuário clica em um Smart Link e o app já está instalado
  • Processar deep links diferidos — quando o usuário clica em um Smart Link, instala o app pela loja e abre pela primeira vez
  • Identificar usuários — associar um ID do seu sistema ao dispositivo para cruzar dados de atribuição
  • Consultar histórico de sessões — recuperar os UTMs da última interação do usuário
O SDK funciona de forma automática: ao ser inicializado, ele intercepta deep links, detecta se é a primeira abertura do app e realiza a atribuição com o backend da Nemu, sem necessidade de configuração manual de cada evento.

Pré-requisitos

Pacote privado: o nemu_tracking_flutter é um pacote de acesso restrito. Para instalá-lo, você precisa de acesso ao repositório Git fornecido pela equipe de suporte da Nemu. Consulte a seção de instalação abaixo.

Instalação

1. Instalação do pacote

Adicione o SDK ao seu arquivo pubspec.yaml:
Em seguida, execute:
Todas as dependências necessárias (shared_preferences, flutter_secure_storage, app_links, etc.) são instaladas automaticamente como dependências transitivas do SDK. Não é necessário adicioná-las manualmente ao seu projeto.

Configuração nativa

iOS

Para que o iOS encaminhe os Smart Links diretamente para o app (sem abrir o navegador), você precisa configurar Associated Domains. No Xcode:
  1. Abra o projeto .xcworkspace (em ios/Runner.xcworkspace)
  2. Selecione o target Runner
  3. Vá em Signing & Capabilities
  4. Clique em + Capability e adicione Associated Domains
  5. Adicione o domínio no formato:
O domínio exato será fornecido pela equipe da Nemu junto com as credenciais.

2. Configure o URI Scheme (obrigatório)

No arquivo ios/Runner/Info.plist, adicione o URI scheme do seu app:
Substitua seuapp pelo scheme definido no painel da Nemu para o seu Smart Link.
O URI scheme configurado aqui deve corresponder ao valor passado no parâmetro uriScheme na inicialização do SDK.

Android

Para que os Smart Links abram o app diretamente, adicione intent filters na sua Activity principal. No arquivo android/app/src/main/AndroidManifest.xml, dentro da tag <activity> principal (a que contém android:name=".MainActivity"): App Links (Universal Links do Android):
URI Scheme:
Substitua seu-dominio.nemu.com.br e seuapp pelos valores correspondentes ao seu projeto.

2. Permissão de Internet (geralmente já presente)

Verifique se o AndroidManifest.xml possui a permissão de internet:
Na maioria dos projetos Flutter essa permissão já está incluída por padrão.

Inicialização

A inicialização do SDK deve ser feita uma única vez, o mais cedo possível no ciclo de vida do app — idealmente no initState do seu widget raiz ou na função main.

Parâmetros de configuração

Exemplo completo de inicialização

Uso com variáveis de ambiente

Para não expor credenciais diretamente no código, utilize o pacote flutter_dotenv ou defina as variáveis via --dart-define:

Usando --dart-define (recomendado)

Execute o app com:

Usando flutter_dotenv

Crie um arquivo .env na raiz do projeto:
Adicione o .env ao seu .gitignore para não versionar as credenciais no repositório.

Identificação de usuários

Após o login do usuário no seu app, associe o ID dele ao dispositivo. Isso permite que a Nemu cruze dados de atribuição com o seu sistema de usuários.

Registrar usuário

O SDK salva o ID localmente e envia a associação ao backend automaticamente.

Limpar usuário no logout

clearUserId() remove apenas a associação local. O histórico de atribuição no backend é preservado.

O SDK processa dois tipos de deep links automaticamente: Ocorrem quando o app já está instalado e o usuário clica em um Smart Link. O sistema operacional abre o app diretamente (via Universal Link / App Link ou URI scheme). O fluxo é transparente:
  1. O usuário clica no Smart Link
  2. O app abre com a URL
  3. O SDK processa a URL e registra a sessão
  4. Os listeners registrados via onDeepLink são notificados com os dados
Ocorrem quando o app não está instalado. O usuário clica no Smart Link, é redirecionado para a loja, instala o app e abre pela primeira vez. O SDK detecta automaticamente esse cenário na primeira abertura e entrega os dados de atribuição e deep link via onDeepLink com isDeferred: true. Registre um callback para receber os dados do deep link assim que estiverem disponíveis:
Replay automático: se um deep link já foi processado antes do listener ser registrado, o callback é disparado imediatamente com os dados mais recentes. Isso evita que o app perca o deep link inicial.

Consulta imperativa (getDeepLinkData)

Se preferir consultar os dados de forma imperativa em vez de usar o listener:

Estrutura do DeepLinkData


Histórico de sessão

Histórico da última sessão (last touch)

Consulte os UTMs da interação mais recente do usuário. Responde à pergunta: “quais foram os UTMs da última visita?”

Exemplo: anexando UTMs a uma compra


Uso avançado

Modo debug

Ative o modo debug para ver logs detalhados de todas as operações do SDK no console:
Os logs aparecerão prefixados com [NemuSDK] e incluem informações sobre:
  • Processamento de deep links
  • Fluxo de inicialização
  • Erros e falhas de rede
Desative o modo debug em produção. Os logs podem conter informações sensíveis.

Tipos exportados

O SDK exporta os seguintes tipos Dart para uso na sua aplicação:

NemuInitParams

DeepLinkData

UtmData

SessionHistory

SessionInfo

DeepLinkCallback


Solução de problemas

Erro ao inicializar: “NemuTracking must be initialized before use”

Causa: um método do SDK foi chamado antes da inicialização. Solução: certifique-se de que NemuTracking.instance.init() é chamado no initState do widget raiz antes de qualquer outro método do SDK.
Verificações:
  • O Associated Domain está configurado corretamente no Xcode? (formato: applinks:seu-dominio)
  • O arquivo apple-app-site-association está publicado e acessível no domínio? (configurado pela equipe da Nemu)
  • O URI scheme está declarado no Info.plist?
  • O WidgetsFlutterBinding.ensureInitialized() está sendo chamado antes do runApp?

Verificações:
  • Os intent filters estão corretos no AndroidManifest.xml?
  • O domínio está com verificação automática ativa (android:autoVerify="true")?
  • O arquivo assetlinks.json está publicado no domínio? (configurado pela equipe da Nemu)
  • A MainActivity está configurada com launchMode="singleTop" ou singleTask?

Nenhum dado de atribuição retornado

Verificações:
  • O apiKey e o trackingId estão corretos?
  • O Smart Link está configurado e ativo no painel da Nemu?
  • Teste com isDebugMode: true e verifique os logs [NemuSDK] no console

flutter_secure_storage falha no Android

Erro:
Solução:
  • Verifique se o minSdkVersion no android/app/build.gradle é pelo menos 21
  • Em dispositivos com Android < 6.0, pode ser necessário configurar o flutter_secure_storage com opções específicas. Consulte a documentação do pacote