# Guideline 1.2 User-Generated Content: wat Apple eist

> Guideline 1.2: publiceren je gebruikers iets? Dan heb je een filter, melden, blokkeren, een contact en geaccepteerde voorwaarden nodig.

Originele pagina: [Guideline 1.2 User-Generated Content: wat Apple eist](https://devoria.fr/nl/blog/guideline-1-2-user-generated-content-apple)
Auteur: [Mehdi Azizi](https://devoria.fr/nl/mehdi-azizi)
Publicatie: 2026-11-04
Laatste inhoudsrevisie: 2026-11-04


Guideline 1.2 geldt zodra gebruikers iets publiceren wat anderen zien: een bericht, een foto, een review en, als je het mij vraagt, zelfs een gewone gebruikersnaam in een ranglijst. Apples tekst eist dan een filter, een meldfunctie met een snelle reactie, een blokkeerfunctie en een gepubliceerd contactadres. **De afwijzingsberichten voegen een vijfde eis toe: geaccepteerde gebruiksvoorwaarden die geen aanstootgevende content en geen misbruikende gebruikers tolereren.**

Deze gids vertelt geen afwijzingsverhaal. Hij laat zien wat ik heb ingebouwd in TradaZen, mijn app om te oefenen met traden, toen de ranglijsten gebruikersnamen gingen tonen die spelers zelf kozen. Voor het overzicht van alle afwijzingsredenen lees je beter [waarom Apple een app afwijst](https://devoria.fr/nl/blog/app-afgewezen-door-apple-waarom).

## Wat zegt guideline 1.2?

Guideline 1.2, "User-Generated Content", staat in sectie 1, "Safety", van de [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#user-generated-content). Hij gaat over apps met content van gebruikers of een sociale-netwerkdienst. Om misbruik te voorkomen "must include" deze apps vier beschermingen:

- "A method for filtering objectionable material from being posted to the app": **een filter dat aanstootgevende content tegenhoudt voordat die gepubliceerd wordt**.
- "A mechanism to report offensive content and timely responses to concerns": een manier om content te melden, en een snelle reactie op meldingen.
- "The ability to block abusive users from the service": de mogelijkheid om een misbruikende gebruiker te blokkeren.
- "Published contact information so users can easily reach you": een gepubliceerd, makkelijk vindbaar contactadres.

De huidige versie van de tekst, bijgewerkt op 8 juni 2026, gaat verder. Hij herinnert eraan dat jij verantwoordelijk bent voor het verwijderen van content die de regel, je gebruiksvoorwaarden of je communityregels schendt. Vindt Apple zulke content, dan vraagt het je die te verwijderen en een verbeterplan aan te leveren, en kan het de app intussen offline halen.

De tekst noemt ook apps die niet in de App Store thuishoren: apps die vooral dienen voor porno, willekeurige of anonieme chat in Chatroulette-stijl, het beoordelen van het uiterlijk van echte mensen, bedreigingen of intimidatie. **Voor die toepassingen zijn de vier beschermingen niet genoeg.** Guideline 1.2.1 voegt regels toe voor creator-apps, waaronder een leeftijdscontrole voor content die boven de leeftijdsclassificatie van de app uitgaat.

## Valt jouw app eronder?

De vragenlijst voor de leeftijdsclassificatie in App Store Connect geeft een goede definitie. Die spreekt van [door gebruikers gegenereerde content](https://developer.apple.com/help/app-store-connect/reference/app-information/age-ratings-values-and-definitions) als content van gebruikers breed in de app wordt verspreid: video's, foto's, teksten of audio. Berichten tussen gebruikers behandelt hij apart.

| Wat anderen zien                | Valt eronder?   |
| ------------------------------- | --------------- |
| Berichten tussen leden          | Ja              |
| Openbare foto's of reviews      | Ja              |
| Gebruikersnaam in een ranglijst | Ja, volgens mij |
| Privénotities                   | Nee             |
| Content die jij zelf schreef    | Nee             |

Apple noemt gebruikersnamen niet. Toch behandel ik ze als content van gebruikers: iedereen kan een beledigende naam kiezen, en andere spelers zien die. Dat is de keuze die ik voor de ranglijsten van TradaZen heb gemaakt.

## De 5 mechanismen om te bouwen, met Expo en Supabase

Het afwijzingsbericht voor 1.2, zoals een ontwikkelaar het eind 2025 op de [forums van Apple](https://developer.apple.com/forums/thread/807358) publiceerde, somt de verwachte maatregelen op. Het begint met "Require that users agree to terms (EULA)" en eindigt met een termijn: binnen "within 24 hours" op meldingen reageren, door de content te verwijderen en de maker ervan uit te sluiten.

| Mechanisme                | Waar je het bouwt       |
| ------------------------- | ----------------------- |
| Geaccepteerde voorwaarden | Scherm en profiel       |
| Filter                    | Server, vóór weergave   |
| Melden                    | Knop en tabel           |
| Blokkeren                 | Tabel en toegangsregel  |
| Gepubliceerd contact      | App en App Store-pagina |

De SQL-voorbeelden hieronder moet je aanpassen aan je eigen schema. Ze leunen op de [toegangsregels per rij van Supabase](https://supabase.com/docs/guides/database/postgres/row-level-security), die ook gelden als iemand je app omzeilt.

### 1. Geaccepteerde voorwaarden, zonder tolerantie voor misbruik

Je gebruiksvoorwaarden moeten zwart op wit zeggen dat aanstootgevende content en misbruikende gebruikers niet worden getolereerd. Een voorbeeldclausule, laat die nakijken, dit is geen juridisch advies: "Beledigende, haatdragende, seksuele of intimiderende content wordt niet getolereerd. Gemelde content kan zonder voorafgaande waarschuwing worden verwijderd en de maker ervan uitgesloten."

**Een passieve zin onder een aanmeldknop bewijst geen akkoord: vraag om een expliciete handeling.** Een scherm met een link naar de voorwaarden en een knop "Ik ga akkoord", vóór de eerste publicatie. Sla de datum en de geaccepteerde versie op in het profiel en blokkeer publiceren zolang die ontbreken:

```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. Een filter voordat anderen de content zien

Het filter draait op de server, omdat de code van de app omzeild kan worden. Een kopie in de app dient alleen om de gebruiker meteen te waarschuwen.

In TradaZen controleert een databasefunctie elke gebruikersnaam, en de app gebruikt dezelfde lijst om de speler te waarschuwen. Ik houd die twee identiek. Aan de serverkant wordt een beledigende naam niet geweigerd bij het opslaan: **hij wordt bij weergave vervangen door een neutrale naam, zodat je niemand blokkeert op een vals positief**.

Valse positieven komen snel. In TradaZen censureerde een eerste versie van het filter voornamen als Dominique, Monique of Véronique, omdat er een stukje van een scheldwoord in zit. De oplossing: zoeken naar hele woorden, niet naar stukjes van woorden. En omdat de app ook in het Japans en het Chinees wordt verkocht, dekt het filter die talen ook.

### 3. Een meldfunctie, afgehandeld binnen 24 uur

Elke gepubliceerde content heeft een knop "Melden". In TradaZen wordt een gemelde naam in de ranglijst van de league direct onder een neutraal label getoond, op de telefoon van degene die meldt. De melding gaat daarna naar de server, en wordt later opnieuw verstuurd als de telefoon offline is.

In de database een tabel met meldingen, één per persoon per content:

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

In TradaZen wordt **een naam die door meerdere spelers is gemeld vervangen door een neutrale naam**, en meldingen worden nooit getoond aan de gemelde persoon. Een algemene voorzorg: de identifier die voor de melding wordt gebruikt, mag niet aanpasbaar zijn door de maker van de content, anders kan die aan het verbergen ontsnappen.

Automatisch verbergen vervangt jouw beslissing niet. Om de 24 uur te halen, laat je je bij elke melding waarschuwen: een [database-webhook van Supabase](https://supabase.com/docs/guides/database/webhooks) kan een serverfunctie aanroepen die je een bericht stuurt. De sleutel waarmee je content verwijdert, blijft op de server, zoals ik uitleg in [geheime API-sleutel in een Expo-app](https://devoria.fr/nl/blog/geheime-api-sleutel-expo-app-beschermen).

### 4. Een blokkeerfunctie die direct werkt

Een tabel met blokkades, en daarna een toegangsregel die de content van geblokkeerde personen uit de feed van de blokkeerder haalt:

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

In TradaZen voeg je een vriend toe met een code, en je kunt hem verwijderen en blokkeren. **Een geblokkeerde vriend verdwijnt uit de lijst, ook als hij opnieuw een verzoek stuurt.**

### 5. Een gepubliceerd, makkelijk vindbaar contact

Zet een contactadres in de instellingen van de app, en een support-URL in App Store Connect die echt reageert. In TradaZen staat het supportadres in het privacybeleid en in de gebruiksvoorwaarden. Wat er op die pagina's hoort, lees je in [privacybeleid voor een app](https://devoria.fr/nl/blog/privacybeleid-ios-app-apple).

Laatste punt: bepaal wat er gebeurt met de content van iemand die zijn account verwijdert. De `on delete cascade` hierboven verwijdert zijn meldingen samen met zijn account. Het volledige recept staat in [account verwijderen op iOS](https://devoria.fr/nl/blog/account-verwijderen-ios-app-testen-app-review).

## Wat TradaZen in zijn beleid vermeldt

Deze mechanismen staan openbaar beschreven in het privacybeleid van TradaZen, aangevuld in september 2026 met de komst van leagues en vrienden: "Gebruikersnamen gaan door een automatisch filter; je kunt een ongepaste naam in de ranglijst melden, en een vriend verwijderen en blokkeren." Hetzelfde beleid vermeldt dat het e-mailadres en het dagboek nooit aan andere spelers worden getoond. De context van de app lees je in de [casestudy van TradaZen](https://devoria.fr/nl/blog/tradazen-case-study-iphone-app-lanceren).

## Wat je Apple antwoordt na een 1.2-afwijzing

Vertel de reviewer waar hij elk mechanisme vindt, in je antwoord en in de review notes. Deze functies zitten in de app: de reviewer test de code in de build, dus plan een nieuwe build. De procedure om [App Review te beantwoorden](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/) is dezelfde als bij andere regels. Hier een Engelse template om aan te passen, waarbij je alleen houdt wat echt in je app zit:

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

Ontbreekt er een mechanisme in de build, dan is een antwoord niet genoeg. Net als bij [guideline 2.1](https://devoria.fr/nl/blog/guideline-2-1-app-store-afwijzing-oplossen) beoordeelt Apple de build die het in handen heeft.

## De 1.2-checklist vóór het insturen

- Je hebt alles op een rij gezet wat een gebruiker publiceert en anderen zien, gebruikersnamen inbegrepen.
- Je voorwaarden verbieden aanstootgevende content en misbruik, en de app vraagt om een expliciet "Ik ga akkoord".
- Het filter draait op de server, zoekt naar hele woorden en dekt de talen van je App Store-pagina.
- Elke content heeft een knop "Melden", en elke melding waarschuwt je meteen.
- Je kunt binnen 24 uur content verwijderen en de maker uitsluiten.
- Een gebruiker blokkeren haalt zijn content direct weg.
- Er staat een contactadres zichtbaar in de app, en de support-URL werkt.
- De vragenlijst voor de leeftijdsclassificatie vermeldt content van gebruikers, en berichten als je app die heeft.
- De review notes zeggen waar elk mechanisme te vinden is, met een demo-account.

## Je afwijzing oplossen voordat je de app opnieuw instuurt

Is je app net afgewezen op 1.2? De [Review Kit](https://devoria.fr/nl/kits/app-review) bundelt wat ik vóór elke inzending controleer, met twee skills die je project in Claude Code nalopen en je antwoord voorbereiden als Apple afwijst. Wil je een menselijke blik, [boek dan een uur met mij](https://devoria.fr/nl/coaching): we lezen het bericht samen en bekijken je moderatieflow. De complete aanpak na een afwijzing staat op de pagina [app afgewezen door Apple](https://devoria.fr/nl/expertise/app-afgewezen-door-apple).

Bereid je je eerste release voor? [Doe je gratis diagnose](https://devoria.fr/nl/diagnostic): die vertelt je welke stap je eerst moet aanpakken en stuurt je mijn checklist tegen Apple-afwijzingen.

Niemand kan garanderen dat Apple je app accepteert. Deze vijf mechanismen, goed zichtbaar, halen in elk geval deze reden van de lijst.

## Veelgestelde vragen

### Wat betekent "Guideline 1.2 - Safety - User-Generated Content"?

Dat is de titel van de afwijzing in het bericht van Apple. Het betekent dat je app content van gebruikers toont zonder alle verwachte beschermingen: filter, snel afgehandelde meldingen, blokkeren, gepubliceerd contact en geaccepteerde gebruiksvoorwaarden.

### Telt een gebruikersnaam in een ranglijst als content van gebruikers?

Apples tekst zegt het niet. Ik behandel hem wel zo, omdat een gebruikersnaam vrij gekozen wordt en door andere spelers wordt gezien. In TradaZen gaan de namen in de ranglijsten door een filter, kunnen ze worden gemeld en worden ze vervangen door een neutrale naam als er een probleem is.

### Moet je meldingen echt binnen 24 uur afhandelen?

Dat vraagt het afwijzingsbericht van Apple. De tekst van de regel spreekt van snelle reacties. Een automatisch filter is dus niet genoeg: er moet iemand zijn die de content verwijdert en de maker uitsluit. Automatisch verbergen na meerdere meldingen helpt je in de tussentijd.

### Moeten de gebruiksvoorwaarden in de app worden geaccepteerd?

Dat is de veiligste manier. Het afwijzingsbericht vraagt dat gebruikers voorwaarden accepteren die geen aanstootgevende content en geen misbruikende gebruikers tolereren. Een link onderaan een pagina bewijst geen akkoord. Een scherm met een knop "Ik ga akkoord", vóór de eerste publicatie, laat geen twijfel.

### Kan een anonieme chatapp door guideline 1.2 komen?

De huidige tekst noemt willekeurige of anonieme chat bij de toepassingen die niet in de App Store thuishoren. Een app die daar vooral voor dient, kan zonder waarschuwing worden verwijderd, zelfs met een filter, een meldfunctie en een blokkeerfunctie.


## Je project

[Review Kit](https://devoria.fr/nl/kits/app-review): Mijn App Store-reviewchecklist, mijn opgeloste afwijzingen door Apple, die voor Google Play en drie Claude Code-skills. € 49.

[iOS & Android Kit](https://devoria.fr/nl/kits/ios): Bouw je iPhone- en Android-app met Claude Code: de startcode van mijn apps, de route naar de stores en alle kits. € 99.

[Diagnose: wat staat er tussen jou en je iPhone-app](https://devoria.fr/nl/diagnostic): 7 vragen, 60 seconden: je weet wat je echt tegenhoudt om je iPhone-app te publiceren, je traject in 4 stappen en de kit die bij je past.
