Guideline 1.2 User-Generated Content: o que a Apple exige
Por Mehdi Azizi
Publicado em , 10 min
Guideline 1.2: se seus usuários publicam conteúdo, você precisa de filtro, denúncia, bloqueio, contato e termos aceitos. Checklist com Expo e Supabase.
A guideline 1.2 vale a partir do momento em que usuários publicam algo que outros veem: uma mensagem, uma foto, uma avaliação e, na minha opinião, até um simples apelido em um ranking. Nesse caso, o texto da Apple exige um filtro, uma denúncia seguida de resposta rápida, um bloqueio e um contato publicado. As mensagens de rejeição acrescentam uma quinta exigência: termos de uso aceitos, que não toleram nem conteúdo ofensivo nem usuário abusivo.
Este guia não conta a história de uma rejeição. Ele mostra o que eu implementei no TradaZen, meu app de treino de trading, quando os rankings começaram a exibir apelidos escolhidos pelos jogadores. Para uma visão geral dos motivos de rejeição, leia por que a Apple rejeita um app.
O que diz a guideline 1.2?
A 1.2, "User-Generated Content", fica na seção 1, "Safety", das App Review Guidelines. Ela trata dos apps com conteúdo de usuários ou com serviço de rede social. Para evitar abusos, esses apps "must include" quatro proteções:
- "A method for filtering objectionable material from being posted to the app": um filtro que bloqueia o conteúdo ofensivo antes da publicação.
- "A mechanism to report offensive content and timely responses to concerns": um jeito de denunciar um conteúdo, e uma resposta rápida às denúncias.
- "The ability to block abusive users from the service": a possibilidade de bloquear um usuário abusivo.
- "Published contact information so users can easily reach you": um contato publicado, fácil de encontrar.
A versão atual do texto, atualizada em 8 de junho de 2026, vai além. Ela lembra que é sua responsabilidade remover o conteúdo que viola a regra, seus termos de uso ou suas regras de comunidade. Se a Apple encontrar algum, ela pede que você o remova e apresente um plano de melhoria, e pode tirar o app do ar enquanto isso.
O texto também lista os apps que não têm lugar na App Store: os que servem principalmente para pornografia, chat aleatório ou anônimo no estilo Chatroulette, avaliar a aparência de pessoas reais, ameaças ou assédio. Para esses usos, as quatro proteções não bastam. A 1.2.1 acrescenta regras para apps de criadores, principalmente uma verificação de idade para conteúdo que ultrapassa a classificação do app.
Seu app se encaixa nisso?
O questionário de classificação etária do App Store Connect dá uma boa definição. Ele fala em conteúdo gerado por usuários quando conteúdo criado por usuários é amplamente distribuído no app: vídeos, fotos, textos ou áudio. Ele trata separadamente as mensagens entre usuários.
| O que os outros veem | Se aplica? |
|---|---|
| Mensagens entre membros | Sim |
| Fotos ou avaliações públicas | Sim |
| Apelido em um ranking | Sim, na minha opinião |
| Notas privadas | Não |
| Conteúdo escrito por você | Não |
A Apple não cita apelidos. Mesmo assim, eu os trato como conteúdo de usuário: qualquer um pode escolher um apelido ofensivo, e outros jogadores vão vê-lo. Foi a escolha que fiz para os rankings do TradaZen.
Os 5 mecanismos para programar, com Expo e Supabase
A mensagem de rejeição 1.2, do jeito que um desenvolvedor publicou nos fóruns da Apple no fim de 2025, lista as medidas esperadas. Ela começa com "Require that users agree to terms (EULA)" e termina com uma exigência de prazo: agir sobre as denúncias "within 24 hours", removendo o conteúdo e expulsando o autor.
| Mecanismo | Onde programar |
|---|---|
| Termos aceitos | Tela e perfil |
| Filtro | Servidor, antes de exibir |
| Denúncia | Botão e tabela |
| Bloqueio | Tabela e regra de acesso |
| Contato publicado | App e página na App Store |
Os exemplos SQL abaixo precisam ser adaptados ao seu schema. Eles usam as regras de acesso por linha do Supabase, que valem mesmo se alguém contornar o seu app.
1. Termos aceitos, sem tolerância a abusos
Seus termos de uso precisam dizer com todas as letras que nenhum conteúdo ofensivo nem usuário abusivo é tolerado. Exemplo de cláusula, para mandar revisar, não é aconselhamento jurídico: "Nenhum conteúdo ofensivo, de ódio, sexual ou de assédio é tolerado. Um conteúdo denunciado pode ser removido e seu autor expulso, sem aviso prévio."
Uma frase passiva embaixo de um botão de cadastro não comprova o consentimento: peça um gesto explícito. Uma tela com um link para os termos e um botão "Aceito", antes da primeira publicação. Salve no perfil a data e a versão aceitas, e bloqueie a publicação enquanto elas estiverem faltando:
create policy "publier après les CGU" on public.posts
for insert to authenticated
with check (
auth.uid() = author_id
and exists (
select 1 from public.profiles p
where p.id = auth.uid() and p.cgu_acceptees_le is not null
)
);
2. Um filtro antes que os outros vejam o conteúdo
O filtro fica no servidor, porque o código do app pode ser contornado. Uma cópia no app serve só para avisar o usuário na hora.
No TradaZen, uma função no banco verifica cada apelido, e o app aplica a mesma lista para avisar o jogador. Eu mantenho as duas idênticas. No servidor, um apelido ofensivo não é recusado na gravação: ele é substituído por um apelido neutro na exibição, o que evita bloquear alguém por um falso positivo.
Falsos positivos aparecem rápido. No TradaZen, uma primeira versão do filtro censurava nomes como Dominique, Monique ou Véronique, porque eles contêm um pedaço de palavrão em francês. A correção: procurar palavras inteiras, não pedaços de palavras. E como o app é vendido em japonês e chinês, o filtro também cobre esses idiomas.
3. Uma denúncia, tratada em até 24 horas
Todo conteúdo publicado tem um botão "Denunciar". No TradaZen, um apelido denunciado no ranking da liga passa a aparecer na hora com um rótulo neutro, no celular de quem denunciou. A denúncia então vai para o servidor, e é reenviada depois se o celular estiver offline.
No banco, uma tabela de denúncias, com uma só por pessoa e por conteúdo:
create table public.reports (
id uuid primary key default gen_random_uuid(),
reporter_id uuid not null references auth.users (id) on delete cascade,
target_id uuid not null,
reason text,
created_at timestamptz not null default now(),
unique (reporter_id, target_id)
);
alter table public.reports enable row level security;
create policy "mes signalements" on public.reports
for insert to authenticated
with check (auth.uid() = reporter_id);
No TradaZen, um apelido denunciado por vários jogadores é substituído por um apelido neutro, e as denúncias nunca são mostradas à pessoa denunciada. Um cuidado geral: o identificador usado na denúncia não pode ser alterável pelo autor do conteúdo, senão ele pode escapar da ocultação.
A ocultação automática não substitui a sua decisão. Para cumprir as 24 horas, configure um aviso a cada denúncia: um webhook de banco de dados do Supabase pode chamar uma função no servidor que te manda uma mensagem. A chave que permite remover o conteúdo fica no servidor, como explico em chave de API secreta em um app Expo.
4. Um bloqueio que age imediatamente
Uma tabela de bloqueios e, depois, uma regra de acesso que tira o conteúdo das pessoas bloqueadas do feed de quem bloqueou:
create policy "sans les bloqués" on public.posts
for select to authenticated
using (
not exists (
select 1 from public.blocks b
where b.blocker_id = auth.uid() and b.blocked_id = posts.author_id
)
);
No TradaZen, você adiciona um amigo por um código, e pode removê-lo e bloqueá-lo. Um amigo bloqueado some da lista, mesmo se mandar um novo pedido.
5. Um contato publicado, fácil de encontrar
Coloque um endereço de contato nos ajustes do app e uma URL de suporte que realmente funcione no App Store Connect. No TradaZen, o e-mail de suporte aparece na política de privacidade e nos termos de uso. O conteúdo esperado dessas páginas está em política de privacidade de um aplicativo.
Último ponto: decida o que acontece com o conteúdo de alguém que exclui a conta. O on delete cascade acima apaga as denúncias da pessoa junto com a conta. O passo a passo completo está em exclusão de conta no iOS.
O que o TradaZen mostra na política
Esses mecanismos estão descritos publicamente na política de privacidade do TradaZen, complementada em setembro de 2026 com a chegada das ligas e dos amigos: "Os apelidos passam por um filtro automático; você pode denunciar um apelido inadequado no ranking, e remover e bloquear um amigo." A mesma política explica que o e-mail e o diário nunca são mostrados aos outros jogadores. O contexto do app está no estudo de caso do TradaZen.
O que responder à Apple depois de uma rejeição 1.2
Diga ao reviewer onde encontrar cada mecanismo, na sua resposta e nas notas de revisão. Essas funções vivem no app: o reviewer testa o código embarcado na build, então prepare uma nova build. O procedimento para responder ao App Review é o mesmo das outras regras. Aqui vai um modelo em inglês, para adaptar, mantendo só o que for verdade no seu app:
Hello,
Thank you for your review. Build X includes the precautions
listed in Guideline 1.2:
- Terms: users accept our terms, with zero tolerance for
objectionable content and abusive users, before posting.
- Filter: posts and usernames are checked on our server
before other users can see them.
- Report: tap "..." on any post, then "Report".
- Block: tap "..." on any post, then "Block user". Their
content disappears immediately.
- Reports notify us instantly; we act on them within 24 hours.
- Contact: Settings > Contact us, and our support URL.
Best regards,
Se faltar um mecanismo na build, uma resposta não vai bastar. Como na guideline 2.1, a Apple julga a build que tem em mãos.
O checklist 1.2 antes do envio
- Você listou tudo o que um usuário publica e outros veem, incluindo apelidos.
- Seus termos proíbem conteúdo ofensivo e abusos, e o app pede um "Aceito" explícito.
- O filtro roda no servidor, procura palavras inteiras e cobre os idiomas da sua página.
- Todo conteúdo tem um botão "Denunciar", e cada denúncia te avisa na hora.
- Você sabe remover um conteúdo e expulsar o autor em menos de 24 horas.
- Bloquear um usuário remove o conteúdo dele imediatamente.
- Um endereço de contato está visível no app, e a URL de suporte funciona.
- O questionário de classificação etária declara o conteúdo de usuários, e as mensagens se o seu app tiver.
- As notas de revisão dizem onde encontrar cada mecanismo, com uma conta de demonstração.
Corrija a rejeição antes de reenviar o app
Se o seu app acabou de ser rejeitado pela 1.2, o Review Kit reúne o que eu verifico antes de cada envio, com duas skills que revisam o seu projeto no Claude Code e preparam sua resposta se a Apple rejeitar. Se quiser um olhar humano, agende uma hora comigo: a gente lê a mensagem juntos e analisa o seu fluxo de moderação. O passo a passo completo depois de uma rejeição está na página aplicativo rejeitado pela Apple.
Se você está preparando seu primeiro lançamento, faça seu diagnóstico gratuito: ele diz qual etapa atacar primeiro e te envia meu checklist anti-rejeição da Apple.
Ninguém pode garantir que a Apple vai aceitar o seu app. Esses cinco mecanismos, bem visíveis, pelo menos tiram esse motivo da lista.
Perguntas frequentes
O que significa "Guideline 1.2 - Safety - User-Generated Content"?
É o título da rejeição na mensagem da Apple. Significa que o seu app exibe conteúdo criado por usuários sem todas as proteções esperadas: filtro, denúncia tratada rápido, bloqueio, contato publicado e termos de uso aceitos.
Um apelido em um ranking conta como conteúdo de usuário?
O texto da Apple não diz. Eu trato como tal, porque um apelido é escolhido livremente e visto por outros jogadores. No TradaZen, os apelidos dos rankings passam por um filtro, podem ser denunciados e são substituídos por um apelido neutro se causarem problema.
É preciso mesmo tratar as denúncias em até 24 horas?
É o que pede a mensagem de rejeição da Apple. O texto da regra fala em respostas rápidas. Então um filtro automático não basta: precisa de alguém que remova o conteúdo e expulse o autor. A ocultação automática depois de várias denúncias te ajuda a segurar enquanto isso.
Os termos de uso precisam ser aceitos dentro do app?
É o jeito mais seguro. A mensagem de rejeição pede que os usuários aceitem termos que não toleram nem conteúdo ofensivo nem usuário abusivo. Um link no rodapé de uma página não comprova o consentimento. Uma tela com um botão "Aceito", antes da primeira publicação, não deixa dúvida.
Um app de chat anônimo pode passar na guideline 1.2?
O texto atual cita o chat aleatório ou anônimo entre os usos que não têm lugar na App Store. Um app que serve principalmente para isso pode ser removido sem aviso prévio, mesmo com filtro, denúncia e bloqueio.

