Guideline 1.2 User-Generated Content: apa yang Apple mahu
Oleh Mehdi Azizi
Diterbitkan pada , 10 min
Guideline 1.2: jika pengguna anda menyiarkan kandungan, sediakan penapis, laporan, sekatan, hubungan dan terma yang diterima. Senarai semak Expo dan Supabase.
Guideline 1.2 terpakai sebaik sahaja pengguna menyiarkan sesuatu yang dilihat oleh orang lain: mesej, foto, ulasan, dan pada pendapat saya, sekadar nama samaran dalam papan kedudukan. Teks Apple kemudian mewajibkan penapis, cara melapor yang disusuli respons pantas, sekatan dan maklumat hubungan yang diterbitkan. Mesej penolakan menambah syarat kelima: terma penggunaan yang diterima, yang tidak bertolak ansur dengan kandungan menjengkelkan atau pengguna yang menyalahgunakan.
Panduan ini bukan kisah penolakan. Ia menunjukkan apa yang saya bina dalam TradaZen, app latihan trading saya, apabila papan kedudukannya mula memaparkan nama samaran yang dipilih oleh pemain. Untuk gambaran keseluruhan sebab penolakan, baca kenapa Apple menolak app.
Apa kata guideline 1.2?
Guideline 1.2, "User-Generated Content", terletak dalam seksyen 1, "Safety", dalam App Review Guidelines. Ia ditujukan kepada app yang mempunyai kandungan pengguna atau perkhidmatan rangkaian sosial. Untuk mengelakkan penyalahgunaan, app ini "must include" empat perlindungan:
- "A method for filtering objectionable material from being posted to the app": penapis yang menyekat kandungan menjengkelkan sebelum ia disiarkan.
- "A mechanism to report offensive content and timely responses to concerns": cara untuk melaporkan kandungan, dan respons pantas terhadap laporan.
- "The ability to block abusive users from the service": keupayaan untuk menyekat pengguna yang menyalahgunakan.
- "Published contact information so users can easily reach you": maklumat hubungan yang diterbitkan dan mudah dicari.
Versi semasa teks ini, dikemas kini pada 8 Jun 2026, pergi lebih jauh. Ia mengingatkan bahawa menjadi tanggungjawab anda untuk membuang kandungan yang melanggar peraturan, terma penggunaan anda atau garis panduan komuniti anda. Jika Apple menjumpainya, Apple akan meminta anda membuangnya dan menyediakan pelan penambahbaikan, dan boleh menarik balik app sementara menunggu.
Teks itu juga menyenaraikan app yang tidak sesuai berada di App Store: app yang terutamanya untuk pornografi, chat rawak atau tanpa nama ala Chatroulette, menilai rupa fizikal orang sebenar, ugutan atau gangguan. Untuk kegunaan ini, empat perlindungan itu tidak mencukupi. Guideline 1.2.1 menambah peraturan untuk app pencipta kandungan, terutamanya kawalan umur bagi kandungan yang melebihi klasifikasi umur app.
Adakah app anda terlibat?
Soal selidik klasifikasi umur dalam App Store Connect memberi definisi yang baik. Ia menyebut kandungan yang dijana pengguna apabila kandungan ciptaan pengguna disebarkan secara meluas dalam app: video, foto, teks atau audio. Mesej antara pengguna dikendalikan secara berasingan.
| Apa yang dilihat orang lain | Terlibat? |
|---|---|
| Mesej antara ahli | Ya |
| Foto atau ulasan awam | Ya |
| Nama samaran dalam papan kedudukan | Ya, pada pendapat saya |
| Nota peribadi | Tidak |
| Kandungan yang anda tulis sendiri | Tidak |
Apple tidak menyebut nama samaran. Namun saya menganggapnya sebagai kandungan pengguna: sesiapa sahaja boleh memilih nama yang menghina, dan pemain lain melihatnya. Itulah pilihan saya untuk papan kedudukan TradaZen.
5 mekanisme yang perlu dikod, dengan Expo dan Supabase
Mesej penolakan 1.2, seperti yang diterbitkan seorang pembangun di forum Apple pada akhir 2025, menyenaraikan langkah yang dijangka. Ia bermula dengan "Require that users agree to terms (EULA)" dan berakhir dengan syarat masa: bertindak atas laporan "within 24 hours", dengan membuang kandungan dan mengusir penulisnya.
| Mekanisme | Di mana dikod |
|---|---|
| Terma diterima | Skrin dan profil |
| Penapis | Pelayan, sebelum dipaparkan |
| Laporan | Butang dan jadual |
| Sekatan | Jadual dan peraturan akses |
| Hubungan diterbitkan | App dan halaman App Store |
Contoh SQL di bawah perlu disesuaikan dengan skema anda. Ia bergantung pada peraturan akses mengikut baris Supabase, yang tetap terpakai walaupun seseorang memintas app anda.
1. Terma yang diterima, tanpa toleransi untuk penyalahgunaan
Terma penggunaan anda mesti menyatakan dengan jelas bahawa tiada kandungan menjengkelkan atau pengguna yang menyalahgunakan akan diterima. Contoh klausa, untuk disemak, bukan nasihat undang-undang: "Tiada kandungan yang menyinggung, berunsur kebencian, seksual atau mengganggu dibenarkan. Kandungan yang dilaporkan boleh dibuang dan penulisnya diusir, tanpa notis."
Satu ayat pasif di bawah butang pendaftaran tidak membuktikan persetujuan: minta tindakan yang jelas. Satu skrin dengan pautan ke terma dan butang "Saya setuju", sebelum siaran pertama. Simpan tarikh dan versi yang diterima dalam profil, kemudian larang siaran selagi maklumat itu tiada:
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. Penapis sebelum orang lain melihat kandungan
Penapis berada di pelayan, kerana kod app boleh dipintas. Salinan dalam app hanya berguna untuk memberi amaran segera kepada pengguna.
Dalam TradaZen, satu fungsi dalam pangkalan data menyemak setiap nama samaran, dan app menggunakan senarai yang sama untuk memberi amaran kepada pemain. Saya pastikan kedua-duanya sama. Di pelayan, nama samaran yang menyinggung tidak ditolak semasa ditulis: ia digantikan dengan nama samaran neutral semasa dipaparkan, supaya tiada sesiapa disekat kerana positif palsu.
Positif palsu muncul dengan cepat. Dalam TradaZen, versi pertama penapis menapis nama seperti Dominique, Monique atau Véronique, kerana nama itu mengandungi sebahagian perkataan kesat. Penyelesaiannya: cari perkataan penuh, bukan sebahagian perkataan. Dan kerana app ini dijual dalam bahasa Jepun dan Cina, penapis juga meliputi bahasa-bahasa itu.
3. Laporan, diproses dalam masa 24 jam
Setiap kandungan yang disiarkan mempunyai butang "Laporkan". Dalam TradaZen, nama samaran yang dilaporkan dalam papan kedudukan liga terus dipaparkan dengan label neutral pada telefon orang yang melapor. Laporan itu kemudian dihantar ke pelayan, dan dihantar semula kemudian jika telefon berada di luar talian.
Di pangkalan data, satu jadual laporan, satu laporan sahaja bagi setiap orang dan setiap kandungan:
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);
Dalam TradaZen, nama samaran yang dilaporkan oleh beberapa pemain digantikan dengan nama samaran neutral, dan laporan tidak pernah ditunjukkan kepada orang yang dilaporkan. Satu langkah berjaga-jaga umum: pengecam yang digunakan untuk laporan tidak boleh diubah oleh penulis kandungan, jika tidak dia boleh terlepas daripada penyembunyian.
Penyembunyian automatik tidak menggantikan keputusan anda. Untuk mematuhi had 24 jam, pastikan anda dimaklumkan bagi setiap laporan: webhook pangkalan data Supabase boleh memanggil fungsi pelayan yang menghantar mesej kepada anda. Kunci yang membolehkan kandungan dibuang kekal di pelayan, seperti yang saya terangkan dalam kunci API rahsia dalam app Expo.
4. Sekatan yang berkuat kuasa serta-merta
Satu jadual sekatan, kemudian peraturan akses yang membuang kandungan orang yang disekat daripada suapan orang yang menyekat:
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
)
);
Dalam TradaZen, anda menambah rakan melalui kod, dan boleh membuang serta menyekatnya. Rakan yang disekat hilang daripada senarai, walaupun dia menghantar permintaan semula.
5. Maklumat hubungan yang diterbitkan dan mudah dicari
Letakkan alamat hubungan dalam tetapan app, dan URL sokongan yang benar-benar berfungsi dalam App Store Connect. Dalam TradaZen, alamat sokongan terdapat dalam dasar privasi dan dalam terma penggunaan. Kandungan yang dijangka untuk halaman ini ada dalam dasar privasi aplikasi.
Perkara terakhir: tentukan apa yang berlaku kepada kandungan seseorang yang memadam akaunnya. on delete cascade di atas memadam laporannya bersama akaunnya. Resipi lengkap ada dalam pemadaman akaun iOS.
Apa yang dipaparkan TradaZen dalam dasarnya
Mekanisme ini diterangkan secara terbuka dalam dasar privasi TradaZen, yang dilengkapkan pada September 2026 dengan kemunculan liga dan rakan: "Nama samaran melalui penapis automatik; anda boleh melaporkan nama samaran yang tidak sesuai dalam papan kedudukan, dan membuang serta menyekat rakan." Dasar yang sama menyatakan bahawa e-mel dan jurnal tidak pernah ditunjukkan kepada pemain lain. Konteks app ini ada dalam kajian kes TradaZen.
Apa nak balas kepada Apple selepas penolakan 1.2
Beritahu reviewer di mana untuk mencari setiap mekanisme, dalam balasan anda dan dalam nota semakan. Fungsi ini berada dalam app: reviewer menguji kod yang dibenamkan dalam build, jadi sediakan build baharu. Prosedur untuk membalas App Review sama seperti untuk peraturan lain. Berikut ialah templat dalam bahasa Inggeris, untuk disesuaikan, dengan hanya mengekalkan apa yang benar dalam app anda:
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,
Jika satu mekanisme tiada dalam build, balasan sahaja tidak akan mencukupi. Sama seperti guideline 2.1, Apple menilai build yang ada di tangannya.
Senarai semak 1.2 sebelum penghantaran
- Anda telah menyenaraikan semua yang disiarkan pengguna dan dilihat orang lain, termasuk nama samaran.
- Terma anda melarang kandungan menjengkelkan dan penyalahgunaan, dan app meminta "Saya setuju" yang jelas.
- Penapis berjalan di pelayan, mencari perkataan penuh dan meliputi bahasa halaman App Store anda.
- Setiap kandungan ada butang "Laporkan", dan setiap laporan memaklumkan anda serta-merta.
- Anda tahu cara membuang kandungan dan mengusir penulisnya dalam masa kurang daripada 24 jam.
- Menyekat pengguna membuang kandungannya serta-merta.
- Alamat hubungan kelihatan dalam app, dan URL sokongan berfungsi.
- Soal selidik klasifikasi umur mengisytiharkan kandungan pengguna, dan mesej jika app anda ada fungsi itu.
- Nota semakan menyatakan di mana untuk mencari setiap mekanisme, bersama akaun demo.
Betulkan penolakan anda sebelum menghantar semula app
Jika app anda baru ditolak di bawah 1.2, Review Kit mengumpulkan apa yang saya semak sebelum setiap penghantaran, dengan dua skill yang menyemak projek anda dalam Claude Code dan menyediakan balasan anda jika Apple menolak. Untuk pandangan manusia, tempah satu jam bersama saya: kita baca mesej itu bersama dan lihat aliran moderasi anda. Langkah lengkap selepas penolakan ada di halaman aplikasi ditolak oleh Apple.
Jika anda sedang menyediakan pelancaran pertama, buat diagnostik percuma anda: ia memberitahu anda langkah mana yang perlu ditangani dahulu dan menghantar senarai semak anti-penolakan Apple saya.
Tiada sesiapa boleh menjamin Apple akan menerima app anda. Lima mekanisme ini, jika jelas kelihatan, sekurang-kurangnya membuang sebab penolakan ini daripada senarai.
Soalan lazim
Apa maksud "Guideline 1.2 - Safety - User-Generated Content"?
Itulah tajuk penolakan dalam mesej Apple. Ia bermaksud app anda memaparkan kandungan ciptaan pengguna tanpa semua perlindungan yang dijangka: penapis, laporan yang diproses dengan pantas, sekatan, maklumat hubungan yang diterbitkan dan terma penggunaan yang diterima.
Adakah nama samaran dalam papan kedudukan dikira sebagai kandungan pengguna?
Teks Apple tidak menyatakannya. Saya menganggapnya begitu, kerana nama samaran dipilih secara bebas dan dilihat oleh pemain lain. Dalam TradaZen, nama samaran dalam papan kedudukan melalui penapis, boleh dilaporkan dan digantikan dengan nama samaran neutral jika bermasalah.
Perlukah laporan benar-benar diproses dalam masa 24 jam?
Itulah yang diminta oleh mesej penolakan Apple. Teks peraturan menyebut respons yang pantas. Jadi penapis automatik tidak mencukupi: perlu ada seseorang yang membuang kandungan dan mengusir penulisnya. Penyembunyian automatik selepas beberapa laporan membantu anda bertahan sementara menunggu.
Perlukah terma penggunaan diterima dalam app?
Itulah cara paling selamat. Mesej penolakan meminta pengguna menerima terma yang tidak bertolak ansur dengan kandungan menjengkelkan atau pengguna yang menyalahgunakan. Pautan di bahagian bawah halaman tidak membuktikan persetujuan. Skrin dengan butang "Saya setuju", sebelum siaran pertama, tidak meninggalkan keraguan.
Bolehkah app chat tanpa nama lulus guideline 1.2?
Teks semasa menyebut chat rawak atau tanpa nama antara kegunaan yang tidak sesuai berada di App Store. App yang terutamanya untuk tujuan itu boleh ditarik balik tanpa notis, walaupun ada penapis, laporan dan sekatan.

