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 ниже нужно адаптировать под твою схему. Они опираются на построчные правила доступа 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 года с появлением лиг и друзей: «Ники проходят через автоматический фильтр; ты можешь пожаловаться на неподходящий ник в рейтинге, а также удалить и заблокировать друга». Та же политика уточняет, что e-mail и журнал никогда не показываются другим игрокам. Контекст приложения есть в кейсе 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,
Если какого-то механизма в билде нет, одного ответа не хватит. Как и с guideline 2.1, Apple оценивает тот билд, который у него в руках.
Чек-лист по 1.2 перед отправкой
- Ты перечислил всё, что пользователь публикует и что видят другие, включая ники.
- Твои условия запрещают оскорбительный контент и нарушения, а приложение требует явного «Принимаю».
- Фильтр работает на сервере, ищет целые слова и покрывает языки твоей страницы в магазине.
- У каждого контента есть кнопка «Пожаловаться», и каждая жалоба сразу тебя уведомляет.
- Ты умеешь удалить контент и исключить автора меньше чем за 24 часа.
- Блокировка пользователя сразу убирает его контент.
- Контактный адрес виден в приложении, а URL поддержки работает.
- Анкета возрастного рейтинга указывает пользовательский контент и переписку, если она есть в приложении.
- Заметки для проверки говорят, где найти каждый механизм, и содержат демо-аккаунт.
Исправь отказ перед повторной отправкой
Если твоё приложение только что отклонили по 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. Приложение, которое в основном для этого и служит, могут снять без предупреждения, даже с фильтром, жалобами и блокировкой.

