# Guideline 1.2 User-Generated Content: syarat dari Apple

> Guideline 1.2: kalau pengguna kamu bisa memposting, siapkan filter, laporan, blokir, kontak, dan syarat penggunaan yang disetujui. Checklist Expo dan Supabase.

Halaman asli: [Guideline 1.2 User-Generated Content: syarat dari Apple](https://devoria.fr/id/blog/guideline-1-2-user-generated-content-apple)
Penulis: [Mehdi Azizi](https://devoria.fr/id/mehdi-azizi)
Terbit: 2026-11-04
Revisi konten terakhir: 2026-11-04


Guideline 1.2 berlaku begitu pengguna memposting sesuatu yang bisa dilihat orang lain: pesan, foto, ulasan, dan menurut saya bahkan sekadar nama pengguna di papan peringkat. Teks Apple lalu mewajibkan filter, fitur laporan yang ditanggapi dengan cepat, fitur blokir, dan kontak yang dipublikasikan. **Pesan penolakan menambahkan syarat kelima: syarat penggunaan yang disetujui pengguna, yang tidak menoleransi konten tidak pantas maupun pengguna yang kasar.**

Panduan ini bukan cerita penolakan. Di sini saya tunjukkan apa yang saya pasang di TradaZen, app latihan trading saya, saat papan peringkatnya mulai menampilkan nama pengguna yang dipilih para pemain. Untuk gambaran umum alasan penolakan, baca saja [kenapa Apple menolak app](https://devoria.fr/id/blog/aplikasi-ditolak-apple-penyebab-solusi).

## Apa isi guideline 1.2?

Guideline 1.2, "User-Generated Content", ada di bagian 1, "Safety", dari [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#user-generated-content). Aturan ini menyasar app yang berisi konten dari pengguna atau layanan jejaring sosial. Untuk mencegah penyalahgunaan, app seperti ini "must include" empat perlindungan:

- "A method for filtering objectionable material from being posted to the app": **filter yang memblokir konten tidak pantas sebelum dipublikasikan**.
- "A mechanism to report offensive content and timely responses to concerns": cara untuk melaporkan konten, dan tanggapan cepat atas laporan.
- "The ability to block abusive users from the service": kemampuan memblokir pengguna yang kasar.
- "Published contact information so users can easily reach you": kontak yang dipublikasikan dan mudah ditemukan.

Versi teks saat ini, yang diperbarui pada 8 Juni 2026, melangkah lebih jauh. Teks itu mengingatkan bahwa kamu bertanggung jawab menghapus konten yang melanggar aturan, syarat penggunaan, atau pedoman komunitas kamu. Kalau Apple menemukannya, Apple akan memintamu menghapusnya dan memberikan rencana perbaikan, dan bisa menurunkan app kamu sambil menunggu.

Teks itu juga menyebut app yang tidak punya tempat di App Store: app yang terutama dipakai untuk pornografi, chat acak atau anonim ala Chatroulette, menilai penampilan fisik orang sungguhan, ancaman, atau perundungan. **Untuk penggunaan seperti ini, empat perlindungan tadi tidak cukup.** Guideline 1.2.1 menambahkan aturan untuk app kreator, terutama pemeriksaan usia untuk konten yang melebihi rating usia app.

## Apakah app kamu terkena aturan ini?

Kuesioner rating usia di App Store Connect memberi definisi yang bagus. Kuesioner itu menyebut [konten buatan pengguna](https://developer.apple.com/help/app-store-connect/reference/app-information/age-ratings-values-and-definitions) saat konten yang dibuat pengguna disebarkan secara luas di dalam app: video, foto, teks, atau audio. Pesan antarpengguna diperlakukan terpisah.

| Yang dilihat orang lain          | Terkena?         |
| -------------------------------- | ---------------- |
| Pesan antaranggota               | Ya               |
| Foto atau ulasan publik          | Ya               |
| Nama pengguna di papan peringkat | Ya, menurut saya |
| Catatan pribadi                  | Tidak            |
| Konten yang kamu tulis sendiri   | Tidak            |

Apple tidak menyebut nama pengguna. Tapi saya tetap memperlakukannya sebagai konten pengguna: siapa pun bisa memilih nama yang menghina, dan pemain lain akan melihatnya. Itulah pilihan yang saya ambil untuk papan peringkat TradaZen.

## 5 mekanisme yang perlu kamu buat, dengan Expo dan Supabase

Pesan penolakan 1.2, seperti yang dipublikasikan seorang developer di [forum Apple](https://developer.apple.com/forums/thread/807358) akhir 2025, mencantumkan langkah-langkah yang diharapkan. Pesan itu dimulai dengan "Require that users agree to terms (EULA)" dan diakhiri dengan syarat tenggat: menindaklanjuti laporan "within 24 hours", dengan menghapus konten dan mengeluarkan pembuatnya.

| Mekanisme                   | Di mana membuatnya          |
| --------------------------- | --------------------------- |
| Syarat penggunaan disetujui | Layar dan profil            |
| Filter                      | Server, sebelum ditampilkan |
| Laporan                     | Tombol dan tabel            |
| Blokir                      | Tabel dan aturan akses      |
| Kontak dipublikasikan       | App dan halaman App Store   |

Contoh SQL di bawah perlu kamu sesuaikan dengan skema kamu. Contoh ini memakai [aturan akses per baris Supabase](https://supabase.com/docs/guides/database/postgres/row-level-security), yang tetap berlaku meskipun seseorang mengakali app kamu.

### 1. Syarat penggunaan yang disetujui, tanpa toleransi untuk penyalahgunaan

Syarat penggunaan kamu harus menyatakan dengan jelas bahwa konten tidak pantas maupun pengguna yang kasar tidak ditoleransi. Contoh klausul, minta orang lain mengeceknya, ini bukan nasihat hukum: "Konten yang menyinggung, bernada kebencian, seksual, atau melecehkan tidak ditoleransi. Konten yang dilaporkan bisa dihapus dan pembuatnya dikeluarkan, tanpa pemberitahuan."

**Kalimat pasif di bawah tombol pendaftaran tidak membuktikan persetujuan: minta tindakan yang eksplisit.** Satu layar dengan tautan ke syarat penggunaan dan tombol "Saya setuju", sebelum postingan pertama. Simpan tanggal dan versi yang disetujui di profil, lalu larang posting selama data itu belum ada:

```sql
create policy "posting setelah menyetujui syarat" 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. Filter sebelum orang lain melihat konten

Filter berjalan di server, karena kode app bisa diakali. Salinannya di app hanya berguna untuk langsung memberi tahu pengguna.

Di TradaZen, sebuah fungsi di database memeriksa setiap nama pengguna, dan app menerapkan daftar yang sama untuk memberi tahu pemain. Saya menjaga keduanya tetap identik. Di sisi server, nama pengguna yang menyinggung tidak ditolak saat disimpan: **nama itu diganti dengan nama netral saat ditampilkan, supaya tidak ada orang yang terblokir gara-gara false positive**.

False positive cepat muncul. Di TradaZen, versi pertama filter menyensor nama seperti Dominique, Monique, atau Véronique, karena nama-nama itu mengandung potongan kata kasar. Perbaikannya: cari kata utuh, bukan potongan kata. Dan karena app ini dijual dalam bahasa Jepang dan Mandarin, filternya juga mencakup bahasa-bahasa itu.

### 3. Laporan yang ditangani dalam 24 jam

Setiap konten yang dipublikasikan punya tombol "Laporkan". Di TradaZen, nama pengguna yang dilaporkan di papan peringkat liga langsung tampil dengan label netral di ponsel orang yang melapor. Laporan itu lalu dikirim ke server, dan dikirim ulang nanti kalau ponselnya sedang offline.

Di sisi database, satu tabel laporan, satu laporan per orang per konten:

```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 "laporan saya" on public.reports
for insert to authenticated
with check (auth.uid() = reporter_id);
```

Di TradaZen, **nama pengguna yang dilaporkan oleh beberapa pemain diganti dengan nama netral**, dan laporan tidak pernah ditunjukkan kepada orang yang dilaporkan. Satu tindakan pencegahan umum: ID yang dipakai untuk laporan tidak boleh bisa diubah oleh pembuat konten, karena kalau bisa, dia bisa lolos dari penyembunyian.

Penyembunyian otomatis tidak menggantikan keputusan kamu. Supaya bisa memenuhi batas 24 jam, pastikan kamu diberi tahu setiap ada laporan: [webhook database Supabase](https://supabase.com/docs/guides/database/webhooks) bisa memanggil fungsi server yang mengirimimu pesan. Kunci untuk menghapus konten tetap berada di server, seperti yang saya jelaskan di [kunci API rahasia di app Expo](https://devoria.fr/id/blog/kunci-api-rahasia-aplikasi-expo).

### 4. Blokir yang langsung berlaku

Satu tabel blokir, lalu satu aturan akses yang menghapus konten orang yang diblokir dari feed orang yang memblokir:

```sql
create policy "tanpa yang diblokir" 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
  )
);
```

Di TradaZen, kamu menambahkan teman lewat kode, dan bisa menghapus serta memblokirnya. **Teman yang diblokir hilang dari daftar, meskipun dia mengirim permintaan lagi.**

### 5. Kontak yang dipublikasikan dan mudah ditemukan

Cantumkan alamat kontak di pengaturan app, dan URL dukungan yang benar-benar aktif di App Store Connect. Di TradaZen, alamat dukungan tercantum di kebijakan privasi dan di syarat penggunaan. Isi yang diharapkan dari halaman-halaman ini ada di [kebijakan privasi aplikasi](https://devoria.fr/id/blog/kebijakan-privasi-aplikasi-ios-app-store).

Poin terakhir: tentukan nasib konten milik orang yang menghapus akunnya. `on delete cascade` di atas menghapus laporannya bersama akunnya. Panduan lengkapnya ada di [penghapusan akun iOS](https://devoria.fr/id/blog/hapus-akun-app-ios-alur-tes-sebelum-apple).

## Yang ditampilkan TradaZen di kebijakannya

Mekanisme ini dijelaskan secara publik di kebijakan privasi TradaZen, yang dilengkapi pada September 2026 saat fitur liga dan teman hadir: "Nama pengguna melewati filter otomatis; kamu bisa melaporkan nama pengguna yang tidak pantas di papan peringkat, serta menghapus dan memblokir teman." Kebijakan yang sama menegaskan bahwa e-mail dan jurnal tidak pernah ditunjukkan kepada pemain lain. Konteks app-nya ada di [studi kasus TradaZen](https://devoria.fr/id/blog/studi-kasus-tradazen-meluncurkan-aplikasi-iphone).

## Cara membalas Apple setelah penolakan 1.2

Beri tahu reviewer di mana menemukan setiap mekanisme, di balasan kamu dan di catatan review. Fitur-fitur ini ada di dalam app: reviewer menguji kode yang ada di build, jadi siapkan build baru. Prosedur untuk [membalas App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/) sama dengan aturan lainnya. Ini template dalam bahasa Inggris, sesuaikan, dan pertahankan hanya yang benar-benar ada di app kamu:

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

Kalau ada mekanisme yang belum ada di build, balasan saja tidak akan cukup. Sama seperti [guideline 2.1](https://devoria.fr/id/blog/guideline-2-1-app-store-penolakan), Apple menilai build yang ada di tangannya.

## Checklist 1.2 sebelum mengirim

- Kamu sudah mendata semua yang dipublikasikan pengguna dan bisa dilihat orang lain, termasuk nama pengguna.
- Syarat penggunaan kamu melarang konten tidak pantas dan penyalahgunaan, dan app meminta "Saya setuju" secara eksplisit.
- Filter berjalan di server, mencari kata utuh, dan mencakup bahasa-bahasa di halaman app kamu.
- Setiap konten punya tombol "Laporkan", dan setiap laporan langsung memberi tahu kamu.
- Kamu tahu cara menghapus konten dan mengeluarkan pembuatnya dalam waktu kurang dari 24 jam.
- Memblokir pengguna langsung menghapus kontennya.
- Alamat kontak terlihat di app, dan URL dukungan aktif.
- Kuesioner rating usia mencantumkan konten pengguna, dan fitur pesan kalau app kamu punya.
- Catatan review menjelaskan di mana menemukan setiap mekanisme, dengan akun demo.

## Perbaiki penolakan sebelum mengirim ulang app

Kalau app kamu baru saja ditolak karena 1.2, [Review Kit](https://devoria.fr/id/kits/app-review) mengumpulkan semua yang saya periksa sebelum setiap pengiriman, dengan dua skill yang memeriksa proyek kamu di Claude Code dan menyiapkan balasan kalau Apple menolak. Kalau butuh pendapat manusia, [pesan satu jam bersama saya](https://devoria.fr/id/coaching): kita baca pesannya bersama dan cek alur moderasi kamu. Langkah lengkap setelah penolakan ada di halaman [aplikasi ditolak Apple](https://devoria.fr/id/expertise/aplikasi-ditolak-apple).

Kalau kamu sedang menyiapkan rilis pertama, [ikuti diagnostik gratis](https://devoria.fr/id/diagnostic): diagnostik ini memberi tahu langkah mana yang perlu kamu kerjakan dulu dan mengirimimu checklist anti-penolakan Apple saya.

Tidak ada yang bisa menjamin Apple akan menerima app kamu. Lima mekanisme ini, kalau terlihat jelas, setidaknya mencoret alasan penolakan yang satu ini dari daftar.

## Pertanyaan umum

### Apa arti "Guideline 1.2 - Safety - User-Generated Content"?

Itu judul penolakan di pesan Apple. Artinya app kamu menampilkan konten buatan pengguna tanpa semua perlindungan yang diharapkan: filter, laporan yang ditangani cepat, blokir, kontak yang dipublikasikan, dan syarat penggunaan yang disetujui.

### Apakah nama pengguna di papan peringkat termasuk konten pengguna?

Teks Apple tidak menyebutnya. Saya memperlakukannya begitu, karena nama pengguna dipilih bebas dan dilihat pemain lain. Di TradaZen, nama pengguna di papan peringkat melewati filter, bisa dilaporkan, dan diganti dengan nama netral kalau bermasalah.

### Apakah laporan benar-benar harus ditangani dalam 24 jam?

Itulah yang diminta pesan penolakan Apple. Teks aturannya menyebut tanggapan cepat. Jadi filter otomatis saja tidak cukup: harus ada orang yang menghapus konten dan mengeluarkan pembuatnya. Penyembunyian otomatis setelah beberapa laporan membantumu bertahan sambil menunggu.

### Apakah syarat penggunaan harus disetujui di dalam app?

Itu cara paling aman. Pesan penolakan meminta pengguna menyetujui syarat yang tidak menoleransi konten tidak pantas maupun pengguna yang kasar. Tautan di bagian bawah halaman tidak membuktikan persetujuan. Satu layar dengan tombol "Saya setuju", sebelum postingan pertama, tidak menyisakan keraguan.

### Apakah app chat anonim bisa lolos guideline 1.2?

Teks saat ini menyebut chat acak atau anonim sebagai salah satu penggunaan yang tidak punya tempat di App Store. App yang terutama dipakai untuk itu bisa diturunkan tanpa pemberitahuan, meskipun punya filter, laporan, dan blokir.


## Proyekmu

[Review Kit](https://devoria.fr/id/kits/app-review): Checklist review App Store saya, penolakan Apple yang sudah saya perbaiki, checklist Google Play, dan tiga skill Claude Code. Rp 999.000.

[iOS & Android Kit](https://devoria.fr/id/kits/ios): Bikin app iPhone dan Android kamu dengan Claude Code: kode awal dari app-app saya, langkah demi langkah sampai ke store, dan semua kit. Rp 1.999.000.

[Diagnosis: apa yang memisahkanmu dari app iPhone-mu](https://devoria.fr/id/diagnostic): 7 pertanyaan, 60 detik: kamu tahu apa yang benar-benar menghambatmu merilis app iPhone, jalurmu dalam 4 tahap, dan kit yang cocok untukmu.
