Guideline 1.2 User-Generated Content: מה Apple דורשת
מאת Mehdi Azizi
פורסם ב-, 10 דק׳
Guideline 1.2: אם המשתמשים שלך מפרסמים תוכן, צריך פילטר, דיווח, חסימה, פרטי קשר ותנאי שימוש מאושרים. צ'קליסט ל-Expo ול-Supabase.
הגיידליין 1.2 חל ברגע שמשתמשים מפרסמים משהו שאחרים רואים: הודעה, תמונה, ביקורת, ולדעתי אפילו כינוי פשוט בטבלת דירוג. הטקסט של Apple דורש אז פילטר, דיווח עם תגובה מהירה, חסימה ופרטי קשר מפורסמים. הודעות הדחייה מוסיפות דרישה חמישית: תנאי שימוש שהמשתמש אישר, שלא סובלים לא תוכן פוגעני ולא משתמשים פוגעניים.
המדריך הזה לא מספר על דחייה. הוא מראה מה בניתי ב-TradaZen, האפליקציה שלי לתרגול מסחר, כשטבלאות הדירוג שלה התחילו להציג כינויים שהשחקנים בחרו. לתמונה הכללית של סיבות הדחייה, תקרא את למה Apple דוחה אפליקציה.
מה אומר גיידליין 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 למטה צריך להתאים לסכמה שלך. הן נשענות על כללי הגישה ברמת השורה של 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
תגיד לבודק איפה למצוא כל מנגנון, בתשובה שלך ובהערות לבדיקה. הפונקציות האלה חיות באפליקציה: הבודק בודק את הקוד שנמצא בבילד, אז תכין בילד חדש. התהליך ל-מענה ל-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 לפני השליחה
- רשמת כל מה שמשתמש מפרסם ואחרים רואים, כולל כינויים.
- תנאי השימוש שלך אוסרים תוכן פוגעני וניצול לרעה, והאפליקציה מבקשת "אני מסכים" מפורש.
- הפילטר רץ בשרת, מחפש מילים שלמות ומכסה את השפות של דף האפליקציה שלך.
- לכל תוכן יש כפתור "דווח", וכל דיווח מתריע לך מיד.
- אתה יודע להסיר תוכן ולהרחיק את מי שפרסם אותו תוך פחות מ-24 שעות.
- חסימת משתמש מסירה את התוכן שלו מיד.
- כתובת ליצירת קשר מופיעה באפליקציה, וה-URL של התמיכה עובד.
- שאלון סיווג הגיל מצהיר על תוכן של משתמשים, ועל הודעות אם יש באפליקציה שלך.
- ההערות לבדיקה אומרות איפה למצוא כל מנגנון, עם חשבון דמו.
לתקן את הדחייה לפני ששולחים שוב
אם האפליקציה שלך נדחתה הרגע בגלל 1.2, ה-Review Kit מרכז את מה שאני בודק לפני כל שליחה, עם שני skills שעוברים על הפרויקט שלך ב-Claude Code ומכינים את התשובה שלך אם Apple דוחה. אם אתה רוצה עין אנושית, תקבע איתי שעה: נקרא את ההודעה ביחד ונעבור על תהליך המודרציה שלך. כל התהליך אחרי דחייה נמצא בדף אפליקציה שנדחתה על ידי Apple.
אם אתה מתכונן להשקה הראשונה שלך, תעשה את האבחון החינמי: הוא אומר לך באיזה שלב להתחיל ושולח לך את הצ'קליסט שלי נגד דחיות של Apple.
אף אחד לא יכול להבטיח ש-Apple תאשר את האפליקציה שלך. חמשת המנגנונים האלה, כשהם ברורים לעין, לפחות מורידים את הסיבה הזו מהרשימה.
שאלות נפוצות
מה המשמעות של "Guideline 1.2 - Safety - User-Generated Content"?
זו הכותרת של הדחייה בהודעה של Apple. היא אומרת שהאפליקציה שלך מציגה תוכן שמשתמשים יצרו בלי כל ההגנות הנדרשות: פילטר, דיווח שמטופל מהר, חסימה, פרטי קשר מפורסמים ותנאי שימוש מאושרים.
האם כינוי בטבלת דירוג נחשב תוכן של משתמשים?
הטקסט של Apple לא אומר. אני מתייחס אליו ככזה, כי כינוי נבחר בחופשיות ושחקנים אחרים רואים אותו. ב-TradaZen, הכינויים בטבלאות הדירוג עוברים פילטר, אפשר לדווח עליהם, והם מוחלפים בכינוי ניטרלי אם הם בעייתיים.
באמת צריך לטפל בדיווחים תוך 24 שעות?
זה מה שהודעת הדחייה של Apple מבקשת. הטקסט של הכלל מדבר על תגובות מהירות. לכן פילטר אוטומטי לא מספיק: צריך מישהו שמסיר את התוכן ומרחיק את מי שפרסם אותו. ההסתרה האוטומטית אחרי כמה דיווחים עוזרת לך להחזיק מעמד בינתיים.
האם צריך לאשר את תנאי השימוש בתוך האפליקציה?
זו הדרך הבטוחה ביותר. הודעת הדחייה מבקשת שהמשתמשים יאשרו תנאים שלא סובלים לא תוכן פוגעני ולא משתמשים פוגעניים. קישור בתחתית עמוד לא מוכיח הסכמה. מסך עם כפתור "אני מסכים", לפני הפרסום הראשון, לא משאיר מקום לספק.
האם אפליקציית צ'אט אנונימי יכולה לעבור את גיידליין 1.2?
הטקסט הנוכחי מזכיר צ'אט אקראי או אנונימי בין השימושים שאין להם מקום ב-App Store. אפליקציה שמשמשת בעיקר לזה יכולה להיות מוסרת בלי הודעה מוקדמת, גם עם פילטר, דיווח וחסימה.

