# Guideline 1.2 User-Generated Content: ce cere Apple

> Guideline 1.2: dacă utilizatorii publică, ai nevoie de filtru, raportare, blocare, contact și termeni acceptați. Checklist Expo și Supabase.

Pagina originală: [Guideline 1.2 User-Generated Content: ce cere Apple](https://devoria.fr/ro/blog/guideline-1-2-user-generated-content-apple)
Autor: [Mehdi Azizi](https://devoria.fr/ro/mehdi-azizi)
Publicare: 2026-11-04
Ultima revizuire a conținutului: 2026-11-04


Guideline 1.2 se aplică din momentul în care utilizatorii publică ceva ce văd și alții: un mesaj, o fotografie, o recenzie și, după mine, chiar și un simplu pseudonim într-un clasament. Textul Apple cere atunci un filtru, o raportare urmată de un răspuns rapid, o blocare și un contact publicat. **Mesajele de respingere adaugă o a cincea cerință: termeni de utilizare acceptați, care nu tolerează nici conținut ofensator, nici utilizatori abuzivi.**

Ghidul ăsta nu povestește o respingere. Îți arată ce am pus în TradaZen, aplicația mea de antrenament pentru trading, când clasamentele ei au început să afișeze pseudonime alese de jucători. Pentru imaginea de ansamblu a motivelor de respingere, citește mai degrabă [de ce respinge Apple o aplicație](https://devoria.fr/ro/blog/aplicatie-respinsa-apple-cazuri-reale).

## Ce spune guideline 1.2?

1.2, „User-Generated Content”, se află în secțiunea 1, „Safety”, din [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#user-generated-content). Vizează aplicațiile cu conținut creat de utilizatori sau cu un serviciu de rețea socială. Ca să prevină abuzurile, aceste aplicații „must include” patru protecții:

- „A method for filtering objectionable material from being posted to the app”: **un filtru care blochează conținutul ofensator înainte de publicare**.
- „A mechanism to report offensive content and timely responses to concerns”: un mod de a raporta un conținut și un răspuns rapid la raportări.
- „The ability to block abusive users from the service”: posibilitatea de a bloca un utilizator abuziv.
- „Published contact information so users can easily reach you”: un contact publicat, ușor de găsit.

Versiunea actuală a textului, actualizată pe 8 iunie 2026, merge mai departe. Amintește că e responsabilitatea ta să elimini conținutul care încalcă regula, termenii tăi de utilizare sau regulile comunității. Dacă Apple găsește așa ceva, îți cere să-l elimini și să furnizezi un plan de îmbunătățire, iar între timp poate retrage aplicația.

Textul enumeră și aplicațiile care nu au ce căuta în App Store: cele care servesc în principal pornografiei, chatului aleatoriu sau anonim în stil Chatroulette, evaluării aspectului fizic al unor persoane reale, amenințărilor sau hărțuirii. **Pentru aceste utilizări, cele patru protecții nu sunt suficiente.** 1.2.1 adaugă reguli pentru aplicațiile de creatori, în special un control al vârstei pentru conținutul care depășește clasificarea aplicației.

## Aplicația ta e vizată?

Chestionarul de clasificare pe vârste din App Store Connect dă o definiție bună. Vorbește de [conținut generat de utilizatori](https://developer.apple.com/help/app-store-connect/reference/app-information/age-ratings-values-and-definitions) când conținutul creat de utilizatori e difuzat pe scară largă în aplicație: videoclipuri, fotografii, texte sau audio. Mesageria între utilizatori o tratează separat.

| Ce văd ceilalți                 | Vizată?       |
| ------------------------------- | ------------- |
| Mesaje între membri             | Da            |
| Fotografii sau recenzii publice | Da            |
| Pseudonim într-un clasament     | Da, după mine |
| Notițe private                  | Nu            |
| Conținut scris de tine          | Nu            |

Apple nu pomenește pseudonimele. Eu le tratez totuși drept conținut de utilizator: oricine își poate alege unul jignitor, iar alți jucători îl văd. Asta e alegerea pe care am făcut-o pentru clasamentele din TradaZen.

## Cele 5 mecanisme de implementat, cu Expo și Supabase

Mesajul de respingere 1.2, așa cum l-a publicat un dezvoltator pe [forumurile Apple](https://developer.apple.com/forums/thread/807358) la sfârșitul lui 2025, enumeră măsurile așteptate. Începe cu „Require that users agree to terms (EULA)” și se termină cu o cerință de termen: să acționezi asupra raportărilor „within 24 hours”, eliminând conținutul și excluzându-i autorul.

| Mecanism          | Unde îl implementezi          |
| ----------------- | ----------------------------- |
| Termeni acceptați | Ecran și profil               |
| Filtru            | Server, înainte de afișare    |
| Raportare         | Buton și tabel                |
| Blocare           | Tabel și regulă de acces      |
| Contact publicat  | Aplicație și pagina App Store |

Exemplele SQL de mai jos trebuie adaptate la schema ta. Se bazează pe [regulile de acces pe rând din Supabase](https://supabase.com/docs/guides/database/postgres/row-level-security), care se aplică chiar dacă cineva ocolește aplicația ta.

### 1. Termeni acceptați, fără toleranță pentru abuzuri

Termenii tăi de utilizare trebuie să spună negru pe alb că nu e tolerat niciun conținut ofensator și niciun utilizator abuziv. Exemplu de clauză, de dat la verificat, nu e o consultanță juridică: „Nu este tolerat niciun conținut jignitor, instigator la ură, sexual sau de hărțuire. Un conținut raportat poate fi eliminat, iar autorul lui exclus, fără preaviz.”

**O frază pasivă sub un buton de înscriere nu dovedește acordul: cere un gest explicit.** Un ecran cu un link către termeni și un buton „Accept”, înainte de prima publicare. Salvează data și versiunea acceptate în profil, apoi interzice publicarea cât timp lipsesc:

```sql
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. Un filtru înainte ca alții să vadă conținutul

Filtrul stă pe server, pentru că codul aplicației poate fi ocolit. O copie în aplicație servește doar ca să-l avertizeze imediat pe utilizator.

În TradaZen, o funcție în baza de date verifică fiecare pseudonim, iar aplicația aplică aceeași listă ca să-l avertizeze pe jucător. Le țin pe amândouă identice. Pe server, un pseudonim jignitor nu e refuzat la scriere: **e înlocuit cu un pseudonim neutru la afișare, ceea ce evită să blochezi pe cineva din cauza unui fals pozitiv**.

Falsurile pozitive apar repede. În TradaZen, o primă versiune a filtrului cenzura prenume ca Dominique, Monique sau Véronique, pentru că conțin o bucată dintr-un cuvânt vulgar. Corectura: caută cuvinte întregi, nu bucăți de cuvinte. Și cum aplicația e vândută în japoneză și chineză, filtrul acoperă și aceste limbi.

### 3. O raportare, tratată în 24 de ore

Fiecare conținut publicat are un buton „Raportează”. În TradaZen, un pseudonim raportat în clasamentul ligii apare imediat sub o etichetă neutră, pe telefonul persoanei care raportează. Raportarea pleacă apoi spre server și e retrimisă mai târziu dacă telefonul e offline.

În baza de date, un tabel de raportări, una singură per persoană și per conținut:

```sql
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);
```

În TradaZen, **un pseudonim raportat de mai mulți jucători e înlocuit cu un pseudonim neutru**, iar raportările nu-i sunt niciodată arătate persoanei raportate. O precauție generală: identificatorul folosit la raportare nu trebuie să poată fi modificat de autorul conținutului, altfel poate scăpa de mascare.

Mascarea automată nu-ți înlocuiește decizia. Ca să te încadrezi în 24 de ore, fă în așa fel încât să fii anunțat la fiecare raportare: un [webhook de bază de date Supabase](https://supabase.com/docs/guides/database/webhooks) poate apela o funcție de server care îți trimite un mesaj. Cheia care permite eliminarea conținutului rămâne pe server, cum explic în [cheie API secretă într-o aplicație Expo](https://devoria.fr/ro/blog/cheie-api-secreta-aplicatie-expo).

### 4. O blocare care acționează imediat

Un tabel de blocări, apoi o regulă de acces care scoate conținutul persoanelor blocate din fluxul celui care blochează:

```sql
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
  )
);
```

În TradaZen, adaugi un prieten printr-un cod și îl poți elimina și bloca. **Un prieten blocat dispare din listă, chiar dacă retrimite o cerere.**

### 5. Un contact publicat, ușor de găsit

Pune o adresă de contact în setările aplicației și un URL de asistență care chiar răspunde în App Store Connect. În TradaZen, adresa de suport apare în politica de confidențialitate și în termenii de utilizare. Conținutul așteptat al acestor pagini e în [politica de confidențialitate a unei aplicații](https://devoria.fr/ro/blog/politica-confidentialitate-aplicatie-ios).

Un ultim punct: decide ce se întâmplă cu conținutul unei persoane care își șterge contul. `on delete cascade` de mai sus îi șterge raportările odată cu contul. Rețeta completă e în [ștergerea contului pe iOS](https://devoria.fr/ro/blog/stergere-cont-app-ios-testare-apple).

## Ce afișează TradaZen în politica sa

Aceste mecanisme sunt descrise public în politica de confidențialitate a TradaZen, completată în septembrie 2026 odată cu apariția ligilor și a prietenilor: „Pseudonimele trec printr-un filtru automat; poți raporta un pseudonim nepotrivit în clasament și poți elimina și bloca un prieten.” Aceeași politică precizează că e-mailul și jurnalul nu le sunt niciodată arătate altor jucători. Contextul aplicației e în [studiul de caz TradaZen](https://devoria.fr/ro/blog/studiu-de-caz-tradazen-lansare-aplicatie-iphone).

## Ce îi răspunzi lui Apple după o respingere 1.2

Spune-i reviewerului unde găsește fiecare mecanism, în răspuns și în notele de review. Aceste funcții trăiesc în aplicație: reviewerul testează codul inclus în build, așa că pregătește un build nou. Procedura pentru a [răspunde la App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/) e aceeași ca pentru celelalte reguli. Iată un model în engleză, de adaptat, păstrând doar ce e adevărat în aplicația ta:

```text
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,
```

Dacă un mecanism lipsește din build, un răspuns nu va fi suficient. La fel ca la [guideline 2.1](https://devoria.fr/ro/blog/guideline-2-1-app-store-respingere), Apple judecă build-ul pe care îl are în mână.

## Checklistul 1.2 înainte de trimitere

- Ai listat tot ce publică un utilizator și văd alții, inclusiv pseudonimele.
- Termenii tăi interzic conținutul ofensator și abuzurile, iar aplicația cere un „Accept” explicit.
- Filtrul rulează pe server, caută cuvinte întregi și acoperă limbile paginii tale din store.
- Fiecare conținut are un buton „Raportează”, iar fiecare raportare te anunță imediat.
- Știi să elimini un conținut și să-i excluzi autorul în mai puțin de 24 de ore.
- Blocarea unui utilizator îi elimină conținutul imediat.
- O adresă de contact e vizibilă în aplicație, iar URL-ul de asistență răspunde.
- Chestionarul de clasificare pe vârste declară conținutul generat de utilizatori și mesageria, dacă aplicația ta are așa ceva.
- Notele de review spun unde găsești fiecare mecanism, cu un cont demo.

## Corectează respingerea înainte să retrimiți aplicația

Dacă aplicația ta tocmai a fost respinsă pe 1.2, [Review Kit](https://devoria.fr/ro/kits/app-review) adună tot ce verific înainte de fiecare trimitere, cu două skills care îți recitesc proiectul în Claude Code și îți pregătesc răspunsul dacă Apple respinge. Pentru o privire umană, [rezervă o oră cu mine](https://devoria.fr/ro/coaching): citim mesajul împreună și ne uităm la fluxul tău de moderare. Demersul complet după o respingere e pe pagina [aplicație respinsă de Apple](https://devoria.fr/ro/expertise/aplicatie-respinsa-de-apple).

Dacă îți pregătești prima lansare, [fă-ți diagnosticul gratuit](https://devoria.fr/ro/diagnostic): îți spune ce etapă să abordezi întâi și îți trimite checklistul meu anti-respingere Apple.

Nimeni nu poate garanta că Apple îți va accepta aplicația. Aceste cinci mecanisme, bine vizibile, scot cel puțin motivul ăsta de pe listă.

## Întrebări frecvente

### Ce înseamnă „Guideline 1.2 - Safety - User-Generated Content”?

E titlul respingerii din mesajul Apple. Înseamnă că aplicația ta afișează conținut creat de utilizatori fără toate protecțiile așteptate: filtru, raportare tratată rapid, blocare, contact publicat și termeni de utilizare acceptați.

### Un pseudonim într-un clasament contează drept conținut de utilizator?

Textul Apple nu spune asta. Eu îl tratez așa, pentru că un pseudonim e ales liber și văzut de alți jucători. În TradaZen, pseudonimele din clasamente trec printr-un filtru, pot fi raportate și sunt înlocuite cu un pseudonim neutru dacă pun probleme.

### Chiar trebuie tratate raportările în 24 de ore?

Asta cere mesajul de respingere Apple. Textul regulii vorbește de răspunsuri rapide. Deci un filtru automat nu e suficient: e nevoie de cineva care elimină conținutul și îi exclude autorul. Mascarea automată după mai multe raportări te ajută să te descurci până atunci.

### Termenii de utilizare trebuie acceptați în aplicație?

E varianta cea mai sigură. Mesajul de respingere cere ca utilizatorii să accepte termeni care nu tolerează nici conținut ofensator, nici utilizatori abuzivi. Un link în josul unei pagini nu dovedește acordul. Un ecran cu un buton „Accept”, înainte de prima publicare, nu lasă loc de îndoială.

### O aplicație de chat anonim poate trece de guideline 1.2?

Textul actual pomenește chatul aleatoriu sau anonim printre utilizările care nu au ce căuta în App Store. O aplicație care servește în principal la asta poate fi retrasă fără preaviz, chiar și cu filtru, raportare și blocare.


## Proiectul tău

[Review Kit](https://devoria.fr/ro/kits/app-review): Checklistul meu de review App Store, respingerile mele de la Apple rezolvate, checklistul pentru Google Play și trei skilluri Claude Code. 259 RON.

[iOS & Android Kit](https://devoria.fr/ro/kits/ios): Creează-ți aplicația de iPhone și Android cu Claude Code: codul de pornire al aplicațiilor mele, drumul până în store-uri și toate kiturile. 529 RON.

[Diagnostic: ce te desparte de aplicația ta de iPhone](https://devoria.fr/ro/diagnostic): 7 întrebări, 60 de secunde: afli ce te blochează de fapt să-ți publici aplicația de iPhone, traseul tău în 4 etape și kitul potrivit pentru tine.
