# Guideline 1.2 User-Generated Content: Apple yêu cầu gì

> Guideline 1.2: nếu người dùng đăng nội dung, bạn cần bộ lọc, báo cáo, chặn, liên hệ và điều khoản được chấp nhận. Check-list Expo và Supabase.

Trang gốc: [Guideline 1.2 User-Generated Content: Apple yêu cầu gì](https://devoria.fr/vi/blog/guideline-1-2-user-generated-content-apple)
Tác giả: [Mehdi Azizi](https://devoria.fr/vi/mehdi-azizi)
Ngày đăng: 2026-11-04
Lần sửa nội dung gần nhất: 2026-11-04


Guideline 1.2 áp dụng ngay khi người dùng đăng thứ gì đó mà người khác nhìn thấy: một tin nhắn, một bức ảnh, một đánh giá, và theo mình, cả một nickname đơn giản trong bảng xếp hạng. Khi đó, văn bản của Apple yêu cầu một bộ lọc, một cơ chế báo cáo kèm phản hồi nhanh, một cơ chế chặn và một thông tin liên hệ công khai. **Các thông báo từ chối còn thêm yêu cầu thứ năm: điều khoản sử dụng được người dùng chấp nhận, không dung thứ nội dung phản cảm hay người dùng lạm dụng.**

Bài này không kể lại một lần bị từ chối. Nó cho bạn thấy những gì mình đã làm trong TradaZen, app luyện tập trading của mình, khi bảng xếp hạng bắt đầu hiển thị nickname do người chơi tự chọn. Nếu muốn xem tổng quan các lý do bị từ chối, hãy đọc [vì sao Apple từ chối app](https://devoria.fr/vi/blog/apple-tu-choi-app-5-ly-do-thuc-te).

## Guideline 1.2 nói gì?

Guideline 1.2, "User-Generated Content", nằm trong phần 1, "Safety", của [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#user-generated-content). Nó nhắm vào các app có nội dung do người dùng tạo hoặc có dịch vụ mạng xã hội. Để tránh lạm dụng, các app này "must include" bốn biện pháp bảo vệ:

- "A method for filtering objectionable material from being posted to the app": **một bộ lọc chặn nội dung phản cảm trước khi nó được đăng**.
- "A mechanism to report offensive content and timely responses to concerns": một cách để báo cáo nội dung, và phản hồi nhanh các báo cáo.
- "The ability to block abusive users from the service": khả năng chặn người dùng lạm dụng.
- "Published contact information so users can easily reach you": thông tin liên hệ công khai, dễ tìm.

Phiên bản hiện tại của văn bản, cập nhật ngày 8 tháng 6 năm 2026, còn đi xa hơn. Nó nhắc rằng bạn có trách nhiệm gỡ bỏ nội dung vi phạm quy định, điều khoản sử dụng hoặc quy tắc cộng đồng của bạn. Nếu Apple phát hiện nội dung như vậy, họ sẽ yêu cầu bạn gỡ nó và đưa ra kế hoạch cải thiện, và có thể gỡ app trong lúc chờ.

Văn bản cũng liệt kê những app không có chỗ trên App Store: những app chủ yếu dùng cho nội dung khiêu dâm, chat ngẫu nhiên hoặc ẩn danh kiểu Chatroulette, chấm điểm ngoại hình người thật, đe dọa hoặc quấy rối. **Với những mục đích này, bốn biện pháp bảo vệ là không đủ.** Guideline 1.2.1 bổ sung quy định cho các app dành cho creator, đặc biệt là kiểm soát độ tuổi với nội dung vượt quá mức phân loại của app.

## App của bạn có bị áp dụng không?

Bảng câu hỏi phân loại độ tuổi của App Store Connect đưa ra một định nghĩa khá tốt. Nó nói về [nội dung do người dùng tạo](https://developer.apple.com/help/app-store-connect/reference/app-information/age-ratings-values-and-definitions) khi nội dung người dùng tạo ra được phát tán rộng trong app: video, ảnh, văn bản hoặc âm thanh. Nhắn tin giữa người dùng được xét riêng.

| Người khác nhìn thấy gì      | Bị áp dụng?   |
| ---------------------------- | ------------- |
| Tin nhắn giữa các thành viên | Có            |
| Ảnh hoặc đánh giá công khai  | Có            |
| Nickname trong bảng xếp hạng | Có, theo mình |
| Ghi chú riêng tư             | Không         |
| Nội dung do chính bạn viết   | Không         |

Apple không nhắc đến nickname. Nhưng mình vẫn coi chúng là nội dung người dùng: ai cũng có thể chọn một cái tên xúc phạm, và người chơi khác sẽ nhìn thấy. Đó là lựa chọn mình đã làm cho bảng xếp hạng của TradaZen.

## 5 cơ chế cần code, với Expo và Supabase

Thông báo từ chối 1.2, như một developer đã đăng trên [diễn đàn của Apple](https://developer.apple.com/forums/thread/807358) cuối năm 2025, liệt kê các biện pháp được kỳ vọng. Nó bắt đầu bằng "Require that users agree to terms (EULA)" và kết thúc bằng một yêu cầu về thời hạn: xử lý báo cáo "within 24 hours", bằng cách gỡ nội dung và loại tác giả của nó.

| Cơ chế                    | Code ở đâu                 |
| ------------------------- | -------------------------- |
| Điều khoản được chấp nhận | Màn hình và hồ sơ          |
| Bộ lọc                    | Server, trước khi hiển thị |
| Báo cáo                   | Nút và bảng                |
| Chặn                      | Bảng và quy tắc truy cập   |
| Liên hệ công khai         | App và trang App Store     |

Các ví dụ SQL bên dưới cần được điều chỉnh theo schema của bạn. Chúng dựa trên [quy tắc truy cập theo dòng của Supabase](https://supabase.com/docs/guides/database/postgres/row-level-security), vẫn có hiệu lực kể cả khi ai đó vượt qua app của bạn.

### 1. Điều khoản được chấp nhận, không dung thứ lạm dụng

Điều khoản sử dụng của bạn phải ghi rõ ràng rằng không dung thứ bất kỳ nội dung phản cảm hay người dùng lạm dụng nào. Ví dụ một điều khoản, cần nhờ người xem lại, không phải tư vấn pháp lý: "Không dung thứ nội dung xúc phạm, thù ghét, tình dục hoặc quấy rối. Nội dung bị báo cáo có thể bị gỡ và tác giả bị loại, không cần báo trước."

**Một câu bị động dưới nút đăng ký không chứng minh được sự đồng ý: hãy yêu cầu một hành động rõ ràng.** Một màn hình có link đến điều khoản và nút "Tôi đồng ý", trước lần đăng đầu tiên. Lưu ngày và phiên bản đã chấp nhận vào hồ sơ, rồi cấm đăng bài khi còn thiếu:

```sql
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. Một bộ lọc trước khi người khác thấy nội dung

Bộ lọc nằm trên server, vì code trong app có thể bị vượt qua. Một bản sao trong app chỉ dùng để báo cho người dùng ngay lập tức.

Trong TradaZen, một hàm trong database kiểm tra từng nickname, và app áp dụng cùng danh sách đó để báo cho người chơi. Mình giữ hai bên giống hệt nhau. Phía server, một nickname xúc phạm không bị từ chối khi ghi: **nó được thay bằng một nickname trung tính khi hiển thị, nhờ vậy không chặn nhầm ai đó vì một kết quả dương tính giả**.

Dương tính giả xuất hiện rất nhanh. Trong TradaZen, phiên bản đầu của bộ lọc đã kiểm duyệt nhầm các tên như Dominique, Monique hay Véronique, vì chúng chứa một mảnh của từ tục tĩu. Cách sửa: tìm theo từ nguyên vẹn, không tìm theo mảnh từ. Và vì app được bán bằng tiếng Nhật và tiếng Trung, bộ lọc cũng bao phủ các ngôn ngữ này.

### 3. Báo cáo, xử lý trong 24 giờ

Mỗi nội dung được đăng đều có một nút "Báo cáo". Trong TradaZen, một nickname bị báo cáo trong bảng xếp hạng của giải đấu sẽ ngay lập tức hiển thị dưới một nhãn trung tính, trên điện thoại của người báo cáo. Sau đó báo cáo được gửi lên server, và sẽ được gửi lại sau nếu điện thoại đang offline.

Phía database, một bảng báo cáo, mỗi người chỉ báo cáo một lần cho mỗi nội dung:

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

Trong TradaZen, **một nickname bị nhiều người chơi báo cáo sẽ được thay bằng một nickname trung tính**, và các báo cáo không bao giờ được hiển thị cho người bị báo cáo. Một lưu ý chung: tác giả nội dung không được phép sửa định danh dùng để báo cáo, nếu không họ có thể thoát khỏi việc bị ẩn.

Việc ẩn tự động không thay thế quyết định của bạn. Để giữ được mốc 24 giờ, hãy cho mình được báo mỗi khi có báo cáo: một [webhook database của Supabase](https://supabase.com/docs/guides/database/webhooks) có thể gọi một hàm server gửi tin nhắn cho bạn. Key cho phép gỡ nội dung phải nằm trên server, như mình giải thích trong [API key bí mật trong app Expo](https://devoria.fr/vi/blog/khoa-api-bi-mat-app-expo).

### 4. Chặn có hiệu lực ngay lập tức

Một bảng chặn, rồi một quy tắc truy cập loại nội dung của những người bị chặn khỏi feed của người chặn:

```sql
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
  )
);
```

Trong TradaZen, bạn thêm bạn bè bằng một mã, và có thể xóa và chặn họ. **Một người bạn bị chặn sẽ biến mất khỏi danh sách, kể cả khi họ gửi lại lời mời.**

### 5. Liên hệ công khai, dễ tìm

Đặt một địa chỉ liên hệ trong phần cài đặt của app, và một URL hỗ trợ thực sự có người trả lời trong App Store Connect. Trong TradaZen, địa chỉ hỗ trợ có trong chính sách quyền riêng tư và trong điều khoản sử dụng. Nội dung cần có của các trang này nằm trong [chính sách quyền riêng tư của ứng dụng](https://devoria.fr/vi/blog/chinh-sach-quyen-rieng-tu-ung-dung-ios).

Điểm cuối cùng: hãy quyết định nội dung của một người xóa tài khoản sẽ ra sao. `on delete cascade` ở trên xóa các báo cáo của họ cùng với tài khoản. Công thức đầy đủ nằm trong [xóa tài khoản iOS](https://devoria.fr/vi/blog/xoa-tai-khoan-app-ios-test-truoc-app-review).

## Những gì TradaZen ghi trong chính sách

Các cơ chế này được mô tả công khai trong chính sách quyền riêng tư của TradaZen, được bổ sung vào tháng 9 năm 2026 khi có giải đấu và bạn bè: "Nickname đi qua một bộ lọc tự động; bạn có thể báo cáo một nickname không phù hợp trong bảng xếp hạng, và xóa và chặn một người bạn." Chính sách đó cũng nói rõ email và nhật ký không bao giờ được hiển thị cho người chơi khác. Bối cảnh của app có trong [case study TradaZen](https://devoria.fr/vi/blog/ra-mat-ung-dung-iphone-nghien-cuu-tinh-huong-tradazen).

## Trả lời Apple thế nào sau khi bị từ chối 1.2

Hãy nói cho reviewer biết tìm từng cơ chế ở đâu, trong câu trả lời và trong ghi chú review. Các tính năng này nằm trong app: reviewer kiểm tra code có trong build, nên hãy chuẩn bị một build mới. Quy trình để [trả lời App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/) giống như với các quy định khác. Đây là một mẫu bằng tiếng Anh, cần điều chỉnh, và chỉ giữ những gì đúng với app của bạn:

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

Nếu build thiếu một cơ chế, một câu trả lời sẽ không đủ. Cũng như với [guideline 2.1](https://devoria.fr/vi/blog/guideline-2-1-app-store-tu-choi), Apple đánh giá build mà họ đang có trong tay.

## Check-list 1.2 trước khi gửi

- Bạn đã liệt kê mọi thứ người dùng đăng mà người khác thấy, kể cả nickname.
- Điều khoản của bạn cấm nội dung phản cảm và lạm dụng, và app yêu cầu bấm "Tôi đồng ý" rõ ràng.
- Bộ lọc chạy trên server, tìm theo từ nguyên vẹn và bao phủ các ngôn ngữ trên trang App Store của bạn.
- Mỗi nội dung có một nút "Báo cáo", và mỗi báo cáo báo cho bạn ngay lập tức.
- Bạn biết cách gỡ một nội dung và loại tác giả của nó trong vòng chưa đến 24 giờ.
- Chặn một người dùng sẽ gỡ nội dung của họ ngay lập tức.
- Một địa chỉ liên hệ hiển thị trong app, và URL hỗ trợ có người trả lời.
- Bảng câu hỏi phân loại độ tuổi khai báo nội dung người dùng, và cả nhắn tin nếu app của bạn có.
- Ghi chú review nói rõ tìm từng cơ chế ở đâu, kèm một tài khoản demo.

## Sửa lỗi bị từ chối trước khi gửi lại app

Nếu app của bạn vừa bị từ chối vì 1.2, [Review Kit](https://devoria.fr/vi/kits/app-review) tập hợp những gì mình kiểm tra trước mỗi lần gửi, với hai skill đọc lại project của bạn trong Claude Code và chuẩn bị câu trả lời nếu Apple từ chối. Nếu cần một góc nhìn từ người thật, [đặt một giờ với mình](https://devoria.fr/vi/coaching): chúng ta sẽ cùng đọc thông báo và xem quy trình kiểm duyệt của bạn. Toàn bộ các bước sau khi bị từ chối có ở trang [ứng dụng bị Apple từ chối](https://devoria.fr/vi/expertise/ung-dung-bi-apple-tu-choi).

Nếu bạn đang chuẩn bị ra mắt lần đầu, [làm bài chẩn đoán miễn phí](https://devoria.fr/vi/diagnostic): nó cho bạn biết nên bắt đầu từ bước nào và gửi cho bạn checklist chống bị Apple từ chối của mình.

Không ai có thể đảm bảo Apple sẽ chấp nhận app của bạn. Năm cơ chế này, hiển thị rõ ràng, ít nhất sẽ loại lý do này khỏi danh sách.

## Câu hỏi thường gặp

### "Guideline 1.2 - Safety - User-Generated Content" nghĩa là gì?

Đó là tiêu đề của lý do từ chối trong thông báo của Apple. Nó có nghĩa là app của bạn hiển thị nội dung do người dùng tạo mà không có đủ các biện pháp bảo vệ được yêu cầu: bộ lọc, báo cáo được xử lý nhanh, chặn, liên hệ công khai và điều khoản sử dụng được chấp nhận.

### Nickname trong bảng xếp hạng có được tính là nội dung người dùng không?

Văn bản của Apple không nói vậy. Mình coi nó là nội dung người dùng, vì nickname được chọn tự do và người chơi khác nhìn thấy. Trong TradaZen, nickname trong bảng xếp hạng đi qua bộ lọc, có thể bị báo cáo và được thay bằng một nickname trung tính nếu có vấn đề.

### Có thật sự phải xử lý báo cáo trong 24 giờ không?

Đó là điều thông báo từ chối của Apple yêu cầu. Văn bản quy định nói về phản hồi nhanh. Vì vậy một bộ lọc tự động là không đủ: cần có người gỡ nội dung và loại tác giả của nó. Việc tự động ẩn sau nhiều báo cáo giúp bạn trụ được trong lúc chờ.

### Điều khoản sử dụng có phải được chấp nhận trong app không?

Đó là cách an toàn nhất. Thông báo từ chối yêu cầu người dùng chấp nhận điều khoản không dung thứ nội dung phản cảm hay người dùng lạm dụng. Một link ở cuối trang không chứng minh được sự đồng ý. Một màn hình có nút "Tôi đồng ý", trước lần đăng đầu tiên, thì không để lại nghi ngờ nào.

### App chat ẩn danh có vượt qua được guideline 1.2 không?

Văn bản hiện tại xếp chat ngẫu nhiên hoặc ẩn danh vào những mục đích không có chỗ trên App Store. Một app chủ yếu dùng cho việc đó có thể bị gỡ mà không cần báo trước, kể cả khi có bộ lọc, báo cáo và chặn.


## Dự án của bạn

[Review Kit](https://devoria.fr/vi/kits/app-review): Checklist duyệt App Store của mình, các lần Apple từ chối đã sửa, checklist Google Play và ba skill Claude Code. 1.399.000 ₫.

[iOS & Android Kit](https://devoria.fr/vi/kits/ios): Tạo app iPhone và Android với Claude Code: code khởi đầu từ các app của mình, lộ trình đến tận store và tất cả các kit. 2.799.000 ₫.

[Chẩn đoán: điều gì ngăn bạn có app iPhone](https://devoria.fr/vi/diagnostic): 7 câu hỏi, 60 giây: bạn biết điều gì thật sự cản bạn đăng app iPhone, lộ trình 4 bước và kit phù hợp với bạn.
