Guideline 1.2 User-Generated Content: Apples krav
Af Mehdi Azizi
Udgivet , 10 min.
Guideline 1.2: Hvis dine brugere udgiver indhold, skal du have filter, rapportering, blokering, kontakt og accepterede vilkår. Tjekliste til Expo og Supabase.
Guideline 1.2 gælder, så snart brugere udgiver noget, som andre kan se: en besked, et foto, en anmeldelse og efter min mening også bare et brugernavn på en rangliste. Apples tekst kræver så et filter, rapportering med hurtig opfølgning, blokering og en offentlig kontaktmulighed. Afvisningsbeskederne tilføjer et femte krav: accepterede brugsvilkår, der hverken tolererer stødende indhold eller krænkende brugere.
Denne guide handler ikke om en afvisning. Den viser, hvad jeg byggede ind i TradaZen, min app til at øve trading, da ranglisterne begyndte at vise brugernavne, som spillerne selv havde valgt. Vil du have overblikket over afvisningsgrundene, så læs hellere hvorfor Apple afviser en app.
Hvad siger guideline 1.2?
1.2, "User-Generated Content", står i afsnit 1, "Safety", i App Review Guidelines. Den gælder apps med brugerindhold eller en social netværkstjeneste. For at forhindre misbrug "must include" de apps fire beskyttelser:
- "A method for filtering objectionable material from being posted to the app": et filter, der blokerer stødende indhold, før det bliver udgivet.
- "A mechanism to report offensive content and timely responses to concerns": en måde at rapportere indhold på og et hurtigt svar på rapporteringerne.
- "The ability to block abusive users from the service": muligheden for at blokere en krænkende bruger.
- "Published contact information so users can easily reach you": en offentlig kontaktmulighed, der er nem at finde.
Den nuværende version af teksten, opdateret den 8. juni 2026, går længere. Den minder om, at det er dit ansvar at fjerne indhold, der bryder reglen, dine brugsvilkår eller dine community-regler. Finder Apple sådan noget, beder de dig fjerne det og levere en forbedringsplan, og de kan fjerne appen i mellemtiden.
Teksten nævner også apps, der ikke hører hjemme i App Store: dem, der primært bruges til pornografi, tilfældig eller anonym chat à la Chatroulette, til at bedømme rigtige menneskers udseende, til trusler eller chikane. Til de formål er de fire beskyttelser ikke nok. 1.2.1 tilføjer regler for creator-apps, blandt andet aldersverifikation for indhold, der ligger over appens aldersklassificering.
Er din app omfattet?
Spørgeskemaet til aldersklassificering i App Store Connect giver en god definition. Det taler om brugergenereret indhold, når indhold skabt af brugere bliver bredt delt i appen: video, fotos, tekst eller lyd. Beskeder mellem brugere behandles for sig.
| Hvad andre ser | Omfattet? |
|---|---|
| Beskeder mellem medlemmer | Ja |
| Offentlige fotos eller anmeldelser | Ja |
| Brugernavn på en rangliste | Ja, efter min mening |
| Private noter | Nej |
| Indhold skrevet af dig | Nej |
Apple nævner ikke brugernavne. Alligevel behandler jeg dem som brugerindhold: Enhver kan vælge et fornærmende navn, og andre spillere ser det. Det er det valg, jeg traf for ranglisterne i TradaZen.
De 5 mekanismer, du skal kode, med Expo og Supabase
Afvisningsbeskeden for 1.2, som en udvikler offentliggjorde den på Apples forummer i slutningen af 2025, oplister de forventede tiltag. Den starter med "Require that users agree to terms (EULA)" og slutter med et tidskrav: at handle på rapporteringer "within 24 hours" ved at fjerne indholdet og udelukke afsenderen.
| Mekanisme | Hvor den skal kodes |
|---|---|
| Accepterede vilkår | Skærm og profil |
| Filter | Server, før visning |
| Rapportering | Knap og tabel |
| Blokering | Tabel og adgangsregel |
| Offentlig kontakt | App og App Store-side |
SQL-eksemplerne nedenfor skal tilpasses dit skema. De bygger på Supabases række-baserede adgangsregler, som gælder, selv hvis nogen går uden om din app.
1. Accepterede vilkår uden tolerance for misbrug
Dine brugsvilkår skal sige klart og tydeligt, at hverken stødende indhold eller krænkende brugere tolereres. Eksempel på en klausul, som du skal have læst igennem, og som ikke er juridisk rådgivning: "Krænkende, hadefuldt, seksuelt eller chikanerende indhold tolereres ikke. Rapporteret indhold kan fjernes og afsenderen udelukkes uden varsel."
En passiv sætning under en tilmeldingsknap beviser ikke samtykke: kræv en aktiv handling. En skærm med et link til vilkårene og en "Jeg accepterer"-knap før første opslag. Gem dato og accepteret version i profilen, og forbyd udgivelse, så længe de mangler:
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. Et filter, før andre ser indholdet
Filteret ligger på serveren, fordi appens kode kan omgås. En kopi i appen bruges kun til at advare brugeren med det samme.
I TradaZen tjekker en databasefunktion hvert brugernavn, og appen bruger den samme liste til at advare spilleren. Jeg holder de to identiske. På serveren bliver et stødende brugernavn ikke afvist ved skrivning: det erstattes af et neutralt navn ved visning, så ingen bliver blokeret på grund af en falsk positiv.
Falske positiver kommer hurtigt. I TradaZen censurerede en første version af filteret franske fornavne som Dominique, Monique og Véronique, fordi de indeholder en bid af et groft ord. Løsningen: søg efter hele ord, ikke dele af ord. Og da appen sælges på japansk og kinesisk, dækker filteret også de sprog.
3. Rapportering, behandlet inden for 24 timer
Alt udgivet indhold har en "Rapportér"-knap. I TradaZen vises et rapporteret brugernavn på ligaens rangliste straks med en neutral betegnelse på telefonen hos den, der rapporterer. Rapporteringen sendes derefter til serveren og sendes igen senere, hvis telefonen er offline.
I databasen: en tabel med rapporteringer, kun én pr. person pr. indhold:
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);
I TradaZen bliver et brugernavn, som flere spillere har rapporteret, erstattet af et neutralt navn, og rapporteringerne vises aldrig for den rapporterede person. En generel forholdsregel: Det id, der bruges til rapporteringen, må ikke kunne ændres af den, der har lavet indholdet, ellers kan vedkommende slippe uden om skjulningen.
Automatisk skjulning erstatter ikke din beslutning. For at overholde de 24 timer skal du have besked ved hver rapportering: en Supabase database-webhook kan kalde en serverfunktion, der sender dig en besked. Nøglen, der kan fjerne indholdet, bliver på serveren, som jeg forklarer i hemmelig API-nøgle i en Expo-app.
4. Blokering, der virker med det samme
En tabel med blokeringer og derefter en adgangsregel, der fjerner blokerede personers indhold fra feedet hos den, der blokerer:
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
)
);
I TradaZen tilføjer man en ven med en kode, og man kan fjerne og blokere vennen. En blokeret ven forsvinder fra listen, også selvom vedkommende sender en ny anmodning.
5. Offentlig kontakt, der er nem at finde
Sæt en kontaktadresse i appens indstillinger og en support-URL, der faktisk virker, i App Store Connect. I TradaZen står supportadressen i privatlivspolitikken og i brugsvilkårene. Hvad de sider skal indeholde, finder du i privatlivspolitik til en app.
Sidste punkt: Beslut, hvad der sker med indholdet fra en person, der sletter sin konto. on delete cascade ovenfor sletter vedkommendes rapporteringer sammen med kontoen. Hele opskriften står i sletning af konto på iOS.
Hvad TradaZen skriver i sin politik
De her mekanismer er beskrevet offentligt i TradaZens privatlivspolitik, som blev udvidet i september 2026, da ligaer og venner kom til: "Brugernavne går gennem et automatisk filter; du kan rapportere et upassende brugernavn på ranglisten og fjerne og blokere en ven." Samme politik præciserer, at e-mail og journal aldrig vises for andre spillere. Baggrunden for appen står i casestudiet om TradaZen.
Hvad du skal svare Apple efter en 1.2-afvisning
Fortæl revieweren, hvor hver mekanisme findes, både i dit svar og i review-noterne. Funktionerne lever i appen: Revieweren tester koden i buildet, så regn med et nyt build. Fremgangsmåden for at svare App Review er den samme som for de andre regler. Her er en skabelon på engelsk, som du skal tilpasse, og hvor du kun beholder det, der er sandt i din 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,
Mangler en mekanisme i buildet, er et svar ikke nok. Ligesom med guideline 2.1 bedømmer Apple det build, de har i hænderne.
Tjeklisten til 1.2 før indsendelse
- Du har listet alt, hvad en bruger udgiver, og som andre ser, også brugernavne.
- Dine vilkår forbyder stødende indhold og misbrug, og appen kræver et aktivt "Jeg accepterer".
- Filteret kører på serveren, søger efter hele ord og dækker sprogene på din App Store-side.
- Alt indhold har en "Rapportér"-knap, og hver rapportering giver dig besked med det samme.
- Du kan fjerne indhold og udelukke afsenderen på under 24 timer.
- Blokering af en bruger fjerner vedkommendes indhold med det samme.
- En kontaktadresse er synlig i appen, og support-URL'en virker.
- Spørgeskemaet til aldersklassificering angiver brugerindhold og beskeder, hvis din app har det.
- Review-noterne fortæller, hvor hver mekanisme findes, sammen med en demokonto.
Ret din afvisning, før du sender appen igen
Er din app lige blevet afvist under 1.2, samler Review Kit det, jeg tjekker før hver indsendelse, med to skills, der gennemgår dit projekt i Claude Code og forbereder dit svar, hvis Apple afviser. Vil du have et menneskeligt blik, så book en time med mig: Vi læser beskeden sammen og kigger på dit moderationsflow. Hele fremgangsmåden efter en afvisning står på siden app afvist af Apple.
Forbereder du din første udgivelse, så tag din gratis diagnose: Den fortæller dig, hvilket trin du skal tage fat på først, og sender dig min tjekliste mod afvisninger fra Apple.
Ingen kan garantere, at Apple godkender din app. Men de fem mekanismer, tydeligt synlige, fjerner i det mindste den her afvisningsgrund fra listen.
Ofte stillede spørgsmål
Hvad betyder "Guideline 1.2 - Safety - User-Generated Content"?
Det er overskriften på afvisningen i Apples besked. Den betyder, at din app viser indhold skabt af brugere uden alle de forventede beskyttelser: filter, hurtigt behandlet rapportering, blokering, offentlig kontakt og accepterede brugsvilkår.
Tæller et brugernavn på en rangliste som brugerindhold?
Det siger Apples tekst ikke. Jeg behandler det som brugerindhold, fordi et brugernavn vælges frit og ses af andre spillere. I TradaZen går brugernavnene på ranglisterne gennem et filter, kan rapporteres og erstattes af et neutralt navn, hvis de er et problem.
Skal rapporteringer virkelig behandles inden for 24 timer?
Det er, hvad Apples afvisningsbesked kræver. Selve reglen taler om hurtige svar. Et automatisk filter er altså ikke nok: Der skal være nogen, der fjerner indholdet og udelukker afsenderen. Automatisk skjulning efter flere rapporteringer hjælper dig med at holde fristen i mellemtiden.
Skal brugsvilkårene accepteres i appen?
Det er den sikreste måde. Afvisningsbeskeden kræver, at brugerne accepterer vilkår, der hverken tolererer stødende indhold eller krænkende brugere. Et link nederst på en side beviser ikke samtykke. En skærm med en "Jeg accepterer"-knap før første opslag efterlader ingen tvivl.
Kan en app til anonym chat komme igennem guideline 1.2?
Den nuværende tekst nævner tilfældig eller anonym chat blandt de formål, der ikke hører hjemme i App Store. En app, der primært bruges til det, kan fjernes uden varsel, selv med filter, rapportering og blokering.

