App Tracking Transparency (ATT) é um mecanismo do iOS que exige o consentimento explícito do usuário para acessar o identificador de publicidade IDFA antes do rastreamento em aplicativos e sites. Introduzido no iOS 14.5, o ATT obrigou todos os desenvolvedores a exibir um diálogo do sistema solicitando permissão de rastreamento. De acordo com a Documentação para Desenvolvedores Apple, cada aplicativo que usa IDFA para publicidade direcionada ou atribuição deve integrar o framework ATT e obter permissão de acesso.
Principais pontos
App Tracking Transparency é um framework da Apple para proteger a privacidade dos usuários, apresentado no iOS 14.5. Ele exige que os aplicativos obtenham permissão explícita para acessar o identificador de publicidade do dispositivo (IDFA) antes de usá-lo para rastreamento.
Antes do ATT, os desenvolvedores podiam ler o IDFA sem solicitar permissão, permitindo que as redes de anúncios criassem perfis de usuários e rastreassem sua atividade entre aplicativos e sites. A Apple considerou isso uma violação de privacidade e introduziu um diálogo de consentimento obrigatório.
O framework está disponível desde o iOS 14.0, mas tornou-se obrigatório para todos os aplicativos que usam IDFA com o lançamento do iOS 14.5 em abril de 2021. De acordo com a Flurry Analytics, após a implementação do ATT, menos de 25% dos usuários nos EUA consentiram com o rastreamento, o que mudou fundamentalmente o mercado de publicidade móvel.
O ATT verifica a permissão por meio de um diálogo especial do sistema que o aplicativo não pode modificar ou contornar. O usuário vê um popup padrão com o texto fornecido pelo desenvolvedor e escolhe entre “Permitir” ou “Solicitar ao aplicativo que não rastreie”.
A Apple posiciona o ATT como parte de sua estratégia geral de privacidade, que também inclui Rótulos de Privacidade Nutricional na App Store e o Manifesto de Privacidade. Os três mecanismos trabalham juntos: os rótulos mostram quais dados o aplicativo coleta, o Manifesto declara as razões para o uso de APIs e o ATT dá ao usuário controle sobre o rastreamento.
Recusar o rastreamento não bloqueia o funcionamento do aplicativo em si — os usuários podem continuar usando todos os recursos, mas as redes de anúncios não receberão o IDFA para personalização e atribuição. As alternativas da Apple ao IDFA incluem SKAdNetwork e Atribuição Probabilística.
De acordo com a Branch Metrics, após a introdução do ATT, a proporção de aplicativos que recebem IDFA caiu de 70% para 20% globalmente. Isso levou a uma reformulação das abordagens de atribuição de instalações e monetização por anúncios.
No iOS 15, a Apple não endureceu os requisitos do ATT, mas adicionou o Relatório de Privacidade de Aplicativos — um relatório que mostra ao usuário com que frequência os aplicativos acessam sensores e dados. O iOS 16 expandiu o controle: o usuário pode alterar as configurações de rastreamento a qualquer momento através de Ajustes → Privacidade → Rastreamento.
Importante: se o usuário selecionar “Solicitar ao aplicativo que não rastreie” no diálogo do ATT, o aplicativo não recebe o valor do IDFA — em vez disso, retorna uma string de zeros: 00000000-0000-0000-0000-000000000000. Tentar ler o IDFA por outros meios ou métodos alternativos leva à rejeição do aplicativo na App Store.
A partir do iOS 17, a Apple reforçou as verificações: se um aplicativo solicitar IDFA sem exibir o diálogo do sistema ATT, ele recebe uma recusa no nível do sistema operacional, não apenas um identificador vazio. Isso elimina a possibilidade de coleta em segundo plano do IDFA sem o conhecimento do usuário.
O processo de solicitação do ATT consiste em três etapas: verificação do status, exibição do diálogo do sistema e processamento da resposta. O desenvolvedor não pode pular nenhuma etapa — o sistema operacional controla cada estágio.
Antes de chamar o diálogo, o aplicativo deve verificar o status atual através do ATTrackingManager. Os possíveis status são: notDetermined (ainda não solicitado), restricted (proibido por políticas do dispositivo), denied (usuário recusou), authorized (permitido).
Se o status já estiver determinado (authorized ou denied), o diálogo não pode ser chamado novamente — o usuário fez uma escolha permanente. A única maneira de alterar a decisão é através das configurações do sistema iOS.
Para verificar o status, usa-se a propriedade ATTrackingManager.trackingAuthorizationStatus. A chamada deve ocorrer na thread principal, pois o diálogo do sistema é um componente de interface do usuário.
import AppTrackingTransparency
import AdSupport
func checkTrackingStatus() {
let status = ATTrackingManager.trackingAuthorizationStatus
switch status {
case .notDetermined:
requestTrackingPermission()
case .authorized:
readIDFA()
case .denied, .restricted:
useAlternativeTracking()
@unknown default:
break
}
}
Para exibir o diálogo, chama-se o método requestTrackingAuthorization com uma closure que recebe o resultado da escolha do usuário. Importante: o diálogo é exibido apenas uma vez. Se o desenvolvedor tentar chamá-lo novamente, o sistema ignora a solicitação.
O texto do diálogo consiste em duas partes: um cabeçalho do sistema (que não pode ser alterado) e uma mensagem personalizada que o desenvolvedor especifica no Info.plist através da chave NSUserTrackingUsageDescription.
O diálogo deve aparecer em um contexto natural — não imediatamente ao iniciar o aplicativo, mas na primeira tentativa de usar funcionalidades relacionadas ao rastreamento. A Apple recomenda exibir o diálogo depois que o usuário entender o valor da funcionalidade.
func requestTrackingPermission() {
ATTrackingManager.requestTrackingAuthorization { status in
DispatchQueue.main.async {
switch status {
case .authorized:
let idfa = ASIdentifierManager.shared().advertisingIdentifier
print("IDFA: \(idfa)")
case .denied:
print("Usuário recusou rastreamento")
default:
break
}
}
}
}
IDFA (Identifier for Advertisers) é um identificador único de publicidade para dispositivos iOS, usado para publicidade direcionada e atribuição de instalações. Antes do ATT, os desenvolvedores o obtinham através do ASIdentifierManager sem restrições. Após o ATT, o acesso ao IDFA é bloqueado até que o usuário dê consentimento explícito.
IDFA é uma string UUID única para cada dispositivo iOS. As redes de anúncios usam IDFA para: rastrear instalações de aplicativos (atribuição), exibir anúncios relevantes com base nos interesses do usuário, medir a eficácia de campanhas publicitárias e retargeting — trazer de volta usuários que não concluíram uma ação desejada.
Após o usuário recusar o rastreamento, o ASIdentifierManager retorna o valor 00000000-0000-0000-0000-000000000000. O aplicativo ainda pode ler o IDFA para fins técnicos (como antifraude), mas não pode transmiti-lo para redes de anúncios.
De acordo com a Singular (2024), a taxa global de consentimento do ATT é de 25–35%, com a Europa (GDPR) apresentando taxas mais altas (40–50%) do que os EUA (15–25%). Isso levou as plataformas de anúncios a desenvolver métodos alternativos de atribuição.
SKAdNetwork é um framework da Apple para atribuição de instalações sem expor o IDFA. Funciona no nível do sistema operacional: a rede de anúncios envia um postback assinado, que a Apple valida e encaminha ao desenvolvedor. A atribuição ocorre sem identificar um usuário específico, apenas no nível da campanha.
A Atribuição Probabilística usa múltiplos sinais do dispositivo — modelo, versão do iOS, fuso horário, brilho da tela — para corresponder probabilisticamente instalações a impressões de anúncios. No entanto, a Apple proíbe este método em suas diretrizes, e seu uso pode levar à rejeição do aplicativo.
Google, Adjust e AppsFlyer desenvolveram suas próprias soluções híbridas que combinam SKAdNetwork com dados agregados proprietários. Por exemplo, o Google Ads Conversion Tracking usa postbacks do SKAdNetwork e seus próprios modelos de machine learning para atribuição sem IDFA.
Para integrar o ATT, é necessário adicionar a chave NSUserTrackingUsageDescription ao Info.plist e importar o framework AppTrackingTransparency. Abaixo estão as etapas para Swift e Objective-C.
O primeiro passo é adicionar a chave NSUserTrackingUsageDescription ao Info.plist com um texto explicando por que o aplicativo precisa de rastreamento. Este texto será exibido no diálogo do sistema. Exemplo: “Seu IDFA é usado para exibir anúncios personalizados e acompanhar a eficácia das campanhas.”
Sem esta chave, chamar requestTrackingAuthorization causará uma quebra do aplicativo — a Apple verifica explicitamente a presença de NSUserTrackingUsageDescription antes de exibir o diálogo. O texto deve ser conciso, específico e refletir o uso real dos dados.
Importante: a chave é adicionada manualmente através da aba Info do Xcode ou editando o código-fonte XML do Info.plist. Após adicioná-la, recompile o projeto e verifique se a chave aparece no binário final.
<!-- Info.plist -->
<key>NSUserTrackingUsageDescription</key>
<string>This identifier is used to deliver
personalized ads and measure campaign performance.</string>
Em um projeto real, é melhor chamar a solicitação ATT antes do primeiro lançamento de um módulo de anúncios ou tracker. Recomenda-se explicar primeiro o valor do consentimento em uma tela separada (pre-permission prompt) — isso aumenta as taxas de consentimento em 20–30%.
Um pre-permission prompt é uma interface de usuário personalizada que mostra o benefício de ativar o rastreamento (“Ajude-nos a mostrar anúncios relevantes”). Somente após tocar em “Continuar” o diálogo do sistema ATT aparece. A Adjust (2024) registrou um aumento de 40% no consentimento ao usar uma tela de pre-permission.
final class TrackingManager {
static let shared = TrackingManager()
func requestTrackingIfNeeded() {
guard ATTrackingManager.trackingAuthorizationStatus
== .notDetermined
else { return }
ATTrackingManager.requestTrackingAuthorization { _ in
NotificationCenter.default.post(
Notification(Name("trackingStatusChanged"))
)
}
}
}
Os desenvolvedores frequentemente cometem erros típicos ao integrar o ATT, que levam a menor conversão de consentimentos ou rejeição do aplicativo pelos revisores da App Store. Vamos examinar os cinco problemas mais comuns.
O erro mais comum é exibir o diálogo do sistema ATT na primeira tela logo após carregar o aplicativo. O usuário ainda não entende o valor do aplicativo e provavelmente pressiona “Recusar”. A IronSource (2023) mostrou uma queda de 32% no consentimento ao solicitar na primeira tela em comparação com após a terceira sessão.
Recomendação: solicite o rastreamento depois que o usuário realizar uma ação valiosa (visualizar conteúdo, iniciar a integração) ou após 3–5 sessões de uso do aplicativo. Isso aumenta a confiança e a percepção de valor.
Exibir o diálogo do sistema ATT sem explicação prévia é um erro que reduz a conversão para 15–20%. O usuário vê uma solicitação inesperada e a recusa instintivamente. Uma tela de pre-permission explicando o benefício aumenta o consentimento para 35–45%.
O texto do pre-permission deve ser específico: “Permita-nos mostrar anúncios relevantes — isso nos ajuda a permanecer gratuitos.” Evite frases vagas — elas reduzem a confiança. A GameAnalytics mostrou em 2023 que uma tela de pre-permission explicando o benefício gera 28% mais consentimentos do que uma tela vazia.
Se o usuário já recusou o rastreamento ou o status é restricted (controle parental, políticas corporativas), o aplicativo não deve chamar o diálogo ATT novamente. Uma chamada repetida não funciona e é percebida como violação de privacidade. Em vez disso, mude para SKAdNetwork e publicidade contextual.
No status restricted, o aplicativo não pode determinar se a opção “Permitir solicitações de rastreamento” está ativada nas configurações. Neste caso, use sempre SKAdNetwork como único método de atribuição e não exiba uma tela de pre-permission.
Ler IDFA através de ASIdentifierManager.shared().advertisingIdentifier sem permissão prévia do ATT retorna uma string de zeros. Alguns desenvolvedores tentam usar métodos antigos de acesso ao IDFA através de APIs privadas — isso garante a rejeição durante a revisão do aplicativo.
A Apple usa análise estática de código e machine learning para detectar soluções alternativas. Mesmo que o aplicativo passe na revisão, atualizações subsequentes ou verificações automáticas podem revelar a violação e levar à proibição da conta do desenvolvedor.
Um texto muito longo, vago ou enganoso na chave NSUserTrackingUsageDescription é motivo para rejeição pelos revisores. A Apple verifica se a descrição corresponde ao uso real dos dados. Se o aplicativo não tem anúncios mas afirma “para fins publicitários”, o revisor rejeitará a compilação.
Formato recomendado: uma descrição específica do propósito do uso do IDFA, com 2–3 frases. Exemplo para um aplicativo sem anúncios: “O identificador é usado para análise e prevenção de fraudes. Os dados não são compartilhados com terceiros nem usados para criação de perfis.”
Perguntas frequentes
Se um aplicativo usa IDFA ou rastreamento sem ATT, a Apple o rejeitará durante a revisão. Mesmo que não haja rastreamento, é recomendado adicionar ATT para transparência — caso contrário, o risco de rejeição aumenta a cada atualização.
Sim, o aplicativo funciona completamente, mas as redes de anúncios não receberão o IDFA para personalização e atribuição. Todos os recursos do aplicativo, exceto anúncios personalizados, permanecem disponíveis.
Sim, o usuário pode alterar sua decisão a qualquer momento através de Ajustes → Privacidade → Rastreamento. O aplicativo não pode programaticamente redefinir o status — apenas através das configurações do sistema.
Use uma tela de pre-permission explicando o benefício e solicite o rastreamento não no primeiro lançamento, mas após o usuário realizar uma ação valiosa. A Meta (2024) mostrou um aumento de 35% nos consentimentos com solicitações atrasadas.
Aplicativos na categoria “Crianças” não podem usar IDFA e ATT para rastreamento de acordo com as regras da Apple. Também é proibido compartilhar dados com terceiros para análise ou publicidade.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também