Privacidade e declarações
Propósito
Respostas de privacidade verdadeiras e consistentes em ambas as lojas, apoiadas por evidências do código. A maioria das rejeições de privacidade são inconsistências: a política diz uma coisa, o aplicativo faz outra, o formulário diz uma terceira.
Pré-requisitos
- Acesso ao código-fonte (aplicativo e backend) e aos arquivos de bloqueio (
pubspec.lock,Podfile.lock, dependências do Gradle,package.json). - A política de privacidade e os termos atuais.
- Conhecimento de todos os endpoints do backend e serviços de terceiros que recebem dados do usuário.
1. Construa o inventário de dados (do código, não da memória)
Execute scripts/scan-sdks.mjs na raiz do repositório. Ele lista SDKs conhecidos a partir dos arquivos de bloqueio com as categorias de dados que normalmente tocam, e procura por uso de APIs de motivo obrigatório, strings de permissão, ID de anúncio e APIs de rastreamento. Em seguida, complete o inventário lendo a camada de rede e o backend:
| Dado | Fonte (tela / SDK) | Enviado para fora do dispositivo? Para quem | Vinculado ao usuário? | Finalidade | Retenção | Opcional? |
|---|
Regras:
- "Processado apenas no dispositivo" significa nunca enviado, inclusive para seu próprio servidor. Se for sincronizado com seu backend, é coletado.
- Seus processadores (hospedagem, provedor de IA agindo sob suas instruções, SDK de pagamento) ainda são "coletados"; se contam como "compartilhados" difere por loja (abaixo).
- Relatórios de falhas anônimos e contagens de uso ainda são coletados (Diagnósticos / Dados de Uso), geralmente "não vinculados".
Salve o inventário como docs/privacy-inventory.md. Cada resposta abaixo cita uma linha.
2. Privacidade do Aplicativo Apple (App Store Connect › App Privacy)
- Mapeie cada linha do inventário para as categorias da Apple (Informações de Contato, Saúde e Fitness, Conteúdo do Usuário, Identificadores, Compras, Dados de Uso, Diagnósticos…), finalidades, vinculado vs não vinculado, e rastreamento.
- Rastreamento = vincular seus dados com dados de terceiros para anúncios direcionados ou medição de anúncios, ou compartilhar com corretores de dados. Sem SDK de anúncios e sem corretor de dados geralmente significa "Sem rastreamento" e nenhum prompt ATT.
- A divulgação opcional se aplica apenas quando todas as condições da Apple são atendidas (pouco frequente, opcional, iniciado pelo usuário a cada vez, sem rastreamento/anúncios). Raramente se aplica a recursos do aplicativo.
- Docs: App privacy details.
3. Segurança de Dados do Google Play (Política › Conteúdo do app › Segurança de dados)
- Mesmo inventário, taxonomia do Play (Informações pessoais, Saúde e condicionamento físico, Fotos e vídeos, Mensagens, Atividade do app, Informações do app e desempenho, IDs de dispositivo ou outros, Informações financeiras…).
- Compartilhamento exclui transferências para provedores de serviços que processam em seu nome; um SDK que constrói perfis de anúncios entre clientes é compartilhamento.
- Efêmero: processado apenas na memória, não armazenado, apenas para a solicitação em tempo real (por exemplo, uma foto analisada e descartada).
- Use Exportar para CSV / Importar de CSV: mantenha o CSV no repositório (
store/data-safety.csv) para que as alterações sejam revisadas como código. A importação sobrescreve todas as respostas. - Docs: Data safety.
4. Outras declarações do Play
- Declaração de aplicativos de saúde: todo aplicativo deve concluí-la, mesmo sem recursos de saúde. Docs.
- Health Connect: uma justificativa por permissão; solicite apenas permissões que um recurso visível usa; uma atividade de justificativa (
ACTION_SHOW_PERMISSIONS_RATIONALE) vinculando à política. O Play pode solicitar uma gravação de tela do fluxo. - ID de publicidade: declare se você o utiliza. Se não houver SDK de anúncios/atribuição, declare "Não" e certifique-se de que nenhuma dependência adiciona
com.google.android.gms.permission.AD_ID(verifique o manifesto mesclado; remova comtools:node="remove"se adicionado). - Público-alvo, classificação de conteúdo (IARC), anúncios, acesso ao app, notícias, recursos financeiros, governo: responda a partir do inventário. Se alguma parte estiver atrás de login, forneça credenciais do revisor em Acesso ao app.
- Exclusão de conta: veja a seção 8.
5. Manifesto de privacidade (iOS)
- Adicione
PrivacyInfo.xcprivacyao destino do aplicativo (modelo: templates/PrivacyInfo.xcprivacy). - Declare
NSPrivacyTracking,NSPrivacyTrackingDomains,NSPrivacyCollectedDataTypes(consistente com App Privacy) eNSPrivacyAccessedAPITypespara cada categoria de API de motivo obrigatório que o código do próprio aplicativo usa: timestamp de arquivo, tempo de inicialização do sistema, espaço em disco, teclados ativos, UserDefaults. Escolha os códigos de motivo aprovados da lista da Apple. Aplicativos Flutter usam UserDefaults por meio de plugins comoshared_preferences— verifique se cada plugin envia seu próprio manifesto; adicione o que seu código e plugins sem manifestos usam. - Após a compilação, inspecione o e-mail do App Store Connect / avisos de compilação para razões de manifesto ausentes.
- Docs: Privacy manifest files, Required reason API.
6. Conformidade de exportação (iOS)
ITSAppUsesNonExemptEncryptionno Info.plist:falseé apropriado quando o aplicativo não usa criptografia ou usa apenas criptografia isenta (por exemplo, HTTPS através do sistema operacional, algoritmos padrão usados apenas para proteger os dados do próprio usuário em um aplicativo cuja função principal não é segurança). Definir isso ignora as perguntas por compilação.- Se você implementar ou incluir criptografia proprietária, ou a criptografia for um recurso principal, responda às perguntas e verifique se a documentação ou um relatório anual de autoclasificação se aplica.
- Esta é uma classificação legal; quando em dúvida, consulte um consultor de conformidade comercial. Docs: Complying with encryption export regulations.
7. Classificação etária
- Responda ao questionário atual da Apple e ao questionário IARC do Play com veracidade, incluindo perguntas sobre tópicos de saúde/bem-estar, chat de IA ou conteúdo gerado, conteúdo gerado pelo usuário e acesso irrestrito à web.
- Mantenha a classificação consistente com a idade mínima dos seus Termos e qualquer restrição de idade no aplicativo. Se o resultado do questionário for inferior à idade mínima dos seus Termos, use a opção da loja para definir uma classificação mais alta em vez de deixar uma incompatibilidade.
8. Exclusão de conta
- No aplicativo: se os usuários podem criar uma conta, eles podem iniciar a exclusão dentro do aplicativo (configurações da conta). A desativação sozinha não é suficiente. Contas de convidado/criadas automaticamente também. A reautenticação ou confirmação é permitida, mas não deve ser desnecessariamente difícil. Apple: Offering account deletion.
- URL da Web (Play): uma página, acessível sem o aplicativo ou login, nomeando o aplicativo como na listagem, explicando como solicitar a exclusão, o que é excluído e o que é retido (e por que), e quaisquer etapas anteriores (cancelar a assinatura). Docs: Play account deletion.
- Assinaturas: excluir a conta não cancela uma assinatura da loja. Avise na folha de exclusão e forneça um link para o gerenciamento de assinaturas da loja.
- Entrar com Apple: revogue os tokens do usuário por meio da API REST do Entrar com Apple na exclusão.
- Terceiros: exclua o usuário também nos processadores (por exemplo, o cliente RevenueCat, identificadores de análise/falhas, listas de e-mail).
- Implementação de reautenticação: se você adicionar um requisito de reautenticação ao endpoint de exclusão, envie o aplicativo que lida com a nova resposta ao mesmo tempo que a alteração do backend, ou mantenha o comportamento antigo para versões antigas do aplicativo.
- Use uma redação para o caminho em todos os lugares (aplicativo, política, formulários da loja, página da web), por exemplo, "Perfil › Excluir conta".
9. Recursos de IA
- Apple 5.1.2(i): divulgue onde os dados pessoais são compartilhados com terceiros, incluindo IA de terceiros, e obtenha permissão explícita primeiro.
- Antes do primeiro uso de um recurso de IA: uma breve folha de consentimento nomeando o provedor e a função ("processado por para gerar a resposta"), o que é enviado, que não é usado para treinar modelos (apenas se os termos do provedor assim o disserem para seu plano) e retenção (do provedor e sua). Um interruptor nas configurações para retirar o consentimento.
- Redação da política: o provedor de IA atua como um processador/provedor de serviços sob suas instruções; liste-o com localização e retenção.
- Formulários da loja: entradas de IA (mensagens, fotos, texto) são dados coletados (Conteúdo do Usuário); geralmente não "compartilhados" no Play quando o provedor é um processador.
- Considere: uma linha de "não é aconselhamento profissional" em respostas de IA sobre saúde ou finanças, e uma resposta segura definida para tópicos de crise.
10. Dados de saúde
- Nunca envie dados do HealthKit / Health Connect para provedores de IA ou outros terceiros. A Apple (5.1.3) restringe o uso e a divulgação de dados de saúde; a política do Health Connect também restringe transferências. O design compatível mais simples: dados lidos do Apple Health / Health Connect permanecem no dispositivo (ou no armazenamento da própria conta do usuário, divulgado), e recursos que chamam uma IA usam apenas dados que o usuário digitou em seu aplicativo.
- Não use dados de saúde para publicidade ou marketing; não os armazene no iCloud.
- As strings de uso do Info.plist (
NSHealthShareUsageDescription,NSHealthUpdateUsageDescription) devem declarar o uso real. Se a string disser "nunca compartilhado com terceiros", o código deve garantir isso. - Imponha no código: o construtor de solicitação para chamadas de IA recebe uma lista de permissão explícita de campos; adicione um teste que falhe se um campo originado da saúde aparecer em um payload de IA.
Pontos de decisão que precisam de aprovação humana
Respostas finais em todos os formulários (o titular da conta é legalmente responsável), a classificação de conformidade de exportação, a classificação etária, o provedor de IA e seus termos de dados, qualquer alteração no que os dados de saúde saem do dispositivo.
Verificação
- Cada resposta do formulário cita uma linha do inventário; o inventário cita o código.
- Verificação de diff: política de privacidade ↔ App Privacy ↔ CSV de segurança de dados ↔ texto de consentimento no aplicativo ↔ strings do Info.plist. Sem contradições.
- Teste: exclua uma conta de teste; confirme que as linhas do backend, os registros do processador e o usuário de autenticação desapareceram; página de exclusão da web acessível sem login.
- A compilação não mostra avisos de manifesto de privacidade.
Armadilhas comuns
- "Os dados nunca saem do dispositivo" na política enquanto um recurso de sincronização ou IA os envia.
- Esquecer sua própria notificação anônima de falha/uso nos formulários.
- Uma dependência adicionando silenciosamente a permissão AD_ID.
- Dados de saúde fluindo para um prompt de IA por meio de um construtor de "contexto" que inclui "tudo o que sabemos".
- Caminho de exclusão nomeado de forma diferente no aplicativo, política e formulários da loja.
- Classificação etária 4+ enquanto os Termos dizem 16+.