Guideline 2.5.1: публічні API та актуальний SDK в Expo
Автор: Mehdi Azizi
Опубліковано , 9 хв
Guideline 2.5.1: лише публічні API, сумісність з актуальною iOS, фреймворки за призначенням. В Expo спершу перевір свої нативні модулі.
Guideline 2.5.1 висуває чотири вимоги: використовувати лише публічні API, працювати на актуальній версії iOS, відмовлятися від того, що Apple позначає як застаріле, і застосовувати кожен фреймворк за його призначенням. З Expo ризик рідко походить із твого JavaScript-коду: він іде від нативних модулів, які ти встановлюєш, і від SDK, з яким ти збираєш застосунок.
Я публікую Solys, TradaZen і Nolera на Expo SDK 57. Solys спирається на API Screen Time від Apple, тобто фреймворк з обмеженим використанням. Цей гайд про правило перевірки. Про помилку, яку отримуєш під час завантаження білда, читай гайд ITMS-90338. Про фонові режими із сусіднього розділу читай гайд про guideline 2.5.4.
Що каже guideline 2.5.1?
Правило є в розділі 2.5, «Software Requirements», App Review Guidelines: «Apps may only use public APIs and must run on the currently shipping OS. Keep your apps up-to-date and make sure you phase out any deprecated features, frameworks or technologies that will no longer be supported in future versions of an OS. Apps should use APIs and frameworks for their intended purposes and indicate that integration in their app description.»
Простими словами, чотири обов'язки:
- Лише публічні API, тобто задокументовані Apple.
- Застосунок працює на поточній версії iOS, а з вересня 2026 це iOS 27.
- Нічого застарілого, що зникне: ти замінюєш те, що Apple оголошує як таке, що доживає свій вік.
- Кожен фреймворк на своєму місці і згаданий в описі: HomeKit для розумного дому, HealthKit для здоров'я та спорту, з'єднаний із застосунком Health.
Звідси й назва відмови: «Guideline 2.5.1 - Performance - Software Requirements».
Публічні API: де ховається ризик у застосунку на Expo
Приватний API це системна функція, яку Apple не документує. Apple не гарантує ні її поведінки, ні її наявності в наступній версії iOS, тому вона й заборонена.
Твій JavaScript-код ніколи не звертається до iOS напряму: він проходить через нативні модулі. Модулі SDK Expo підтримує команда Expo. Інші містять код, який писав не ти, і Apple перевіряє його так само, як твій. Гайд ITMS-90683 показує той самий механізм із текстами запитів дозволів: Apple оцінює код, присутній у білді, а не те, що робить застосунок.
У Solys станом на 15 жовтня 2026 року 42 прямі залежності містять нативний iOS-код, з них 14 поза SDK Expo. Серед них RevenueCat, Sentry, AppsFlyer і react-native-device-activity, міст до API Screen Time.
Приватний API можуть виявити у два моменти. Під час завантаження автоматичний аналіз App Store Connect може повернути помилку ITMS-90338. Під час перевірки рев'юер посилається на 2.5.1.
Застарілі API: від UIWebView до UIScene
Найвідоміший приклад це UIWebView, старий компонент для показу вебвмісту. Apple перестала його приймати в нових застосунках у квітні 2020 року, а в оновленнях у грудні 2020-го. Стара бібліотека, яка ще на нього посилалася, блокувала завантаження. У Solys пошук із чекліста нижче не знаходить жодного посилання.
Наступну зміну вже оголошено. Технічна нотатка Apple TN3187 пише: «In the next major release following iOS 26, UIScene lifecycle will be required when building with the latest SDK; otherwise, your app won't launch.» Простими словами, застосунок, зібраний із SDK iOS 27 без життєвого циклу на основі сцен, не запуститься.
Три дати, які варто пов'язати:
- З квітня 2026 року Apple вимагає Xcode 26: про це гайд ITMS-90725.
- У квітні 2027 року, за сторінкою завантаження Apple, SDK iOS 27 стане обов'язковим.
- Expo SDK 58, у беті з 15 вересня 2026 року, уже генерує керування сценами, згідно з анонсом Expo.
З Expo SDK 57 і Xcode 26 ти ще збираєш із SDK iOS 26: сьогодні нічого не ламається. Модулі, які змінюють AppDelegate, мають оновитися до квітня 2027 року.
Фреймворки, використані не за призначенням
Рев'юер перевіряє, що чутливий фреймворк обслуговує видиму функцію і що твоя сторінка в App Store її згадує.
- HealthKit призначений для здоров'я та спорту. Рекомендації Apple щодо інтерфейсу кажуть: «If your app doesn't provide health and fitness functionality, don't request access to people's private health data.»
- HomeKit призначений для розумного дому, і більше ні для чого.
- PushKit призначений для дзвінків через VoIP. Документація PushKit чітка: «If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications.» VoIP-сповіщення, яке будить застосунок без дзвінка, це зловживання.
- Family Controls, API Screen Time, вимагає спеціального дозволу. Його документація уточнює: «Before submitting your app to the App Store, you must request permission to use the entitlement.»
Для Solys я запросив цей дозвіл на дистрибуцію 23 вересня 2026 року, і Apple надала його того ж дня. Використання відповідає фреймворку: користувач обирає застосунки, які треба поставити на паузу, і Solys блокує їх на 30, 45 або 60 хвилин після пробудження. Опис на сторінці каже це одним реченням: «Solys використовує дозвіл Screen Time від Apple, щоб ставити на паузу вибрані застосунки.» Саме цього вимагає кінець 2.5.1: згадати інтеграцію в описі.
Бета-версії: TestFlight так, App Store ні
Release notes App Store Connect показують правило на практиці. 14 жовтня 2026 року білди, зроблені з Xcode 27.2 beta 3, приймаються «for internal and external testing», тобто для TestFlight. 5 жовтня білди з Xcode 27.1 RC приймаються «for the App Store».
Білд, зібраний із бетою Xcode, іде в TestFlight, але ніколи на перевірку. Щоб подати застосунок, потрібна фінальна версія або RC, яку Apple відкрила для App Store.
Два уточнення для застосунку на Expo:
- Бета Expo це не бета Apple. Apple контролює версію Xcode і SDK iOS, а не версію Expo. Анонс SDK 58 додавав, що образи EAS з Xcode 27 з'являться незабаром.
- Тестувати на актуальній iOS однаково обов'язково, навіть якщо ти збираєш із SDK iOS 26. Запусти застосунок із холодного старту на оновленому iPhone або симуляторі.
Чекліст: нативні залежності перед подачею
Проходь його перед кожним продакшн-білдом. Команди запускаються в корені проєкту Expo:
npx expo-doctor
npx expo install --check
grep -rlw "UIWebView" node_modules --include='*.m' --include='*.mm' --include='*.swift' --include='*.h'
npx expo-doctorне показує жодної помилки. У Solys 15 жовтня 2026 року: 20 перевірок із 21 пройдено. Помилка була через 13 пакетів Expo, що відставали на один патч, іnpx expo install --checkїх вирівнює.- Кожен модуль поза SDK Expo є в React Native Directory. Expo Doctor робить цю перевірку за замовчуванням, як зазначає документація Expo. Невідомий пакет вартий того, щоб прочитати його iOS-код.
- Кожен нативний модуль іде в ногу з твоєю версією React Native. Таблиця версій Expo пов'язує SDK 57 з React Native 0.86. Модуль без релізів протягом кількох версій це тривожний сигнал.
- Пошук UIWebView нічого не повертає. Зроби те саме для будь-якого API, який Apple оголошує застарілим.
- Кожен чутливий фреймворк має свою видиму функцію: здоров'я, Screen Time, дзвінки, дім. Опис її згадує, а спеціальний дозвіл надано.
- Білд зібрано у фінальному Xcode. Перевір версію в логах білда EAS.
- Застосунок запускається з холодного старту на актуальній версії iOS з новим акаунтом.
- Модулі, що зачіпають AppDelegate, заявляють підтримку UIScene до твого переходу на SDK iOS 27.
Як відповісти на відмову за 2.5.1?
Повідомлення зазвичай називає проблемний API або фреймворк. Два випадки:
- Фреймворк не обслуговує нічого видимого: прибери модуль або capability, зроби новий білд і відповідай двома реченнями.
- Фреймворк обслуговує реальну функцію: вкажи точний шлях, скриншот або коротке відео і згадай інтеграцію в описі сторінки.
Видалення нативного модуля змінює бінарник: віддаленого оновлення недостатньо. Гайд про guideline 2.1 пояснює, чому рев'юер бачить лише вбудований код. Далі розмова йде в App Store Connect, як у гайді про те, як відповісти App Review.
Перевір свій проєкт перед завантаженням
Review Kit містить мій чекліст перед завантаженням, мої виправлені відмови та скіли Claude Code, які перевіряють твій проєкт Expo. Якщо потрібен погляд людини, забронюй годину зі мною: разом прочитаємо повідомлення Apple і твої залежності. Повний підхід описано на сторінці застосунок відхилено Apple.
Готуєш свій перший реліз? Пройди безкоштовну діагностику: вона надішле тобі мій чекліст проти відмов Apple.
Поширені запитання
Що означає «Guideline 2.5.1 - Performance - Software Requirements»?
Це назва відмови, коли Apple вважає, що твій застосунок використовує непублічний API, застарілу технологію або фреймворк не за призначенням. Повідомлення зазвичай називає проблемний елемент.
Яка різниця між guideline 2.5.1 і помилкою ITMS-90338?
ITMS-90338 це автоматична помилка під час завантаження білда, коли аналіз виявляє непублічний символ. 2.5.1 це правило перевірки, яке застосовує людина, і воно також охоплює фреймворки, використані не за призначенням, і застарілі технології.
Чи можна подати застосунок, зібраний із бетою Xcode?
Ні. App Store Connect приймає такі білди лише для TestFlight. Для перевірки збирай із фінальною версією Xcode або з RC, яку Apple відкрила для App Store у своїх release notes.
Чи може застосунок на Expo використовувати приватний API, не знаючи про це?
Так, через сторонній нативний модуль. Твій JavaScript-код сам не викликає iOS, але кожен нативний пакет містить код на Objective-C або Swift. Переглядай список модулів поза SDK Expo перед кожною версією.
Чи треба одразу переходити на Expo SDK 58?
Для 2.5.1 станом на 15 жовтня 2026 року ні: SDK 57 збирає із SDK iOS 26, який ще приймають. Заплануй оновлення до квітня 2027 року, коли Apple вимагатиме SDK iOS 27 і життєвий цикл на основі сцен.

