# Guideline 2.3.1: приховані функції та OTA-оновлення

> Guideline 2.3.1: Apple відхиляє приховані, «сплячі» функції та ті, яких немає в нотатках для рев'ю. Що можна змінити віддалено, а що потребує нового білду.

Оригінальна сторінка: [Guideline 2.3.1: приховані функції та OTA-оновлення](https://devoria.fr/uk/blog/guideline-2-3-1-hidden-features-ota-updates)
Автор: [Mehdi Azizi](https://devoria.fr/uk/mehdi-azizi)
Опубліковано: 2026-11-04
Останнє оновлення змісту: 2026-11-04


Guideline 2.3.1 забороняє приховані, «сплячі» або незадокументовані функції: усе, що робить твій застосунок, має бути видно і користувачеві, і рецензентові. Кожну новинку треба точно описати в нотатках для рев'ю. **Віддалене оновлення може виправити те, що Apple бачила, але ніколи не може додати те, чого Apple не бачила.**

Я публікую свої iOS-застосунки з Expo, і кожен має EAS Update вже з першого білду, щоб доставляти виправлення. Моє правило: жодних віддалених оновлень, поки версія на рев'ю. Цей гайд спирається на текст Apple, її ліцензію, документацію Expo та опубліковані відмови.

## Що каже guideline 2.3.1?

2.3.1 відкриває підрозділ 2.3 «Accurate Metadata» в [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#2.3.1), у розділі 2 «Performance». Текст починається так: «Don't include any hidden, dormant, or undocumented features in your app; your app's functionality should be clear to end users and App Review.» Простіше кажучи: нічого прихованого, «сплячого» чи незадокументованого.

Далі йдеться про кожну подачу: «All new features, functionality, and product changes must be described with specificity in the Notes for Review section of App Store Connect (generic descriptions will be rejected) and accessible for review.» **Кожну новинку треба точно описати в нотатках для рев'ю, і вона має бути доступна рецензентові.** Тож «Виправлення помилок і покращення» не вистачить.

Той самий пункт стосується оманливого маркетингу: обіцяти контент чи сервіс, якого немає, або показувати фальшиву ціну, в App Store чи деінде.

Ця частина мені знадобилася з Nolera. Перечитуючи сторінку застосунку перед релізом, я знайшов дві фрази, які неможливо перевірити: «інтерфейс лише французькою», що вже стала неправдою, і «найпопулярніший пакет» для застосунку, який ще ні разу не публікувався. Нотатки для рецензента теж описували застарілий стан продукту. Саме на таке й спрямована ця частина. А [2.3.10](https://devoria.fr/uk/blog/guideline-2-3-10-app-rejected-metadata) стосується передусім сторінки застосунку.

## Що означає повідомлення про відмову 2.3.1?

Відмова називається «Guideline 2.3.1 - Performance», іноді з доданим «Hidden Features». Два повідомлення, опубліковані React Native-розробниками:

- **Березень 2024**, у [тікеті CodePush на GitHub](https://github.com/microsoft/react-native-code-push/issues/2680): «The app contains hidden features.», без жодних уточнень. Розробник просить пояснень і отримує доповнення за 2.5.2: «Your app, extension, or linked framework appears to contain code designed explicitly with the capability to change the app's behavior or functionality after App Review approval.» У тікеті не сказано, чи пройшов застосунок потім.
- **Лютий 2023**, в [іншому тікеті](https://github.com/microsoft/react-native-code-push/issues/2434), Apple вказує на «CodePush-related remote code downloading/updating support» у бінарнику.

Як я це розумію: **рецензент не бачить твоїх оновлень, він бачить код, здатний їх отримувати.** Обидва випадки стосуються CodePush. Я не знайшов свіжих публічних відмов щодо EAS Update, але це нічого не доводить.

## Віддалені оновлення: що дозволяють 2.5.2 і ліцензія

[Правило 2.5.2](https://developer.apple.com/app-store/review/guidelines/#2.5.2), про яке я пишу і в гайді про [фонові режими](https://devoria.fr/uk/blog/guideline-2-5-4-background-mode-rejected), забороняє застосунку «download, install, or execute code which introduces or changes features or functionality of the app».

Стаття 3.3.1(B) [Apple Developer Program License Agreement](https://developer.apple.com/support/terms/apple-developer-program-license-agreement/#b331) забороняє завантажуваний виконуваний код, але уточнює: «Interpreted code may be downloaded to an Application». За трьох умов: цей код не змінює основне призначення застосунку, не обходить ні підпис, ні пісочницю, ні захист системи, і не створює магазин інших застосунків.

JavaScript у застосунку на Expo є інтерпретованим кодом: на мою думку, EAS Update вкладається в ці рамки. Його [документація](https://docs.expo.dev/eas-update/introduction/) нагадує, що оновлення підпорядковуються правилам App Store і що «changes to your app's behavior need to be reviewed». Для критичного бага Expo пропонує віддалене виправлення, а потім нову подачу, яка його містить.

**Моя межа: виправляти й підлаштовувати те, що вже є, так. Змінювати те, чим є застосунок або що він продає, ні.**

## Що можна змінити віддалено, а що потребує нового білду

Таблиця, якою я користуюся, складена за сторінками Apple та Expo, на які тут посилаюся. Рядок «безкоштовне стає платним» і два останні рядки є моїм тлумаченням.

| Зміна                       | Шлях                   | Чому                             |
| --------------------------- | ---------------------- | -------------------------------- |
| Баг у JavaScript            | Віддалене оновлення    | Сценарій, передбачений Expo      |
| Текст, переклад, стиль      | Віддалене оновлення    | Сценарій, передбачений Expo      |
| Ціна підписки               | App Store Connect      | Код не змінюється                |
| Промотекст                  | App Store Connect      | Без нової подачі                 |
| Покупка вже схваленого типу | Рев'ю лише покупки     | Правило App Store Connect        |
| Перша покупка певного типу  | Нова версія            | Правило App Store Connect        |
| Нова функція                | Нова версія            | 2.3.1 і 2.5.2                    |
| Безкоштовне стає платним    | Нова версія            | Треба оновити сторінку й нотатки |
| Дозвіл, Info.plist          | Новий білд             | Файл бінарника                   |
| Нативний модуль, Expo SDK   | Новий білд             | Змінено нативний код             |
| Перемикач, що вимикає       | Віддалена конфігурація | Допустимо, якщо тимчасово        |
| Перемикач, що відкриває     | Заборонено             | Функцію не перевіряли            |

Промотекст змінюється «without requiring an updated submission», згідно зі сторінкою Apple про [інформацію про версію](https://developer.apple.com/help/app-store-connect/reference/app-information/platform-version-information). Перша покупка кожного типу йде разом з новою версією, наступні окремо, згідно з довідкою про [подачу покупок](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-in-app-purchase). Expo відносить нативний код, дозволи й версію SDK до того, що потребує нового бінарника, як і у випадку з [ITMS-90683](https://devoria.fr/uk/blog/itms-90683-missing-purpose-string-expo). Перемикач, що вимикає зламану функцію, не додає нічого нового, якщо тільки він не забирає те, за що заплатили передплатники.

## Віддалені перемикачі без відмов

Віддалений перемикач, або feature flag, сам по собі не заборонений: усе залежить від того, що він приховує. Мої правила:

- **Усе, що перемикач може показати, присутнє й увімкнене для рецензента**, і назване в нотатках для рев'ю.
- A/B-тест порівнює два варіанти, які рецензент може побачити, а не перевірений і неперевірений.
- **Жоден код не визначає рев'ю, щоб поводитися інакше.** Це і є саме визначення прихованої функції.
- Paywall, керований віддалено, показує лише схвалені продукти, і кожен варіант відповідає [правилу 3.1.2](https://devoria.fr/uk/blog/guideline-3-1-2-vidmova-pidpyska-app-store).

## Демо-режим і тестові акаунти

[Guideline 2.1](https://devoria.fr/uk/blog/guideline-2-1-app-store-vidmova) вимагає демо-акаунт, якщо в застосунку є вхід, і увімкнений сервер. Якщо юридичні вимоги чи вимоги безпеки не дають тобі його надати, його може замінити вбудований демо-режим, але лише «with prior approval by Apple», і він має показувати всі функції. Сторінка Apple про інформацію про версію додає: акаунт не повинен спливати, а додаткові акаунти вказуються в нотатках, обмежених 4 000 байтами.

Зв'язок із 2.3.1: **демо-режим чи тестовий акаунт, що відкриває екрани, інакше невидимі, треба описати.** Таємний жест, код чи спеціальний акаунт, про які не сказано, це прихована функція. Назви кожен спеціальний доступ у нотатках і що саме він відкриває.

## Моє правило: жодних віддалених оновлень під час рев'ю

Чому EAS Update у мене всюди: у Solys, моєму будильнику, баг у JavaScript робив застосунок німим, щойно звуковий ефект один раз не спрацьовував. Виправлення займало три рядки, але щоб його доставити, потрібні були повний білд і рев'ю. Відтоді всі мої застосунки мають expo-updates з першого білду: це нативний модуль, і бінарник, скомпільований без нього, ніколи нічого не отримає. Моя конфігурація в `app.json`:

```json
{
  "expo": {
    "runtimeVersion": { "policy": "fingerprint" },
    "updates": { "fallbackToCacheTimeout": 0, "checkAutomatically": "ON_LOAD" }
  }
}
```

З `fingerprint` оновлення доходить лише до бінарників із відповідним нативним кодом ([runtime-версії](https://docs.expo.dev/eas-update/runtime-versions/)). Але поки версія чекає на рев'ю чи проходить його, я нічого не публікую. Дві причини.

1. **Рецензент не побачив би виправлення.** З `fallbackToCacheTimeout` рівним 0 нова інсталяція стартує на вбудованому коді й застосовує оновлення при наступному запуску ([документація expo-updates](https://docs.expo.dev/versions/latest/sdk/updates/)). Рецензент встановлює, запускає один раз і тестує бінарник. Nolera відхилили, хоча виправлення вже було доставлено віддалено: я розповідаю про це в гайді про 2.1.
2. **Те, що тестує рецензент, має залишатися тим, що отримують користувачі.** Зміна поведінки під час рев'ю створює розбіжність між перевіреною і доставленою версією.

## Точні нотатки для рев'ю

2.3.1 відхиляє загальні описи. Шаблон, який я б використав, англійською:

```text
What's new in this version:
- [Feature]: [where to find it, how to test it].

Remote configuration:
- "[flag]" controls [feature]. It is ON for review.

Over-the-air updates:
- The app uses expo-updates for bug fixes only.
  No update will be published during this review.

Demo account: see Sign-in information. It never expires.
```

## Як відповісти на відмову 2.3.1?

Відповідай в App Store Connect, де ти [відповідаєш на повідомлення App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/).

- **Повідомлення розмите**: запитай, про яку функцію йдеться, як розробник із тікета 2024 року.
- **Справжню функцію погано описано**: дай точний шлях і коротке відео, потім доповни нотатки.
- **Перемикач відкриває щось неперевірене**: прибери його або увімкни й опиши, потім зроби новий білд.
- **Проблема в коді оновлень**: поясни, що він слугує для виправлень, у межах статті 3.3.1(B). У тікеті 2023 року Apple вимагала його прибрати.

## Чекліст 2.3.1 перед подачею

- Кожна новинка версії описана в нотатках, із шляхом до неї.
- Кожен віддалений перемикач увімкнений для рев'ю й названий у нотатках.
- Жоден код не змінює поведінку для рецензента.
- Спеціальні доступи описані: демо-режим, тестовий акаунт, жест.
- Сторінка застосунку й paywall не обіцяють нічого, чого не робить білд.
- Під час рев'ю не публікується жодне віддалене оновлення.

## Перевір свої матеріали перед відправкою

[Review Kit](https://devoria.fr/uk/kits/app-review) містить мій чекліст перед відправкою, шаблони нотаток для тестувальника і skills для Claude Code, які перевіряють твій проєкт. Якщо потрібен людський погляд, [забронюй годину зі мною](https://devoria.fr/uk/coaching): ми разом переглянемо твої нотатки для рев'ю і конфігурацію оновлень, по відеозв'язку. Повний підхід описано на сторінці [застосунок відхилено Apple](https://devoria.fr/uk/expertise/app-rejected-by-apple).

Готуєш свій перший реліз? [Пройди безкоштовну діагностику](https://devoria.fr/uk/diagnostic): вона розставить кроки в правильному порядку й надішле тобі мій чекліст проти відмов Apple.

## Поширені запитання

### Що означає «Guideline 2.3.1 - Performance - Hidden Features»?

Apple вважає, що твій застосунок містить приховану, «сплячу» функцію або таку, якої немає в нотатках для рев'ю. Повідомлення може також стосуватися коду, здатного змінити застосунок після рев'ю, іноді разом із відмовою 2.5.2.

### Чи дозволяє Apple EAS Update?

Ліцензія дозволяє завантажуваний інтерпретований код, доки він не змінює основне призначення застосунку. Виправляти так. Додавати неперевірену функцію ні.

### Чи можна використовувати feature flags в iOS-застосунку?

Так, якщо все, що вони можуть показати, пройшло рев'ю. Увімкни кожен перемикач для рев'ю й опиши його в нотатках.

### Чи треба повідомляти рецензента про демо-режим?

Так. Вбудований демо-режим потребує попередньої згоди Apple і має показувати всі функції.

### Чи можна публікувати віддалене оновлення під час рев'ю?

Прямо це ніде не заборонено. Але рецензент не побачив би його при першому запуску, і воно створює розбіжність із перевіреною версією. Я завжди від цього утримуюся.


## Твій проєкт

[Review Kit](https://devoria.fr/uk/kits/app-review): Мій чекліст для перевірки в App Store, виправлені відмови Apple, чекліст для Google Play і три скіли для Claude Code. 2 499 ₴.

[iOS & Android Kit](https://devoria.fr/uk/kits/ios): Створи свій застосунок для iPhone і Android з Claude Code: стартовий код моїх застосунків, шлях до публікації в сторах і всі кіти. 4 999 ₴.

[Діагностика: що відділяє тебе від твого застосунку для iPhone](https://devoria.fr/uk/diagnostic): 7 запитань, 60 секунд: ти дізнаєшся, що насправді заважає тобі опублікувати застосунок для iPhone, отримаєш свій шлях у 4 кроки і кіт, який тобі підходить.
