# EAS Submit iOS: як опублікувати Expo-застосунок в App Store

> EAS Submit надсилає твій iOS-білд в App Store Connect, і він з'являється в TestFlight. Відправити на рев'ю треба самому в App Store Connect.

Оригінальна сторінка: [EAS Submit iOS: як опублікувати Expo-застосунок в App Store](https://devoria.fr/uk/blog/eas-submit-ios-publish-expo-app-store)
Автор: [Mehdi Azizi](https://devoria.fr/uk/mehdi-azizi)
Опубліковано: 2026-10-25
Останнє оновлення змісту: 2026-10-25


`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](https://docs.expo.dev/submit/ios/), яку я перечитав 25 жовтня 2026 року. Якщо в тебе немає Mac, увесь шлях описано в статті [як опублікувати iOS-застосунок без Mac](https://devoria.fr/uk/blog/publish-ios-app-without-mac-expo-eas). Тут зосередимося саме на відправленні.

## Що потрібно до першої команди

Expo називає три передумови:

- **Платний акаунт Apple Developer.** Ціну й реєстрацію описано в статті [акаунт розробника Apple](https://devoria.fr/uk/blog/akaunt-rozrobnyka-apple-tsina).
- **Bundle identifier** у `ios.bundleIdentifier`. Згідно з [довідником конфігурації Expo](https://docs.expo.dev/versions/latest/config/app/), ти придумуєш його сам, але він має бути унікальним в App Store.
- **Встановлений EAS CLI**, а потім `eas login` зі своїм акаунтом Expo.

Ще тобі потрібен підписаний продакшн-білд. EAS Build збирає його з сертифікатом і профілем, якими сам керує за тебе. Про це розповідає стаття сертифікат і provisioning profile в iOS.

### Картка в App Store Connect: створюєш ти чи EAS?

EAS Submit надсилає бінарник до застосунку, який уже має існувати в App Store Connect.

**Ти можеш створити картку сам.** [Довідка Apple](https://developer.apple.com/help/app-store-connect/create-an-app-record/add-a-new-app) описує вікно New App: платформа, назва, основна мова, bundle identifier, SKU і доступ користувачів. Потрібна роль Account Holder, Admin або App Manager.

**EAS теж може створити її під час першого відправлення.** Згідно зі [сторінкою Expo про TestFlight](https://docs.expo.dev/submit/testflight/), `eas submit` створює картку, коли ти надсилаєш перший білд. За [довідником eas.json](https://docs.expo.dev/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 вимагає](https://developer.apple.com/support/authentication/) від усіх користувачів App Store Connect: вхід має підтвердити людина. Пароль застосунку, переданий у `EXPO_APPLE_APP_SPECIFIC_PASSWORD`, обходить цей крок, але [Expo вважає його менш безпечним](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md), ніж 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](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) дає ключу роль Admin.

У другому випадку запиши Key ID зі списку активних ключів та Issuer ID, який показано [вгорі сторінки Integrations](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests). А головне, збережи файл `.p8`: [завантажити його можна лише один раз](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), і Apple не зберігає його копії.

> За словами Apple, ключ Admin може створювати й видаляти користувачів твого акаунта. Apple просить ніколи не зберігати ключ у репозиторії з кодом.

## Мінімальний eas.json, який можна скопіювати

Усі значення вигадані: заміни їх своїми.

```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 рекомендує цей віддалений режим](https://docs.expo.dev/build-reference/app-versions/) починаючи з EAS CLI 12.
- **`ascAppId`**: номер твоєї картки. Без нього неінтерактивний режим падає.
- **`appleTeamId`**: ідентифікатор твоєї команди в Apple Developer.
- **`ascApiKeyPath`, `ascApiKeyIssuerId`, `ascApiKeyId`**: твій API-ключ. Усі три поля приймають змінні оточення. Додай папку `keys` у свій `.gitignore`.

Поле `appleId` потрібне, лише якщо ти входиш через Apple ID. Якщо EAS уже керує твоїм ключем, прибери й три поля `ascApiKey`. У моїх трьох застосунках, які я перевірив 25 жовтня, продакшн-профіль відправлення містить лише `ascAppId`, плюс `appleTeamId` у Solys: жодного ключа у файлі.

## Запускаємо білд, а потім відправлення

```bash
eas build --platform ios --profile production
eas submit --platform ios
```

Без додаткових опцій `eas submit` просить тебе вибрати білд для відправлення, а під час першого запуску питає твій Apple ID. Профіль відправлення `production` використовується за замовчуванням, якщо він існує. [Довідник EAS CLI](https://docs.expo.dev/eas/cli/) перелічує опції, які звільняють від вибору:

| Опція            | Що робить                    |
| ---------------- | ---------------------------- |
| `--latest`       | Надсилає останній iOS-білд   |
| `--id`           | Надсилає конкретний EAS-білд |
| `--path`         | Надсилає локальний файл .ipa |
| `--url`          | Надсилає архів за посиланням |
| `--groups`       | Додає до внутрішньої групи   |
| `--what-to-test` | Заповнює «What to test»      |

Щоб усе йшло одне за одним, додай `--auto-submit` до команди білда. Згідно зі [сторінкою Expo про автоматичне відправлення](https://docs.expo.dev/build/automate-submissions/), готовий білд іде в 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](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds). Expo зазвичай говорить про 10-15 хвилин, перш ніж білд видно в TestFlight.

**2. Експортна відповідність.** Статус Missing Compliance означає, що бракує твоєї декларації про шифрування. App Store Connect ставить ці запитання для кожної нової версії, якщо Info.plist уже на них не відповідає. В Expo цей ключ називається `ios.config.usesNonExemptEncryption`:

```json
{
  "expo": {
    "ios": {
      "config": {
        "usesNonExemptEncryption": false
      }
    }
  }
}
```

Згідно з [Apple](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations), `false` підходить, якщо твій застосунок разом із бібліотеками не використовує шифрування взагалі або використовує лише звільнене від декларування. Системне шифрування, як-от HTTPS через URLSession, зазвичай таким і є. **Вказуй `false`, лише якщо це правда для твого застосунку: за декларацію відповідаєш ти.** Як і будь-який ключ Info.plist, вона потребує нового білда.

**3. TestFlight.** На статусі Ready to Submit, [за словами Apple](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses), білд можна дати внутрішнім тестувальникам, відправити на бета-рев'ю для зовнішніх або на рев'ю App Store. Поле `groups` у профілі додає його до твоїх внутрішніх груп. Усе інше описано в статті [TestFlight для тестування застосунку](https://devoria.fr/uk/blog/testflight-testuvannya-zastosunku-iphone).

## Відправлення не дорівнює поданню на рев'ю

[Expo прямо пише](https://docs.expo.dev/submit/introduction/): білд у TestFlight не публікується в App Store автоматично. EAS Submit не заповнює ні твою картку, ні скриншоти. В App Store Connect лишається чотири дії, описані в [довідці Apple про відправлення на рев'ю](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-app):

1. **Заповни обов'язкові метадані** версії.
2. **Вибери білд** у розділі Build цієї версії.
3. **Натисни «Add for Review».** Версія переходить у статус Ready for Review, але на рев'ю ще нічого не пішло.
4. **Натисни «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](https://devoria.fr/uk/blog/itms-90683-missing-purpose-string-expo), [ITMS-91053 з Expo](https://devoria.fr/uk/blog/itms-91053-missing-api-declaration-expo) та ITMS-90725.

Два повідомлення в лапках надходять від EAS і виправляються в його конфігурації. Missing Compliance також можна закрити, відповівши на запитання в App Store Connect. **Для всіх інших рядків виправлення зачіпає бінарник: збери білд заново й надішли його ще раз.** Віддалене оновлення не змінює ні Info.plist, ні маніфест, ні номери.

## Як відправити перший застосунок без спроб навмання

Команда лише один із кроків. [iOS Kit](https://devoria.fr/uk/kits/ios) стартує з коду, на якому побудовано мої застосунки, разом із підписками, і веде чотирма етапами аж до App Store у твоєму темпі.

Якщо готуєш свій перший реліз, [пройди безкоштовну діагностику](https://devoria.fr/uk/diagnostic): вона покаже, що тебе насправді гальмує, і надішле мій чек-лист проти відмов Apple. Про картку, скриншоти й перевірку розповідає сторінка [як опублікувати застосунок в App Store](https://devoria.fr/uk/expertise/publish-an-app-on-the-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, дай відповіді на запитання про шифрування, а потім задекларуй його у своїй конфігурації для наступних білдів.


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

[Apple Review Kit](https://devoria.fr/uk/kits/review-apple): Чекліст для review App Store, яким я користуюся, мої виправлені відмови Apple, нотатки для тестувальника і два skills Claude Code, що перевіряють твій застосунок. 29 €.

[iOS Kit](https://devoria.fr/uk/kits/ios): Створи застосунок для iPhone з Claude Code: стартовий код моїх застосунків, skills, що перевіряють його роботу, а також Apple Review Kit, App Store Screenshots Kit і ASO Kit. 129,99 €.
