EAS Submit iOS: як опублікувати Expo-застосунок в App Store
Автор: Mehdi Azizi
Опубліковано , 8 хв
EAS Submit надсилає твій iOS-білд в App Store Connect, і він з'являється в TestFlight. Відправити на рев'ю треба самому в App Store Connect.
eas submit --platform ios надсилає твій iOS-білд в App Store Connect, де він з'являється в TestFlight після обробки на боці Apple. Команда не відправляє твій застосунок на рев'ю Apple: вибрати білд і відправити його на рев'ю ти маєш сам в App Store Connect. Щоб автоматизувати відправлення, їй потрібен номер твоєї картки застосунку (ascAppId) і API-ключ App Store Connect.
Я публікую свої iOS-застосунки, зокрема Solys, TradaZen і Nolera, через Expo, EAS Build і EAS Submit. Цей гайд спирається на документацію Expo про відправлення для iOS, яку я перечитав 25 жовтня 2026 року. Якщо в тебе немає Mac, увесь шлях описано в статті як опублікувати iOS-застосунок без Mac. Тут зосередимося саме на відправленні.
Що потрібно до першої команди
Expo називає три передумови:
- Платний акаунт Apple Developer. Ціну й реєстрацію описано в статті акаунт розробника Apple.
- Bundle identifier у
ios.bundleIdentifier. Згідно з довідником конфігурації Expo, ти придумуєш його сам, але він має бути унікальним в App Store. - Встановлений EAS CLI, а потім
eas loginзі своїм акаунтом Expo.
Ще тобі потрібен підписаний продакшн-білд. EAS Build збирає його з сертифікатом і профілем, якими сам керує за тебе. Про це розповідає стаття сертифікат і provisioning profile в iOS.
Картка в App Store Connect: створюєш ти чи EAS?
EAS Submit надсилає бінарник до застосунку, який уже має існувати в App Store Connect.
Ти можеш створити картку сам. Довідка Apple описує вікно New App: платформа, назва, основна мова, bundle identifier, SKU і доступ користувачів. Потрібна роль Account Holder, Admin або App Manager.
EAS теж може створити її під час першого відправлення. Згідно зі сторінкою Expo про TestFlight, eas submit створює картку, коли ти надсилаєш перший білд. За довідником eas.json, якщо вказати ascAppId, цей крок пропускається. Назва береться з appName, а якщо його немає, то з name у твоїй конфігурації. Основна мова береться з language, за замовчуванням en-US. Якщо твій застосунок спершу виходить французькою, заповни language до першого відправлення.
Потім скопіюй номер картки в ascAppId. Expo пояснює, де його знайти: відкрий свій застосунок в App Store Connect, потім App Information. Це поле Apple ID у розділі General Information. Це число, а не твій bundle identifier.
Чому API-ключ, а не Apple ID
EAS Submit підключається до Apple через твій Apple ID або через API-ключ App Store Connect.
Apple ID упирається у двофакторну автентифікацію, яку Apple вимагає від усіх користувачів App Store Connect: вхід має підтвердити людина. Пароль застосунку, переданий у EXPO_APPLE_APP_SPECIFIC_PASSWORD, обходить цей крок, але Expo вважає його менш безпечним, ніж API-ключ, який є методом за замовчуванням і рекомендованим. Ключ дає змогу автентифікуватися без жодної взаємодії, а отже автоматизувати відправлення.
Отримати його можна двома шляхами:
- Нехай EAS керує ним. Запусти
eas credentials --platform ios, вибери профільproduction, увійди в акаунт Apple і вибери «App Store Connect: Manage your API Key». - Принеси власний ключ. В App Store Connect: Users and Access, вкладка Integrations, App Store Connect API, Team Keys, потім Generate API Key. Потрібен акаунт Admin, а гайд Expo дає ключу роль Admin.
У другому випадку запиши Key ID зі списку активних ключів та Issuer ID, який показано вгорі сторінки Integrations. А головне, збережи файл .p8: завантажити його можна лише один раз, і Apple не зберігає його копії.
За словами Apple, ключ Admin може створювати й видаляти користувачів твого акаунта. Apple просить ніколи не зберігати ключ у репозиторії з кодом.
Мінімальний eas.json, який можна скопіювати
Усі значення вигадані: заміни їх своїми.
{
"cli": {
"appVersionSource": "remote"
},
"build": {
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {
"ios": {
"ascAppId": "1234567890",
"appleTeamId": "ABCDE12345",
"ascApiKeyPath": "./keys/AuthKey_XXXXXXXXXX.p8",
"ascApiKeyIssuerId": "your-issuer-id",
"ascApiKeyId": "XXXXXXXXXX"
}
}
}
}
appVersionSourceіautoIncrement: сервери EAS зберігають номер білда й збільшують його з кожним продакшн-білдом. Expo рекомендує цей віддалений режим починаючи з EAS CLI 12.ascAppId: номер твоєї картки. Без нього неінтерактивний режим падає.appleTeamId: ідентифікатор твоєї команди в Apple Developer.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: твій API-ключ. Усі три поля приймають змінні оточення. Додай папкуkeysу свій.gitignore.
Поле appleId потрібне, лише якщо ти входиш через Apple ID. Якщо EAS уже керує твоїм ключем, прибери й три поля ascApiKey. У моїх трьох застосунках, які я перевірив 25 жовтня, продакшн-профіль відправлення містить лише ascAppId, плюс appleTeamId у Solys: жодного ключа у файлі.
Запускаємо білд, а потім відправлення
eas build --platform ios --profile production
eas submit --platform ios
Без додаткових опцій eas submit просить тебе вибрати білд для відправлення, а під час першого запуску питає твій Apple ID. Профіль відправлення production використовується за замовчуванням, якщо він існує. Довідник EAS CLI перелічує опції, які звільняють від вибору:
| Опція | Що робить |
|---|---|
--latest | Надсилає останній iOS-білд |
--id | Надсилає конкретний EAS-білд |
--path | Надсилає локальний файл .ipa |
--url | Надсилає архів за посиланням |
--groups | Додає до внутрішньої групи |
--what-to-test | Заповнює «What to test» |
Щоб усе йшло одне за одним, додай --auto-submit до команди білда. Згідно зі сторінкою Expo про автоматичне відправлення, готовий білд іде в EAS Submit з профілем відправлення, що має ту саму назву, що й профіль білда. Щоб вибрати інший: --auto-submit-with-profile=name. Білд іде в TestFlight, а не на рев'ю.
У CI додай --non-interactive і токен EXPO_TOKEN. Тоді команда не може нічого в тебе спитати: їй потрібен ascAppId у профілі та API-ключ, або той, який EAS прив'язав до застосунку, або твій у трьох полях ascApiKey.
Що відбувається після відправлення
1. Apple обробляє білд. Він має пройти цю обробку, перш ніж з'явиться в App Store Connect, і наприкінці Apple надсилає тобі e-mail. Expo зазвичай говорить про 10-15 хвилин, перш ніж білд видно в TestFlight.
2. Експортна відповідність. Статус Missing Compliance означає, що бракує твоєї декларації про шифрування. App Store Connect ставить ці запитання для кожної нової версії, якщо Info.plist уже на них не відповідає. В Expo цей ключ називається ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Згідно з Apple, false підходить, якщо твій застосунок разом із бібліотеками не використовує шифрування взагалі або використовує лише звільнене від декларування. Системне шифрування, як-от HTTPS через URLSession, зазвичай таким і є. Вказуй false, лише якщо це правда для твого застосунку: за декларацію відповідаєш ти. Як і будь-який ключ Info.plist, вона потребує нового білда.
3. TestFlight. На статусі Ready to Submit, за словами Apple, білд можна дати внутрішнім тестувальникам, відправити на бета-рев'ю для зовнішніх або на рев'ю App Store. Поле groups у профілі додає його до твоїх внутрішніх груп. Усе інше описано в статті TestFlight для тестування застосунку.
Відправлення не дорівнює поданню на рев'ю
Expo прямо пише: білд у TestFlight не публікується в App Store автоматично. EAS Submit не заповнює ні твою картку, ні скриншоти. В App Store Connect лишається чотири дії, описані в довідці Apple про відправлення на рев'ю:
- Заповни обов'язкові метадані версії.
- Вибери білд у розділі Build цієї версії.
- Натисни «Add for Review». Версія переходить у статус Ready for Review, але на рев'ю ще нічого не пішло.
- Натисни «Submit for Review». Статус змінюється на In Review, коли рев'ю починається.
Типові помилки та як їх виправити
| Показана помилка | Причина | Виправлення |
|---|---|---|
| ITMS-90189 | Номер білда вже зайнятий | autoIncrement |
| ITMS-90062 або 90186 | Версію вже закрито | Підняти version |
| «Set ascAppId» | Немає ascAppId у CI | Додати ascAppId |
| «API Keys cannot» | Жодного прив'язаного ключа | eas credentials |
| ITMS-90683 | Немає пояснення доступу | ios.infoPlist |
| ITMS-91053 | Неповний маніфест | ios.privacyManifests |
| ITMS-90725 | Застарілий iOS SDK | Підняти Expo SDK |
| Missing Compliance | Шифрування не задекларовано | usesNonExemptEncryption |
За словами Expo, уже використаний номер білда є частою причиною відмови під час відправлення: усе про це в статті номер білда і версія. Три помилки мають окремі гайди: ITMS-90683 з Expo, ITMS-91053 з Expo та ITMS-90725.
Два повідомлення в лапках надходять від EAS і виправляються в його конфігурації. Missing Compliance також можна закрити, відповівши на запитання в App Store Connect. Для всіх інших рядків виправлення зачіпає бінарник: збери білд заново й надішли його ще раз. Віддалене оновлення не змінює ні Info.plist, ні маніфест, ні номери.
Як відправити перший застосунок без спроб навмання
Команда лише один із кроків. iOS Kit стартує з коду, на якому побудовано мої застосунки, разом із підписками, і веде чотирма етапами аж до App Store у твоєму темпі.
Якщо готуєш свій перший реліз, пройди безкоштовну діагностику: вона покаже, що тебе насправді гальмує, і надішле мій чек-лист проти відмов Apple. Про картку, скриншоти й перевірку розповідає сторінка як опублікувати застосунок в App Store, крок за кроком.
Поширені запитання
Як опублікувати Expo-застосунок в App Store?
Запусти продакшн-білд через EAS Build, а потім надішли його командою eas submit --platform ios. Після обробки на боці Apple він з'явиться в TestFlight. Далі в App Store Connect заповни картку, вибери цей білд у версії й натисни «Add for Review», а потім «Submit for Review».
Чи відправляє EAS Submit мій застосунок на рев'ю Apple?
Ні. EAS Submit надсилає бінарник в App Store Connect, і білд потрапляє в TestFlight. На рев'ю ти відправляєш вручну в App Store Connect, коли картку заповнено й білд вибрано.
Де знайти ascAppId мого застосунку?
В App Store Connect відкрий свій застосунок, потім App Information. Це поле Apple ID у розділі General Information. Це число, не плутай його зі своїм bundle identifier.
Чи потрібен Apple ID, щоб користуватися eas submit?
Під час першого запуску команда його попросить. Далі, якщо в профілі є ascAppId і є API-ключ App Store Connect, вона може працювати без взаємодії, навіть у CI. API-ключ є методом за замовчуванням, який рекомендує Expo.
Скільки чекати, поки білд з'явиться в TestFlight?
Expo зазвичай говорить про 10-15 хвилин обробки в Apple, а наприкінці Apple надсилає тобі e-mail. Якщо білд застряг у статусі Missing Compliance, дай відповіді на запитання про шифрування, а потім задекларуй його у своїй конфігурації для наступних білдів.