Guideline 1.2 User-Generated Content: สิ่งที่ Apple กำหนด
โดย Mehdi Azizi
เผยแพร่เมื่อ , 10 นาที
Guideline 1.2: ถ้าผู้ใช้โพสต์เนื้อหาได้ แอปต้องมีตัวกรอง การรายงาน การบล็อก ช่องทางติดต่อ และข้อกำหนดที่ผู้ใช้กดยอมรับ พร้อมเช็กลิสต์ Expo และ Supabase
Guideline 1.2 มีผลทันทีที่ผู้ใช้โพสต์อะไรก็ตามที่คนอื่นมองเห็นได้ ไม่ว่าจะเป็นข้อความ รูปภาพ รีวิว หรือในความเห็นผม แค่ชื่อเล่นในตารางอันดับก็นับด้วย ข้อความของ Apple กำหนดให้มีตัวกรอง การรายงานที่ตามด้วยการตอบสนองอย่างรวดเร็ว การบล็อก และช่องทางติดต่อที่เผยแพร่ไว้ ส่วนข้อความแจ้งปฏิเสธจะเพิ่มข้อกำหนดข้อที่ห้า: ข้อกำหนดการใช้งานที่ผู้ใช้กดยอมรับ ซึ่งไม่ยอมให้มีทั้งเนื้อหาที่ไม่เหมาะสมและผู้ใช้ที่ก่อกวน
คู่มือนี้ไม่ได้เล่าเรื่องการโดนปฏิเสธ แต่จะแสดงสิ่งที่ผมทำไว้ใน TradaZen แอปฝึกเทรดของผม ตอนที่ตารางอันดับเริ่มแสดงชื่อเล่นที่ผู้เล่นตั้งเอง ถ้าอยากเห็นภาพรวมของเหตุผลที่โดนปฏิเสธ ลองอ่าน ทำไม Apple ถึงปฏิเสธแอป
Guideline 1.2 พูดถึงอะไร?
ข้อ 1.2 "User-Generated Content" อยู่ในหมวด 1 "Safety" ของ App Review Guidelines ครอบคลุมแอปที่มีเนื้อหาจากผู้ใช้หรือบริการแบบโซเชียลเน็ตเวิร์ก เพื่อป้องกันการใช้งานในทางที่ผิด แอปเหล่านี้ "must include" การป้องกันสี่อย่าง:
- "A method for filtering objectionable material from being posted to the app": ตัวกรองที่บล็อกเนื้อหาไม่เหมาะสมก่อนถูกเผยแพร่
- "A mechanism to report offensive content and timely responses to concerns": วิธีรายงานเนื้อหา และการตอบสนองต่อการรายงานอย่างรวดเร็ว
- "The ability to block abusive users from the service": ความสามารถในการบล็อกผู้ใช้ที่ก่อกวน
- "Published contact information so users can easily reach you": ช่องทางติดต่อที่เผยแพร่ไว้และหาได้ง่าย
ข้อความเวอร์ชันปัจจุบันซึ่งอัปเดตเมื่อวันที่ 8 มิถุนายน 2026 ไปไกลกว่านั้น โดยย้ำว่าคุณมีหน้าที่ลบเนื้อหาที่ละเมิดกฎ ข้อกำหนดการใช้งาน หรือกฎของชุมชนของคุณเอง ถ้า Apple เจอเนื้อหาแบบนี้ จะขอให้คุณลบออกและส่งแผนการปรับปรุง และอาจถอดแอปออกระหว่างรอได้
ข้อความยังระบุแอปที่ไม่มีที่ยืนบน App Store ไว้ด้วย ได้แก่แอปที่ใช้เป็นหลักเพื่อสื่อลามก แชตสุ่มหรือแชตนิรนามแบบ Chatroulette การให้คะแนนรูปร่างหน้าตาของคนจริง การข่มขู่ หรือการกลั่นแกล้ง สำหรับการใช้งานเหล่านี้ การป้องกันสี่อย่างไม่เพียงพอ ส่วนข้อ 1.2.1 เพิ่มกฎสำหรับแอปของครีเอเตอร์ โดยเฉพาะการตรวจสอบอายุสำหรับเนื้อหาที่เกินระดับอายุของแอป
แอปของคุณเข้าข่ายไหม?
แบบสอบถามระดับอายุใน App Store Connect ให้คำนิยามที่ดีไว้ โดยจะเรียกว่า เนื้อหาที่ผู้ใช้สร้างขึ้น เมื่อเนื้อหาที่ผู้ใช้สร้างถูกเผยแพร่อย่างกว้างขวางในแอป ทั้งวิดีโอ รูปภาพ ข้อความ หรือเสียง และแยกการส่งข้อความระหว่างผู้ใช้ไว้อีกหัวข้อหนึ่ง
| สิ่งที่คนอื่นมองเห็น | เข้าข่ายไหม? |
|---|---|
| ข้อความระหว่างสมาชิก | ใช่ |
| รูปภาพหรือรีวิวสาธารณะ | ใช่ |
| ชื่อเล่นในตารางอันดับ | ใช่ ในความเห็นผม |
| โน้ตส่วนตัว | ไม่ |
| เนื้อหาที่คุณเขียนเอง | ไม่ |
Apple ไม่ได้พูดถึงชื่อเล่นเลย แต่ผมก็ถือว่ามันเป็นเนื้อหาจากผู้ใช้ เพราะใครก็ตั้งชื่อหยาบคายได้ และผู้เล่นคนอื่นก็มองเห็น นี่คือสิ่งที่ผมเลือกทำกับตารางอันดับของ TradaZen
กลไก 5 อย่างที่ต้องเขียนโค้ด ด้วย Expo และ Supabase
ข้อความปฏิเสธ 1.2 ที่นักพัฒนาคนหนึ่งโพสต์ไว้ใน ฟอรัมของ Apple ช่วงปลายปี 2025 ระบุมาตรการที่คาดหวังไว้ เริ่มด้วย "Require that users agree to terms (EULA)" และปิดท้ายด้วยข้อกำหนดเรื่องเวลา: จัดการรายงาน "within 24 hours" โดยลบเนื้อหาและแบนผู้โพสต์
| กลไก | เขียนโค้ดตรงไหน |
|---|---|
| ข้อกำหนดที่กดยอมรับ | หน้าจอและโปรไฟล์ |
| ตัวกรอง | เซิร์ฟเวอร์ ก่อนแสดงผล |
| การรายงาน | ปุ่มและตาราง |
| การบล็อก | ตารางและกฎการเข้าถึง |
| ช่องทางติดต่อ | แอปและหน้าแอปบน App Store |
ตัวอย่าง SQL ด้านล่างต้องปรับให้เข้ากับ schema ของคุณ โดยอิงกับ กฎการเข้าถึงระดับแถวของ Supabase ซึ่งมีผลแม้มีคนเลี่ยงไม่ผ่านแอปของคุณก็ตาม
1. ข้อกำหนดที่กดยอมรับ และไม่ยอมให้มีการก่อกวน
ข้อกำหนดการใช้งานต้องเขียนไว้ชัดเจนว่าไม่ยอมให้มีเนื้อหาไม่เหมาะสมหรือผู้ใช้ที่ก่อกวน ตัวอย่างข้อความ (ควรให้คนตรวจทาน นี่ไม่ใช่คำแนะนำทางกฎหมาย): "ไม่อนุญาตเนื้อหาที่หยาบคาย สร้างความเกลียดชัง มีเนื้อหาทางเพศ หรือกลั่นแกล้งผู้อื่น เนื้อหาที่ถูกรายงานอาจถูกลบและผู้โพสต์อาจถูกแบนโดยไม่ต้องแจ้งล่วงหน้า"
ประโยคเฉยๆ ใต้ปุ่มสมัครสมาชิกไม่ได้พิสูจน์ว่าผู้ใช้ยอมรับ ต้องให้ผู้ใช้กดยืนยันอย่างชัดเจน ทำหน้าจอที่มีลิงก์ไปยังข้อกำหนดและปุ่ม "ยอมรับ" ก่อนการโพสต์ครั้งแรก บันทึกวันที่และเวอร์ชันที่ยอมรับไว้ในโปรไฟล์ แล้วห้ามโพสต์ถ้ายังไม่มีข้อมูลนี้:
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. ตัวกรองก่อนที่คนอื่นจะเห็นเนื้อหา
ตัวกรองต้องอยู่บนเซิร์ฟเวอร์ เพราะโค้ดในแอปถูกเลี่ยงได้ สำเนาในแอปมีไว้แค่เตือนผู้ใช้ทันทีเท่านั้น
ใน TradaZen มีฟังก์ชันในฐานข้อมูลที่ตรวจชื่อเล่นทุกชื่อ และแอปก็ใช้รายการคำเดียวกันเพื่อเตือนผู้เล่น ผมคอยดูให้สองฝั่งตรงกันเสมอ ฝั่งเซิร์ฟเวอร์จะไม่ปฏิเสธชื่อเล่นที่หยาบคายตอนบันทึก แต่ จะแทนด้วยชื่อกลางๆ ตอนแสดงผล ซึ่งช่วยไม่ให้ใครโดนบล็อกเพราะผลบวกลวง
ผลบวกลวงเกิดขึ้นเร็วมาก ใน TradaZen ตัวกรองเวอร์ชันแรกเซ็นเซอร์ชื่ออย่าง Dominique, Monique หรือ Véronique เพราะมีคำหยาบบางส่วนอยู่ในชื่อ วิธีแก้คือค้นหาเป็นคำทั้งคำ ไม่ใช่ส่วนของคำ และเนื่องจากแอปขายในภาษาญี่ปุ่นและจีนด้วย ตัวกรองจึงครอบคลุมภาษาเหล่านี้ด้วย
3. การรายงาน ที่จัดการภายใน 24 ชั่วโมง
เนื้อหาทุกชิ้นที่เผยแพร่มีปุ่ม "รายงาน" ใน TradaZen ชื่อเล่นที่ถูกรายงานในตารางอันดับของลีกจะแสดงเป็นข้อความกลางๆ ทันทีบนมือถือของคนที่รายงาน จากนั้นการรายงานจะถูกส่งไปที่เซิร์ฟเวอร์ และจะส่งซ้ำภายหลังถ้ามือถือออฟไลน์อยู่
ฝั่งฐานข้อมูล ใช้ตารางการรายงาน หนึ่งรายงานต่อหนึ่งคนต่อหนึ่งเนื้อหา:
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);
ใน TradaZen ชื่อเล่นที่ถูกรายงานโดยผู้เล่นหลายคนจะถูกแทนด้วยชื่อกลางๆ และจะไม่แสดงการรายงานให้คนที่ถูกรายงานเห็นเลย ข้อควรระวังทั่วไป: ตัวระบุที่ใช้ในการรายงานต้องไม่ให้เจ้าของเนื้อหาแก้ไขได้ ไม่อย่างนั้นเขาอาจหลบการซ่อนได้
การซ่อนอัตโนมัติไม่ได้มาแทนการตัดสินใจของคุณ เพื่อให้ทันภายใน 24 ชั่วโมง ให้ระบบแจ้งเตือนคุณทุกครั้งที่มีการรายงาน webhook ฐานข้อมูลของ Supabase เรียกฟังก์ชันฝั่งเซิร์ฟเวอร์ที่ส่งข้อความหาคุณได้ คีย์ที่ใช้ลบเนื้อหาต้องอยู่บนเซิร์ฟเวอร์ ตามที่ผมอธิบายไว้ใน คีย์ API ลับในแอป Expo
4. การบล็อกที่มีผลทันที
ใช้ตารางการบล็อก แล้วเพิ่มกฎการเข้าถึงที่เอาเนื้อหาของคนที่ถูกบล็อกออกจากฟีดของคนที่บล็อก:
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
)
);
ใน TradaZen เพิ่มเพื่อนได้ด้วยรหัส และลบหรือบล็อกเพื่อนได้ เพื่อนที่ถูกบล็อกจะหายไปจากรายการ แม้จะส่งคำขอมาใหม่ก็ตาม
5. ช่องทางติดต่อที่เผยแพร่ไว้และหาได้ง่าย
ใส่อีเมลติดต่อไว้ในหน้าตั้งค่าของแอป และใส่ URL ฝ่ายช่วยเหลือที่ตอบกลับจริงใน App Store Connect ใน TradaZen อีเมลฝ่ายซัพพอร์ตอยู่ในนโยบายความเป็นส่วนตัวและข้อกำหนดการใช้งาน เนื้อหาที่หน้าเหล่านี้ควรมีอยู่ใน นโยบายความเป็นส่วนตัวของแอป
เรื่องสุดท้าย: ตัดสินใจว่าเนื้อหาของคนที่ลบบัญชีจะเป็นอย่างไร on delete cascade ข้างบนจะลบการรายงานของเขาไปพร้อมกับบัญชี วิธีทำแบบครบถ้วนอยู่ใน การลบบัญชีบน iOS
สิ่งที่ TradaZen เขียนไว้ในนโยบาย
กลไกเหล่านี้อธิบายไว้อย่างเปิดเผยในนโยบายความเป็นส่วนตัวของ TradaZen ซึ่งเพิ่มเติมเมื่อเดือนกันยายน 2026 ตอนที่มีลีกและเพื่อนเข้ามา: "ชื่อเล่นจะผ่านตัวกรองอัตโนมัติ คุณรายงานชื่อเล่นที่ไม่เหมาะสมในตารางอันดับได้ และลบหรือบล็อกเพื่อนได้" นโยบายเดียวกันยังระบุว่าอีเมลและบันทึกการเทรดจะไม่แสดงให้ผู้เล่นคนอื่นเห็นเด็ดขาด ภูมิหลังของแอปอยู่ใน กรณีศึกษา TradaZen
ตอบ Apple อย่างไรหลังโดนปฏิเสธข้อ 1.2
บอกผู้ตรวจว่ากลไกแต่ละอย่างอยู่ตรงไหน ทั้งในคำตอบและใน review notes ฟังก์ชันเหล่านี้อยู่ในแอป ผู้ตรวจทดสอบโค้ดที่อยู่ใน build ดังนั้นต้องเตรียม build ใหม่ด้วย ขั้นตอนการ ตอบกลับ App Review เหมือนกับกฎข้ออื่น นี่คือตัวอย่างภาษาอังกฤษ ปรับใช้ได้ โดยเก็บไว้เฉพาะสิ่งที่มีจริงในแอปของคุณ:
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,
ถ้า build ยังขาดกลไกไหนอยู่ แค่ตอบกลับไม่พอ เช่นเดียวกับ guideline 2.1 Apple ตัดสินจาก build ที่อยู่ในมือเขา
เช็กลิสต์ 1.2 ก่อนส่ง
- คุณลิสต์ทุกอย่างที่ผู้ใช้โพสต์และคนอื่นมองเห็นแล้ว รวมถึงชื่อเล่น
- ข้อกำหนดการใช้งานห้ามเนื้อหาไม่เหมาะสมและการก่อกวน และแอปขอให้กด "ยอมรับ" อย่างชัดเจน
- ตัวกรองทำงานบนเซิร์ฟเวอร์ ค้นหาเป็นคำทั้งคำ และครอบคลุมภาษาในหน้าแอปของคุณ
- เนื้อหาทุกชิ้นมีปุ่ม "รายงาน" และทุกการรายงานแจ้งเตือนคุณทันที
- คุณลบเนื้อหาและแบนผู้โพสต์ได้ภายใน 24 ชั่วโมง
- การบล็อกผู้ใช้ทำให้เนื้อหาของเขาหายไปทันที
- มีอีเมลติดต่อแสดงในแอป และ URL ฝ่ายช่วยเหลือตอบกลับจริง
- แบบสอบถามระดับอายุระบุว่ามีเนื้อหาจากผู้ใช้ และมีการส่งข้อความถ้าแอปของคุณมี
- Review notes บอกว่ากลไกแต่ละอย่างอยู่ตรงไหน พร้อมบัญชีทดลอง
แก้ปัญหาการโดนปฏิเสธก่อนส่งแอปใหม่
ถ้าแอปของคุณเพิ่งโดนปฏิเสธข้อ 1.2 Review Kit รวบรวมสิ่งที่ผมตรวจก่อนส่งทุกครั้ง พร้อม skill สองตัวที่อ่านโปรเจกต์ของคุณใน Claude Code และเตรียมคำตอบให้ถ้า Apple ปฏิเสธ ถ้าอยากให้คนช่วยดู จองเวลาหนึ่งชั่วโมงกับผม เราจะอ่านข้อความด้วยกันและดูระบบดูแลเนื้อหาของคุณ ขั้นตอนทั้งหมดหลังโดนปฏิเสธอยู่ในหน้า แอปโดน Apple ปฏิเสธ
ถ้าคุณกำลังเตรียมปล่อยแอปแรก ทำแบบประเมินฟรี ระบบจะบอกว่าควรเริ่มขั้นตอนไหนก่อน และส่งเช็กลิสต์กันโดน Apple ปฏิเสธของผมให้คุณ
ไม่มีใครรับประกันได้ว่า Apple จะอนุมัติแอปของคุณ แต่กลไกทั้งห้าอย่างนี้ที่มองเห็นได้ชัด อย่างน้อยก็ตัดเหตุผลข้อนี้ออกไปจากรายการได้
คำถามที่พบบ่อย
"Guideline 1.2 - Safety - User-Generated Content" หมายความว่าอะไร?
นี่คือหัวข้อการปฏิเสธในข้อความจาก Apple หมายความว่าแอปของคุณแสดงเนื้อหาที่ผู้ใช้สร้างขึ้นโดยไม่มีการป้องกันครบตามที่กำหนด ได้แก่ ตัวกรอง การรายงานที่จัดการอย่างรวดเร็ว การบล็อก ช่องทางติดต่อที่เผยแพร่ไว้ และข้อกำหนดการใช้งานที่ผู้ใช้กดยอมรับ
ชื่อเล่นในตารางอันดับนับเป็นเนื้อหาจากผู้ใช้ไหม?
ข้อความของ Apple ไม่ได้บอกไว้ ผมถือว่านับ เพราะชื่อเล่นตั้งได้อิสระและผู้เล่นคนอื่นมองเห็น ใน TradaZen ชื่อเล่นในตารางอันดับจะผ่านตัวกรอง ถูกรายงานได้ และถูกแทนด้วยชื่อกลางๆ ถ้ามีปัญหา
ต้องจัดการการรายงานภายใน 24 ชั่วโมงจริงไหม?
นั่นคือสิ่งที่ข้อความปฏิเสธของ Apple ขอ ส่วนข้อความของกฎพูดถึงการตอบสนองอย่างรวดเร็ว ตัวกรองอัตโนมัติจึงไม่พอ ต้องมีคนลบเนื้อหาและแบนผู้โพสต์ การซ่อนอัตโนมัติหลังถูกรายงานหลายครั้งช่วยให้คุณรับมือได้ระหว่างรอ
ข้อกำหนดการใช้งานต้องให้กดยอมรับในแอปไหม?
เป็นวิธีที่ปลอดภัยที่สุด ข้อความปฏิเสธขอให้ผู้ใช้ยอมรับข้อกำหนดที่ไม่ยอมให้มีทั้งเนื้อหาไม่เหมาะสมและผู้ใช้ที่ก่อกวน ลิงก์ท้ายหน้าไม่ได้พิสูจน์ว่าผู้ใช้ยอมรับ หน้าจอที่มีปุ่ม "ยอมรับ" ก่อนการโพสต์ครั้งแรกจะไม่เหลือข้อสงสัย
แอปแชตนิรนามผ่าน guideline 1.2 ได้ไหม?
ข้อความปัจจุบันระบุว่าแชตสุ่มหรือแชตนิรนามเป็นหนึ่งในการใช้งานที่ไม่มีที่ยืนบน App Store แอปที่ใช้เพื่อสิ่งนี้เป็นหลักอาจถูกถอดออกโดยไม่แจ้งล่วงหน้า แม้จะมีตัวกรอง การรายงาน และการบล็อกก็ตาม

