Guideline 1.2 User-Generated Content: qué exige Apple
Por Mehdi Azizi
Publicado el , 10 min
Guideline 1.2: si tus usuarios publican, necesitas filtro, reporte, bloqueo, contacto y términos aceptados. Checklist con Expo y Supabase.
La guideline 1.2 se aplica en cuanto los usuarios publican algo que otros ven: un mensaje, una foto, una reseña y, en mi opinión, un simple nombre de usuario en una clasificación. El texto de Apple exige entonces un filtro, un sistema de reportes con respuesta rápida, un bloqueo y un contacto publicado. Los mensajes de rechazo añaden un quinto requisito: términos de uso aceptados, que no toleren ni contenido ofensivo ni usuarios abusivos.
Esta guía no cuenta un rechazo. Muestra lo que implementé en TradaZen, mi app de práctica de trading, cuando sus clasificaciones empezaron a mostrar nombres de usuario elegidos por los jugadores. Para ver el panorama general de los motivos de rechazo, mejor lee por qué Apple rechaza una app.
¿Qué dice la guideline 1.2?
La 1.2, "User-Generated Content", está en la sección 1, "Safety", de las App Review Guidelines. Apunta a las apps con contenido de usuarios o con un servicio de red social. Para evitar abusos, estas apps "must include" cuatro protecciones:
- "A method for filtering objectionable material from being posted to the app": un filtro que bloquea el contenido ofensivo antes de que se publique.
- "A mechanism to report offensive content and timely responses to concerns": una forma de reportar un contenido, y una respuesta rápida a los reportes.
- "The ability to block abusive users from the service": la posibilidad de bloquear a un usuario abusivo.
- "Published contact information so users can easily reach you": un contacto publicado y fácil de encontrar.
La versión actual del texto, actualizada el 8 de junio de 2026, va más lejos. Recuerda que es tu responsabilidad retirar el contenido que infringe la regla, tus términos de uso o tus normas de comunidad. Si Apple encuentra contenido así, te pide retirarlo y presentar un plan de mejora, y puede retirar la app mientras tanto.
El texto también enumera las apps que no tienen lugar en el App Store: las que sirven sobre todo para pornografía, chat aleatorio o anónimo al estilo Chatroulette, calificar el físico de personas reales, amenazas o acoso. Para esos usos, las cuatro protecciones no bastan. La 1.2.1 añade reglas para las apps de creadores, en particular un control de edad para el contenido que supera la clasificación de la app.
¿Tu app está afectada?
El cuestionario de clasificación por edad de App Store Connect da una buena definición. Habla de contenido generado por los usuarios cuando contenido creado por usuarios se difunde ampliamente en la app: videos, fotos, textos o audio. La mensajería entre usuarios la trata aparte.
| Lo que ven los demás | ¿Afectada? |
|---|---|
| Mensajes entre miembros | Sí |
| Fotos o reseñas públicas | Sí |
| Nombre de usuario en una clasificación | Sí, en mi opinión |
| Notas privadas | No |
| Contenido escrito por ti | No |
Apple no menciona los nombres de usuario. Aun así, los trato como contenido de usuario: cualquiera puede elegir uno insultante, y otros jugadores lo ven. Es la decisión que tomé para las clasificaciones de TradaZen.
Los 5 mecanismos que hay que programar, con Expo y Supabase
El mensaje de rechazo 1.2, tal como un desarrollador lo publicó en los foros de Apple a finales de 2025, enumera las medidas esperadas. Empieza con "Require that users agree to terms (EULA)" y termina con un requisito de plazo: actuar sobre los reportes "within 24 hours", retirando el contenido y expulsando a su autor.
| Mecanismo | Dónde programarlo |
|---|---|
| Términos aceptados | Pantalla y perfil |
| Filtro | Servidor, antes de mostrar |
| Reporte | Botón y tabla |
| Bloqueo | Tabla y regla de acceso |
| Contacto publicado | App y ficha del App Store |
Los ejemplos SQL de abajo hay que adaptarlos a tu esquema. Se apoyan en las reglas de acceso por fila de Supabase, que se aplican incluso si alguien se salta tu app.
1. Términos aceptados, sin tolerancia para los abusos
Tus términos de uso deben decir claramente que no se tolera ningún contenido ofensivo ni ningún usuario abusivo. Ejemplo de cláusula, para que la revise alguien, no es asesoría legal: "No se tolera ningún contenido ofensivo, de odio, sexual o de acoso. Un contenido reportado puede ser retirado y su autor expulsado, sin previo aviso."
Una frase pasiva debajo de un botón de registro no prueba el consentimiento: pide un gesto explícito. Una pantalla con un enlace a los términos y un botón "Acepto", antes de la primera publicación. Guarda la fecha y la versión aceptadas en el perfil, y luego impide publicar mientras falten:
create policy "publicar tras aceptar los términos" 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. Un filtro antes de que los demás vean el contenido
El filtro vive en el servidor, porque el código de la app se puede eludir. Una copia en la app solo sirve para avisar al usuario de inmediato.
En TradaZen, una función en la base de datos revisa cada nombre de usuario, y la app aplica la misma lista para avisar al jugador. Mantengo las dos idénticas. En el servidor, un nombre ofensivo no se rechaza al escribirlo: se reemplaza por un nombre neutro al mostrarlo, lo que evita bloquear a alguien por un falso positivo.
Los falsos positivos llegan rápido. En TradaZen, una primera versión del filtro censuraba nombres como Dominique, Monique o Véronique, porque contienen un fragmento de una palabra grosera. La corrección: buscar palabras completas, no fragmentos. Y como la app se vende en japonés y en chino, el filtro también cubre esos idiomas.
3. Un reporte, atendido en 24 horas
Cada contenido publicado lleva un botón "Reportar". En TradaZen, un nombre reportado en la clasificación de la liga se muestra de inmediato con una etiqueta neutra en el teléfono de quien lo reporta. Luego el reporte se envía al servidor, y se reenvía más tarde si el teléfono está sin conexión.
En la base de datos, una tabla de reportes, uno solo por persona y por contenido:
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 "mis reportes" on public.reports
for insert to authenticated
with check (auth.uid() = reporter_id);
En TradaZen, un nombre reportado por varios jugadores se reemplaza por un nombre neutro, y los reportes nunca se muestran a la persona reportada. Una precaución general: el identificador que sirve para el reporte no debe poder modificarlo el autor del contenido, porque si no puede escaparse del ocultamiento.
El ocultamiento automático no reemplaza tu decisión. Para cumplir las 24 horas, haz que te avisen con cada reporte: un webhook de base de datos de Supabase puede llamar a una función del servidor que te envíe un mensaje. La clave que permite retirar el contenido se queda en el servidor, como explico en clave API secreta en una app Expo.
4. Un bloqueo que actúa de inmediato
Una tabla de bloqueos y, luego, una regla de acceso que quita el contenido de las personas bloqueadas del feed de quien bloquea:
create policy "sin los bloqueados" 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
)
);
En TradaZen, se agrega a un amigo con un código, y se le puede quitar y bloquear. Un amigo bloqueado desaparece de la lista, aunque vuelva a enviar una solicitud.
5. Un contacto publicado y fácil de encontrar
Pon una dirección de contacto en los ajustes de la app, y una URL de soporte que realmente responda en App Store Connect. En TradaZen, la dirección de soporte aparece en la política de privacidad y en los términos de uso. Lo que deben contener esas páginas está en política de privacidad de una aplicación.
Último punto: decide qué pasa con el contenido de una persona que elimina su cuenta. El on delete cascade de arriba elimina sus reportes junto con su cuenta. La receta completa está en eliminación de cuenta en iOS.
Lo que TradaZen muestra en su política
Estos mecanismos se describen públicamente en la política de privacidad de TradaZen, ampliada en septiembre de 2026 con la llegada de las ligas y los amigos: "Los nombres de usuario pasan por un filtro automático; puedes reportar un nombre inapropiado en la clasificación, y quitar y bloquear a un amigo." La misma política aclara que el correo electrónico y el diario nunca se muestran a los demás jugadores. El contexto de la app está en el caso de estudio de TradaZen.
Qué responderle a Apple tras un rechazo 1.2
Dile al revisor dónde encontrar cada mecanismo, en tu respuesta y en las notas de revisión. Estas funciones viven en la app: el revisor prueba el código incluido en la build, así que prepara un nuevo build. El procedimiento para responder a App Review es el mismo que para las demás reglas. Aquí tienes un modelo en inglés, para adaptar, conservando solo lo que sea cierto en tu 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,
Si falta un mecanismo en la build, una respuesta no bastará. Igual que con la guideline 2.1, Apple juzga la build que tiene en las manos.
La checklist 1.2 antes del envío
- Hiciste la lista de todo lo que un usuario publica y otros ven, nombres de usuario incluidos.
- Tus términos prohíben el contenido ofensivo y los abusos, y la app pide un "Acepto" explícito.
- El filtro corre en el servidor, busca palabras completas y cubre los idiomas de tu ficha.
- Cada contenido tiene un botón "Reportar", y cada reporte te avisa al instante.
- Sabes retirar un contenido y expulsar a su autor en menos de 24 horas.
- Bloquear a un usuario quita su contenido de inmediato.
- Hay una dirección de contacto visible en la app, y la URL de soporte responde.
- El cuestionario de clasificación por edad declara el contenido de usuarios, y la mensajería si tu app la tiene.
- Las notas de revisión indican dónde encontrar cada mecanismo, con una cuenta de demostración.
Corrige tu rechazo antes de reenviar la app
Si tu app acaba de ser rechazada por la 1.2, el Review Kit reúne lo que reviso antes de cada envío, con dos skills que revisan tu proyecto en Claude Code y preparan tu respuesta si Apple rechaza. Si quieres una mirada humana, reserva una hora conmigo: leemos el mensaje juntos y revisamos tu flujo de moderación. El proceso completo tras un rechazo está en la página aplicación rechazada por Apple.
Si estás preparando tu primer lanzamiento, haz tu diagnóstico gratuito: te dice qué etapa abordar primero y te envía mi checklist antirrechazo de Apple.
Nadie puede garantizar que Apple acepte tu app. Estos cinco mecanismos, bien visibles, al menos quitan este motivo de la lista.
Preguntas frecuentes
¿Qué significa "Guideline 1.2 - Safety - User-Generated Content"?
Es el título del rechazo en el mensaje de Apple. Significa que tu app muestra contenido creado por usuarios sin todas las protecciones esperadas: filtro, reportes atendidos rápido, bloqueo, contacto publicado y términos de uso aceptados.
¿Un nombre de usuario en una clasificación cuenta como contenido de usuario?
El texto de Apple no lo dice. Yo lo trato como tal, porque un nombre de usuario se elige libremente y lo ven otros jugadores. En TradaZen, los nombres de las clasificaciones pasan por un filtro, se pueden reportar y se reemplazan por un nombre neutro si causan problemas.
¿De verdad hay que atender los reportes en 24 horas?
Es lo que pide el mensaje de rechazo de Apple. El texto de la regla habla de respuestas rápidas. Por eso un filtro automático no basta: hace falta alguien que retire el contenido y expulse a su autor. El ocultamiento automático tras varios reportes te ayuda a aguantar mientras tanto.
¿Los términos de uso deben aceptarse dentro de la app?
Es la forma más segura. El mensaje de rechazo pide que los usuarios acepten términos que no toleren ni contenido ofensivo ni usuarios abusivos. Un enlace al pie de una página no prueba el consentimiento. Una pantalla con un botón "Acepto", antes de la primera publicación, no deja dudas.
¿Una app de chat anónimo puede pasar la guideline 1.2?
El texto actual menciona el chat aleatorio o anónimo entre los usos que no tienen lugar en el App Store. Una app que sirve sobre todo para eso puede ser retirada sin previo aviso, incluso con filtro, reportes y bloqueo.

