ガイドライン1.2 ユーザー生成コンテンツでAppleが求める対策
著者:Mehdi Azizi
公開・10 分
ユーザーが投稿できるアプリには、フィルター、報告、ブロック、連絡先、同意済みの利用規約が必要です。ExpoとSupabaseで使えるチェックリスト付き。
ガイドライン1.2は、ユーザーが投稿したものを他のユーザーが見られる時点で適用されます。メッセージ、写真、レビュー、そして私の考えでは、ランキングに表示されるただのニックネームも対象です。この場合、Appleの規定はフィルター、報告とそれへの迅速な対応、ブロック、公開された連絡先を求めています。リジェクトメッセージでは5つ目の要件が加わります。不快なコンテンツも悪質なユーザーも許さない利用規約に、ユーザーが同意していることです。
このガイドはリジェクトの体験談ではありません。私のトレード練習アプリTradaZenで、プレイヤーが選んだニックネームをランキングに表示し始めたときに実装した内容を紹介します。リジェクト理由の全体像を知りたい方は、Appleがアプリをリジェクトする理由を読んでください。
ガイドライン1.2には何が書かれているのか?
1.2「User-Generated Content」は、App Review Guidelinesのセクション1「Safety」にあります。対象はユーザーのコンテンツやソーシャルネットワーキングサービスを含むアプリです。悪用を防ぐため、こうしたアプリは次の4つの保護策を「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」:見つけやすい場所に公開された連絡先。
2026年6月8日に更新された現行版の規定は、さらに踏み込んでいます。ルール、利用規約、コミュニティガイドラインに違反するコンテンツを削除するのは開発者の責任だと明記しています。Appleがそうしたコンテンツを見つけた場合、削除と改善計画の提出を求め、その間アプリを取り下げることもあります。
規定には、App Storeにふさわしくないアプリも挙げられています。主にポルノ、Chatrouletteのようなランダムまたは匿名のチャット、実在の人物の容姿の評価、脅迫や嫌がらせに使われるアプリです。こうした用途では、4つの保護策があっても足りません。 1.2.1ではクリエイター向けアプリのルールが追加されており、特にアプリの年齢区分を超えるコンテンツには年齢確認が求められます。
あなたのアプリは対象か?
App Store Connectの年齢区分の質問票に、わかりやすい定義があります。ユーザーが作成したコンテンツ(動画、写真、テキスト、音声)がアプリ内で広く共有される場合をユーザー生成コンテンツとしています。ユーザー間のメッセージ機能は別扱いです。
| 他のユーザーに見えるもの | 対象か? |
|---|---|
| メンバー間のメッセージ | はい |
| 公開の写真やレビュー | はい |
| ランキングのニックネーム | はい(私の見解) |
| 非公開のメモ | いいえ |
| あなた自身が書いた内容 | いいえ |
Appleはニックネームについて言及していません。それでも私はユーザーのコンテンツとして扱っています。誰でも侮辱的なものを選べて、他のプレイヤーに見えるからです。TradaZenのランキングではそう判断しました。
実装すべき5つの仕組み(Expo と Supabase)
2025年末にある開発者がAppleのフォーラムで公開した1.2のリジェクトメッセージには、求められる対策が並んでいます。最初は「Require that users agree to terms (EULA)」で、最後は期限の要件です。報告に「within 24 hours」で対応し、コンテンツを削除して投稿者を排除すること。
| 仕組み | 実装場所 |
|---|---|
| 利用規約への同意 | 画面とプロフィール |
| フィルター | サーバー、表示前 |
| 報告 | ボタンとテーブル |
| ブロック | テーブルとアクセスルール |
| 公開された連絡先 | アプリとApp Storeページ |
以下のSQLの例は、自分のスキーマに合わせて調整してください。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では、リーグのランキングで報告されたニックネームは、報告した人のスマホ上ですぐに中立的なラベルで表示されます。その後、報告はサーバーに送られ、スマホがオフラインなら後で再送されます。
データベース側には報告テーブルを用意し、1人につき1つのコンテンツへの報告は1件までとします。
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時間を守るには、報告のたびに通知を受け取るようにします。Supabaseのデータベースwebhookでサーバー関数を呼び出し、メッセージを送らせることができます。コンテンツを削除するためのキーはサーバーに置いたままにします。詳しくはExpoアプリのシークレットAPIキーで説明しています。
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. 見つけやすい場所に公開された連絡先
アプリの設定に連絡先のメールアドレスを載せ、App Store Connectには実際に応答するサポートURLを設定します。TradaZenでは、サポートのアドレスをプライバシーポリシーと利用規約に記載しています。これらのページに書くべき内容はアプリのプライバシーポリシーにまとめています。
最後に、アカウントを削除したユーザーのコンテンツをどうするか決めておきましょう。上の on delete cascade は、アカウントと一緒にそのユーザーの報告も削除します。詳しい手順はiOSのアカウント削除にあります。
TradaZenがポリシーで公開している内容
これらの仕組みは、TradaZenのプライバシーポリシーで公開しています。リーグと友達機能の追加にあわせて2026年9月に追記した文面です:「ニックネームは自動フィルターを通ります。ランキングで不適切なニックネームを報告でき、友達を外してブロックすることもできます。」同じポリシーには、メールアドレスと取引記録が他のプレイヤーに見せられることはないとも明記しています。アプリの背景はTradaZenのケーススタディをご覧ください。
1.2でリジェクトされたらAppleにどう返信するか
それぞれの仕組みがどこにあるかを、返信と審査メモの両方でレビュアーに伝えます。これらの機能はアプリの中にあり、レビュアーはビルドに含まれたコードを確認するので、新しいビルドを用意してください。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,
ビルドに仕組みが欠けているなら、返信だけでは通りません。ガイドライン2.1と同じく、Appleは手元にあるビルドで判断します。
提出前の1.2チェックリスト
- ユーザーが投稿して他のユーザーが見られるものを、ニックネームも含めてすべて洗い出した。
- 利用規約で不快なコンテンツと悪用を禁止し、アプリで明示的な「同意する」を求めている。
- フィルターはサーバーで動き、単語全体で検索し、App Storeページの言語に対応している。
- すべてのコンテンツに「報告」ボタンがあり、報告のたびにすぐ通知が届く。
- 24時間以内にコンテンツを削除し、投稿者を排除できる。
- ユーザーをブロックすると、そのコンテンツがすぐに消える。
- 連絡先のアドレスがアプリ内に表示され、サポートURLが応答する。
- 年齢区分の質問票で、ユーザー生成コンテンツと、あればメッセージ機能を申告している。
- 審査メモに各仕組みの場所を書き、デモアカウントを添えている。
アプリを再提出する前にリジェクトを解決する
1.2でリジェクトされたばかりなら、Review Kitに私が毎回の提出前に確認している項目をまとめています。Claude Codeでプロジェクトをチェックし、Appleにリジェクトされたときの返信を準備する2つのスキルも入っています。人の目で見てほしい場合は、私との1時間を予約してください。メッセージを一緒に読み、モデレーションの流れを確認します。リジェクト後の全体的な進め方は、Appleにリジェクトされたアプリのページにあります。
初めてのリリースを準備中なら、無料の診断を受けてください。最初に取り組むべきステップがわかり、私のAppleリジェクト対策チェックリストも届きます。
Appleがアプリを承認すると保証できる人はいません。それでも、この5つの仕組みをわかりやすく用意しておけば、少なくともこのリジェクト理由はリストから消せます。
よくある質問
「Guideline 1.2 - Safety - User-Generated Content」とはどういう意味ですか?
Appleのメッセージに書かれるリジェクトの見出しです。アプリがユーザー作成のコンテンツを表示しているのに、求められる保護策がそろっていないという意味です。保護策とは、フィルター、迅速に処理される報告、ブロック、公開された連絡先、同意済みの利用規約です。
ランキングのニックネームはユーザーのコンテンツに含まれますか?
Appleの規定には書かれていません。私はユーザーのコンテンツとして扱っています。ニックネームは自由に選べて、他のプレイヤーに見えるからです。TradaZenでは、ランキングのニックネームはフィルターを通り、報告でき、問題があれば中立的なニックネームに置き換えられます。
報告は本当に24時間以内に対応する必要がありますか?
Appleのリジェクトメッセージはそれを求めています。ルールの規定では「迅速な対応」とされています。つまり自動フィルターだけでは足りず、コンテンツを削除して投稿者を排除する人が必要です。複数の報告があったときの自動非表示は、対応するまでのつなぎとして役立ちます。
利用規約はアプリ内で同意してもらう必要がありますか?
それが一番確実な方法です。リジェクトメッセージは、不快なコンテンツも悪質なユーザーも許さない規約にユーザーが同意することを求めています。ページ下部のリンクだけでは同意の証明になりません。最初の投稿の前に「同意する」ボタンのある画面を出せば、疑いの余地はありません。
匿名チャットアプリはガイドライン1.2を通過できますか?
現行の規定は、ランダムまたは匿名のチャットをApp Storeにふさわしくない用途として挙げています。主にその目的で使われるアプリは、フィルター、報告、ブロックがあっても、予告なく取り下げられることがあります。

