Guideline 1.2 User-Generated Content: czego wymaga Apple
Autor: Mehdi Azizi
Opublikowano , 10 min
Guideline 1.2: jeśli użytkownicy coś publikują, potrzebujesz filtra, zgłaszania, blokowania, kontaktu i akceptacji regulaminu. Checklista Expo i Supabase.
Guideline 1.2 obowiązuje, gdy tylko użytkownicy publikują coś, co widzą inni: wiadomość, zdjęcie, opinię, a moim zdaniem nawet zwykły nick w rankingu. Tekst Apple wymaga wtedy filtra, zgłaszania z szybką reakcją, blokowania i opublikowanego kontaktu. Wiadomości o odrzuceniu dodają piąty wymóg: zaakceptowany regulamin, który nie toleruje ani obraźliwych treści, ani użytkowników nadużywających aplikacji.
Ten poradnik nie opisuje odrzucenia. Pokazuje, co wdrożyłem w TradaZen, mojej aplikacji do treningu tradingu, kiedy w jej rankingach zaczęły się pojawiać nicki wybrane przez graczy. Jeśli chcesz zobaczyć wszystkie powody odrzuceń, przeczytaj raczej dlaczego Apple odrzuca aplikację.
Co mówi guideline 1.2?
Punkt 1.2, „User-Generated Content”, znajduje się w sekcji 1, „Safety”, App Review Guidelines. Dotyczy aplikacji z treściami użytkowników lub z funkcją sieci społecznościowej. Żeby zapobiegać nadużyciom, takie aplikacje „must include” cztery zabezpieczenia:
- „A method for filtering objectionable material from being posted to the app”: filtr, który blokuje obraźliwe treści przed publikacją.
- „A mechanism to report offensive content and timely responses to concerns”: sposób na zgłoszenie treści i szybka reakcja na zgłoszenia.
- „The ability to block abusive users from the service”: możliwość zablokowania użytkownika, który nadużywa aplikacji.
- „Published contact information so users can easily reach you”: opublikowany kontakt, łatwy do znalezienia.
Obecna wersja tekstu, zaktualizowana 8 czerwca 2026, idzie dalej. Przypomina, że to ty odpowiadasz za usuwanie treści naruszających zasady, twój regulamin albo zasady społeczności. Jeśli Apple takie treści znajdzie, poprosi cię o ich usunięcie i o plan poprawy, a w międzyczasie może wycofać aplikację.
Tekst wymienia też aplikacje, którym nie ma miejsca w App Store: takie, które służą głównie do pornografii, losowego lub anonimowego czatu w stylu Chatroulette, oceniania wyglądu prawdziwych osób, gróźb lub nękania. W tych przypadkach cztery zabezpieczenia nie wystarczą. Punkt 1.2.1 dodaje zasady dla aplikacji twórców, m.in. weryfikację wieku dla treści, które wykraczają poza kategorię wiekową aplikacji.
Czy twoja aplikacja się w to wpisuje?
Dobrą definicję daje kwestionariusz kategorii wiekowej w App Store Connect. Mówi o treściach generowanych przez użytkowników, gdy treści tworzone przez użytkowników są szeroko udostępniane w aplikacji: filmy, zdjęcia, teksty albo audio. Wiadomości między użytkownikami traktuje osobno.
| Co widzą inni | Dotyczy? |
|---|---|
| Wiadomości między członkami | Tak |
| Publiczne zdjęcia lub opinie | Tak |
| Nick w rankingu | Moim zdaniem tak |
| Prywatne notatki | Nie |
| Treści napisane przez ciebie | Nie |
Apple nie wspomina o nickach. Mimo to traktuję je jak treści użytkowników: każdy może wybrać obraźliwy, a inni gracze go zobaczą. Taką decyzję podjąłem dla rankingów TradaZen.
5 mechanizmów do zakodowania, z Expo i Supabase
Wiadomość o odrzuceniu z powodu 1.2, którą jeden z developerów opublikował na forach Apple pod koniec 2025, wymienia oczekiwane działania. Zaczyna się od „Require that users agree to terms (EULA)”, a kończy wymogiem czasowym: reagować na zgłoszenia „within 24 hours”, usuwając treść i wykluczając jej autora.
| Mechanizm | Gdzie go zakodować |
|---|---|
| Zaakceptowany regulamin | Ekran i profil |
| Filtr | Serwer, przed wyświetleniem |
| Zgłaszanie | Przycisk i tabela |
| Blokowanie | Tabela i reguła dostępu |
| Opublikowany kontakt | Aplikacja i strona w App Store |
Poniższe przykłady SQL dostosuj do swojego schematu. Opierają się na regułach dostępu na poziomie wiersza w Supabase, które działają nawet wtedy, gdy ktoś obejdzie twoją aplikację.
1. Zaakceptowany regulamin, bez tolerancji dla nadużyć
Twój regulamin musi jasno mówić, że obraźliwe treści i użytkownicy nadużywający aplikacji nie są tolerowani. Przykładowa klauzula, do sprawdzenia przez prawnika, to nie porada prawna: „Treści obraźliwe, nienawistne, seksualne lub nękające nie są tolerowane. Zgłoszona treść może zostać usunięta, a jej autor wykluczony, bez uprzedzenia.”
Bierne zdanie pod przyciskiem rejestracji nie dowodzi zgody: wymagaj wyraźnego działania. Ekran z linkiem do regulaminu i przyciskiem „Akceptuję”, przed pierwszą publikacją. Zapisz datę i zaakceptowaną wersję w profilu, a potem blokuj publikowanie, dopóki ich brakuje:
create policy "publikowanie po akceptacji regulaminu" 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. Filtr, zanim inni zobaczą treść
Filtr działa na serwerze, bo kod aplikacji da się obejść. Kopia w aplikacji służy tylko do tego, żeby od razu ostrzec użytkownika.
W TradaZen funkcja w bazie sprawdza każdy nick, a aplikacja stosuje tę samą listę, żeby ostrzec gracza. Pilnuję, żeby obie były identyczne. Po stronie serwera obraźliwy nick nie jest odrzucany przy zapisie: przy wyświetlaniu zastępuje go neutralny nick, dzięki czemu nikt nie zostaje zablokowany przez fałszywy alarm.
Fałszywe alarmy pojawiają się szybko. W TradaZen pierwsza wersja filtra cenzurowała imiona takie jak Dominique, Monique czy Véronique, bo zawierają fragment wulgarnego słowa. Poprawka: szukać całych słów, a nie ich fragmentów. A skoro aplikacja jest sprzedawana po japońsku i po chińsku, filtr obejmuje też te języki.
3. Zgłoszenie obsłużone w ciągu 24 godzin
Każda opublikowana treść ma przycisk „Zgłoś”. W TradaZen nick zgłoszony w rankingu ligi od razu wyświetla się pod neutralną etykietą na telefonie osoby, która go zgłosiła. Zgłoszenie trafia potem na serwer, a jeśli telefon jest offline, zostaje wysłane później.
W bazie: tabela zgłoszeń, jedno zgłoszenie na osobę i treść:
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 "moje zgłoszenia" on public.reports
for insert to authenticated
with check (auth.uid() = reporter_id);
W TradaZen nick zgłoszony przez kilku graczy zostaje zastąpiony neutralnym nickiem, a zgłoszenia nigdy nie są pokazywane osobie zgłoszonej. Ogólna zasada ostrożności: identyfikator używany do zgłoszenia nie może być modyfikowalny przez autora treści, bo inaczej może on uniknąć ukrycia.
Automatyczne ukrywanie nie zastępuje twojej decyzji. Żeby zmieścić się w 24 godzinach, ustaw sobie powiadomienie przy każdym zgłoszeniu: webhook bazy danych Supabase może wywołać funkcję serwerową, która wyśle ci wiadomość. Klucz pozwalający usuwać treści zostaje na serwerze, co wyjaśniam w sekretny klucz API w aplikacji Expo.
4. Blokowanie, które działa natychmiast
Tabela blokad, a potem reguła dostępu, która usuwa treści zablokowanych osób z feedu osoby blokującej:
create policy "bez zablokowanych" 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
)
);
W TradaZen znajomego dodaje się za pomocą kodu, a potem można go usunąć i zablokować. Zablokowany znajomy znika z listy, nawet jeśli ponownie wyśle zaproszenie.
5. Opublikowany kontakt, łatwy do znalezienia
Umieść adres kontaktowy w ustawieniach aplikacji, a w App Store Connect podaj URL wsparcia, który naprawdę działa. W TradaZen adres wsparcia jest w polityce prywatności i w regulaminie. Co powinno się znaleźć na tych stronach, opisuję w polityka prywatności aplikacji.
Ostatnia rzecz: zdecyduj, co dzieje się z treściami osoby, która usuwa konto. Powyższe on delete cascade usuwa jej zgłoszenia razem z kontem. Pełny przepis znajdziesz w usuwanie konta w iOS.
Co TradaZen pokazuje w swojej polityce
Te mechanizmy są publicznie opisane w polityce prywatności TradaZen, uzupełnionej we wrześniu 2026 wraz z pojawieniem się lig i znajomych: „Nicki przechodzą przez automatyczny filtr; możesz zgłosić niestosowny nick w rankingu oraz usunąć i zablokować znajomego.” Ta sama polityka precyzuje, że e-mail i dziennik nigdy nie są pokazywane innym graczom. Kontekst aplikacji znajdziesz w studium przypadku TradaZen.
Co odpowiedzieć Apple po odrzuceniu z powodu 1.2
Powiedz recenzentowi, gdzie znaleźć każdy mechanizm, w odpowiedzi i w notatkach do recenzji. Te funkcje są w aplikacji: recenzent testuje kod zawarty w buildzie, więc przygotuj nowy build. Procedura odpowiadania App Review jest taka sama jak przy innych zasadach. Oto szablon po angielsku, do dostosowania, w którym zostawiasz tylko to, co jest prawdą w twojej aplikacji:
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,
Jeśli w buildzie brakuje jakiegoś mechanizmu, sama odpowiedź nie wystarczy. Tak jak przy guideline 2.1, Apple ocenia build, który ma w rękach.
Checklista 1.2 przed wysłaniem
- Spisałeś wszystko, co użytkownik publikuje, a widzą inni, łącznie z nickami.
- Twój regulamin zabrania obraźliwych treści i nadużyć, a aplikacja wymaga wyraźnego „Akceptuję”.
- Filtr działa na serwerze, szuka całych słów i obejmuje języki twojej strony w App Store.
- Każda treść ma przycisk „Zgłoś”, a każde zgłoszenie od razu cię powiadamia.
- Potrafisz usunąć treść i wykluczyć jej autora w mniej niż 24 godziny.
- Zablokowanie użytkownika natychmiast usuwa jego treści.
- Adres kontaktowy jest widoczny w aplikacji, a URL wsparcia działa.
- Kwestionariusz kategorii wiekowej deklaruje treści użytkowników, a także wiadomości, jeśli twoja aplikacja je ma.
- Notatki do recenzji mówią, gdzie znaleźć każdy mechanizm, i zawierają konto demo.
Napraw odrzucenie, zanim ponownie wyślesz aplikację
Jeśli twoja aplikacja właśnie została odrzucona z powodu 1.2, Review Kit zbiera wszystko, co sprawdzam przed każdym wysłaniem, z dwoma skillami, które przeglądają twój projekt w Claude Code i przygotowują odpowiedź, jeśli Apple odrzuci aplikację. Jeśli chcesz, żeby spojrzał na to człowiek, zarezerwuj ze mną godzinę: razem przeczytamy wiadomość i przejrzymy twój proces moderacji. Pełne postępowanie po odrzuceniu opisuję na stronie aplikacja odrzucona przez Apple.
Jeśli przygotowujesz swoje pierwsze wydanie, zrób darmową diagnozę: powie ci, od którego etapu zacząć, i wyśle ci moją checklistę przeciw odrzuceniom przez Apple.
Nikt nie zagwarantuje, że Apple zaakceptuje twoją aplikację. Te pięć dobrze widocznych mechanizmów skreśla z listy przynajmniej ten powód.
Najczęściej zadawane pytania
Co oznacza „Guideline 1.2 - Safety - User-Generated Content”?
To nagłówek odrzucenia w wiadomości od Apple. Oznacza, że twoja aplikacja wyświetla treści tworzone przez użytkowników bez wszystkich oczekiwanych zabezpieczeń: filtra, szybko obsługiwanych zgłoszeń, blokowania, opublikowanego kontaktu i zaakceptowanego regulaminu.
Czy nick w rankingu liczy się jako treść użytkownika?
Tekst Apple tego nie mówi. Ja traktuję go jako taką treść, bo nick jest wybierany swobodnie i widzą go inni gracze. W TradaZen nicki w rankingach przechodzą przez filtr, można je zgłosić i są zastępowane neutralnym nickiem, jeśli sprawiają problem.
Czy naprawdę trzeba obsługiwać zgłoszenia w ciągu 24 godzin?
Tego wymaga wiadomość o odrzuceniu od Apple. Tekst zasady mówi o szybkiej reakcji. Automatyczny filtr więc nie wystarczy: potrzebny jest ktoś, kto usunie treść i wykluczy jej autora. Automatyczne ukrywanie po kilku zgłoszeniach pomaga ci wytrzymać do tego czasu.
Czy regulamin musi być zaakceptowany w aplikacji?
To najbezpieczniejsze rozwiązanie. Wiadomość o odrzuceniu wymaga, żeby użytkownicy akceptowali warunki, które nie tolerują ani obraźliwych treści, ani użytkowników nadużywających aplikacji. Link na dole strony nie dowodzi zgody. Ekran z przyciskiem „Akceptuję” przed pierwszą publikacją nie zostawia wątpliwości.
Czy aplikacja z anonimowym czatem może przejść guideline 1.2?
Obecny tekst wymienia losowy lub anonimowy czat wśród zastosowań, którym nie ma miejsca w App Store. Aplikacja, która służy głównie do tego, może zostać wycofana bez uprzedzenia, nawet z filtrem, zgłaszaniem i blokowaniem.

