# EAS Submit iOS: publikacja aplikacji Expo w App Store

> EAS Submit wysyła build iOS do App Store Connect, gdzie trafia do TestFlight. Do recenzji zgłaszasz go sam w App Store Connect. Plik eas.json i typowe błędy.

Oryginalna strona: [EAS Submit iOS: publikacja aplikacji Expo w App Store](https://devoria.fr/pl/blog/eas-submit-ios-publikacja-aplikacji-expo-app-store)
Autor: [Mehdi Azizi](https://devoria.fr/pl/mehdi-azizi)
Publikacja: 2026-10-25
Ostatnia aktualizacja treści: 2026-10-25


`eas submit --platform ios` wysyła twój build iOS do App Store Connect, gdzie po przetworzeniu przez Apple pojawia się w TestFlight. **Komenda nie zgłasza aplikacji do recenzji Apple: wybór buildu i wysłanie do recenzji robisz sam w App Store Connect.** Żeby to zautomatyzować, potrzebuje numeru twojej karty aplikacji (`ascAppId`) i klucza API App Store Connect.

Publikuję swoje aplikacje iOS, w tym Solys, TradaZen i Nolera, za pomocą Expo, EAS Build i EAS Submit. Ten poradnik opiera się na [dokumentacji Expo o wysyłce na iOS](https://docs.expo.dev/submit/ios/), sprawdzonej 25 października 2026. Jeśli nie masz Maca, całą ścieżkę znajdziesz w [publikacji aplikacji iOS bez Maca](https://devoria.fr/pl/blog/publikacja-aplikacji-ios-bez-maca-expo-eas). Tutaj skupiamy się na samej wysyłce.

## Czego potrzebujesz przed pierwszą komendą

Expo wymienia trzy wymagania:

- **Płatne konto Apple Developer.** Cena i rejestracja są opisane w [koncie dewelopera Apple](https://devoria.fr/pl/blog/konto-deweloperskie-apple-cena).
- **Identyfikator pakietu (bundle identifier)** w `ios.bundleIdentifier`. Według [dokumentacji konfiguracji Expo](https://docs.expo.dev/versions/latest/config/app/) wymyślasz go sam, ale musi być unikalny w App Store.
- **Zainstalowane EAS CLI**, a potem `eas login` na twoje konto Expo.

Potrzebujesz też podpisanego buildu produkcyjnego. EAS Build tworzy go z certyfikatem i profilem, którymi zarządza za ciebie, co wyjaśniam w certyfikacie i provisioning profile iOS.

### Karta aplikacji w App Store Connect: ty czy EAS?

EAS Submit wysyła plik binarny do aplikacji, która musi istnieć w App Store Connect.

**Możesz ją utworzyć sam.** [Pomoc Apple](https://developer.apple.com/help/app-store-connect/create-an-app-record/add-a-new-app) opisuje okno New App: platforma, nazwa, język główny, identyfikator pakietu, SKU i dostęp użytkowników. Potrzebujesz roli Account Holder, Admin lub App Manager.

**EAS może też utworzyć ją przy pierwszej wysyłce.** Według [strony Expo o TestFlight](https://docs.expo.dev/submit/testflight/) `eas submit` tworzy kartę, gdy wysyłasz pierwszy build. Zgodnie z [dokumentacją eas.json](https://docs.expo.dev/eas/json/) podanie `ascAppId` pomija ten krok. Nazwa pochodzi z `appName`, a w razie jego braku z `name` w twojej konfiguracji. Język główny pochodzi z `language`, domyślnie `en-US`. **Jeśli twoja aplikacja wychodzi najpierw po francusku, ustaw `language` przed tą pierwszą wysyłką.**

Potem przepisz numer karty do `ascAppId`. Expo podaje, gdzie go znaleźć: otwórz aplikację w App Store Connect, a potem App Information. To pole Apple ID w sekcji General Information. **To liczba, a nie twój identyfikator pakietu.**

## Dlaczego klucz API, a nie twój Apple ID

EAS Submit łączy się z Apple przez twój Apple ID albo przez klucz API App Store Connect.

Apple ID rozbija się o uwierzytelnianie dwuskładnikowe, którego [Apple wymaga](https://developer.apple.com/support/authentication/) od wszystkich użytkowników App Store Connect: ktoś musi potwierdzić logowanie. Hasło dla aplikacji, przekazane w `EXPO_APPLE_APP_SPECIFIC_PASSWORD`, omija ten krok, ale [Expo uważa je za mniej bezpieczne](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md) od klucza API, który jest metodą domyślną i zalecaną. **Klucz pozwala uwierzytelnić się bez żadnej interakcji, a więc zautomatyzować wysyłkę.**

Masz dwie drogi, żeby go zdobyć:

- **Niech EAS nim zarządza.** Uruchom `eas credentials --platform ios`, wybierz profil `production`, zaloguj się na konto Apple, a potem wybierz „App Store Connect: Manage your API Key”.
- **Użyj własnego klucza.** W App Store Connect: Users and Access, zakładka Integrations, App Store Connect API, Team Keys, potem Generate API Key. Potrzebujesz konta Admin, a [poradnik Expo](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) nadaje kluczowi rolę Admin.

W drugim przypadku zanotuj Key ID, widoczny na liście aktywnych kluczy, oraz Issuer ID, [na górze strony Integrations](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests). Przede wszystkim zachowaj plik `.p8`: [możesz go pobrać tylko raz](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), a Apple nie trzyma żadnej kopii.

> Według Apple klucz Admin może tworzyć i usuwać użytkowników twojego konta. Apple prosi, żeby nigdy nie trzymać klucza w repozytorium kodu.

## Minimalny plik eas.json do skopiowania

Wszystkie wartości są fikcyjne: podmień je na swoje.

```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` i `autoIncrement`**: serwery EAS przechowują numer buildu i podbijają go przy każdym buildzie produkcyjnym. [Expo zaleca ten tryb zdalny](https://docs.expo.dev/build-reference/app-versions/) od EAS CLI 12.
- **`ascAppId`**: numer twojej karty aplikacji. Bez niego tryb nieinteraktywny się wysypuje.
- **`appleTeamId`**: identyfikator twojego zespołu Apple Developer.
- **`ascApiKeyPath`, `ascApiKeyIssuerId`, `ascApiKeyId`**: twój klucz API. Wszystkie trzy pola przyjmują zmienne środowiskowe. Dodaj folder `keys` do `.gitignore`.

Pole `appleId` przydaje się tylko wtedy, gdy logujesz się przez Apple ID. Jeśli EAS już zarządza twoim kluczem, usuń też trzy pola `ascApiKey`. W moich trzech aplikacjach, sprawdzonych 25 października, produkcyjny profil wysyłki zawiera tylko `ascAppId`, plus `appleTeamId` w Solys: żadnego klucza w pliku.

## Uruchom build, a potem wysyłkę

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

Bez dodatkowych opcji `eas submit` każe ci wybrać build do wysłania, a przy pierwszym uruchomieniu pyta o Apple ID. Profil wysyłki `production` jest używany domyślnie, jeśli istnieje. [Dokumentacja EAS CLI](https://docs.expo.dev/eas/cli/) wymienia opcje, które pozwalają pominąć wybór:

| Opcja            | Co robi                     |
| ---------------- | --------------------------- |
| `--latest`       | Wysyła ostatni build iOS    |
| `--id`           | Wysyła konkretny build EAS  |
| `--path`         | Wysyła lokalny plik .ipa    |
| `--url`          | Wysyła archiwum z sieci     |
| `--groups`       | Dodaje do grupy wewnętrznej |
| `--what-to-test` | Wypełnia „What to test”     |

Żeby wszystko poszło jednym ciągiem, dodaj `--auto-submit` do komendy buildu. Według [strony Expo o automatycznej wysyłce](https://docs.expo.dev/build/automate-submissions/) gotowy build trafia do EAS Submit z profilem wysyłki o tej samej nazwie co profil buildu. Żeby wybrać inny: `--auto-submit-with-profile=nazwa`. **Build trafia do TestFlight, a nie do recenzji.**

W ciągłej integracji (CI) dodaj `--non-interactive` i token `EXPO_TOKEN`. Komenda nie może wtedy o nic cię zapytać: potrzebuje `ascAppId` w profilu i klucza API, albo tego, który EAS przypisał do aplikacji, albo twojego w trzech polach `ascApiKey`.

## Co się dzieje po wysyłce

**1. Apple przetwarza build.** Musi przejść to przetwarzanie, zanim pojawi się w App Store Connect, a [Apple wysyła ci e-mail](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds) na koniec. Expo mówi zwykle o 10 do 15 minutach, zanim zobaczysz go w TestFlight.

**2. Zgodność eksportowa.** Status Missing Compliance oznacza, że brakuje twojej deklaracji dotyczącej szyfrowania. App Store Connect zadaje te pytania przy każdej nowej wersji, chyba że Info.plist już na nie odpowiada. W Expo klucz nazywa się `ios.config.usesNonExemptEncryption`:

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

Według [Apple](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations) `false` pasuje, jeśli twoja aplikacja, łącznie z bibliotekami, nie używa żadnego szyfrowania albo tylko szyfrowania zwolnionego. Szyfrowanie systemowe, takie jak HTTPS przez URLSession, zwykle jest zwolnione. **Deklaruj `false` tylko wtedy, gdy to prawda dla twojej aplikacji: ta deklaracja cię zobowiązuje.** Jak każdy klucz Info.plist, wymaga nowego buildu.

**3. TestFlight.** Przy statusie Ready to Submit, [według Apple](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses), build może trafić do testerów wewnętrznych, przejść recenzję beta dla zewnętrznych albo pójść do recenzji App Store. Pole `groups` w profilu dodaje go do twoich grup wewnętrznych. Całą resztę znajdziesz w [TestFlight do testowania aplikacji](https://devoria.fr/pl/blog/testflight-testowanie-aplikacji-iphone).

## Wysyłka to nie zgłoszenie do recenzji

[Expo pisze to wprost](https://docs.expo.dev/submit/introduction/): build w TestFlight nie jest automatycznie publikowany w App Store. EAS Submit nie wypełnia ani karty aplikacji, ani zrzutów ekranu. Zostają cztery kroki w App Store Connect, opisane w [pomocy Apple o wysyłce do recenzji](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-app):

1. **Wypełnij wymagane metadane** wersji.
2. **Wybierz build** w sekcji Build wersji.
3. **Kliknij „Add for Review”.** Wersja przechodzi w Ready for Review, ale nic jeszcze nie poszło do recenzji.
4. **Kliknij „Submit for Review”.** Status zmienia się na In Review, gdy recenzja się zaczyna.

## Częste błędy i jak je naprawić

| Wyświetlany błąd     | Przyczyna                    | Naprawa                   |
| -------------------- | ---------------------------- | ------------------------- |
| ITMS-90189           | Numer buildu już zajęty      | `autoIncrement`           |
| ITMS-90062 lub 90186 | Wersja już zamknięta         | Podbij `version`          |
| „Set ascAppId”       | Brak `ascAppId` w CI         | Dodaj `ascAppId`          |
| „API Keys cannot”    | Brak przypisanego klucza     | `eas credentials`         |
| ITMS-90683           | Brak opisu celu dostępu      | `ios.infoPlist`           |
| ITMS-91053           | Niekompletny manifest        | `ios.privacyManifests`    |
| ITMS-90725           | Za stare SDK iOS             | Podbij SDK Expo           |
| Missing Compliance   | Niezadeklarowane szyfrowanie | `usesNonExemptEncryption` |

Według Expo już użyty numer buildu to częsta przyczyna odrzucenia przy wysyłce: wszystko znajdziesz w numerze buildu i wersji. Trzy błędy mają własne poradniki: [ITMS-90683 w Expo](https://devoria.fr/pl/blog/itms-90683-missing-purpose-string-expo), [ITMS-91053 w Expo](https://devoria.fr/pl/blog/itms-91053-missing-api-declaration-expo) i ITMS-90725.

Dwa komunikaty w cudzysłowie pochodzą z EAS i naprawiasz je w jego konfiguracji. Missing Compliance załatwisz też, odpowiadając na pytania w App Store Connect. **We wszystkich pozostałych wierszach poprawka dotyczy pliku binarnego: zrób nowy build i wyślij go ponownie.** Aktualizacja zdalna nie zmienia ani Info.plist, ani manifestu, ani numerów.

## Wyślij swoją pierwszą aplikację bez błądzenia po omacku

Komenda to tylko jeden krok. [iOS Kit](https://devoria.fr/pl/kits/ios) startuje z kodu bazowego moich aplikacji, razem z subskrypcjami, i prowadzi cię przez cztery etapy aż do App Store, we własnym tempie.

Jeśli przygotowujesz swoją pierwszą premierę, [zrób darmową diagnozę](https://devoria.fr/pl/diagnostic): powie ci, co naprawdę cię blokuje, i wyśle ci moją checklistę przeciw odrzuceniom Apple. Kartę aplikacji, zrzuty ekranu i zatwierdzenie krok po kroku omawia strona [publikacja aplikacji w App Store](https://devoria.fr/pl/expertise/publikacja-aplikacji-w-app-store).

## Najczęściej zadawane pytania

### Jak opublikować aplikację Expo w App Store?

Uruchom build produkcyjny w EAS Build, a potem wyślij go przez `eas submit --platform ios`. Po przetworzeniu przez Apple pojawi się w TestFlight. Następnie w App Store Connect wypełnij kartę aplikacji, wybierz ten build w wersji i kliknij „Add for Review” oraz „Submit for Review”.

### Czy EAS Submit wysyła moją aplikację do recenzji Apple?

Nie. EAS Submit wysyła plik binarny do App Store Connect, a build trafia do TestFlight. Zgłoszenie do recenzji robisz ręcznie w App Store Connect, gdy karta jest wypełniona, a build wybrany.

### Gdzie znaleźć ascAppId mojej aplikacji?

W App Store Connect otwórz aplikację, a potem App Information. To pole Apple ID w sekcji General Information. To liczba, nie myl jej z identyfikatorem pakietu.

### Czy do eas submit potrzebny jest Apple ID?

Przy pierwszym uruchomieniu komenda o niego zapyta. Potem, z `ascAppId` w profilu i kluczem API App Store Connect, może działać bez interakcji, nawet w CI. Klucz API to metoda domyślna i zalecana przez Expo.

### Ile czasu mija, zanim build pojawi się w TestFlight?

Expo mówi zwykle o 10 do 15 minutach przetwarzania po stronie Apple, które na koniec wysyła ci e-mail. Jeśli build zostaje w statusie Missing Compliance, odpowiedz na pytania o szyfrowanie, a potem zadeklaruj je w konfiguracji dla kolejnych buildów.


## Twój projekt

[Apple Review Kit](https://devoria.fr/pl/kits/review-apple): Checklista review App Store, której używam, moje poprawione odrzucenia od Apple, notatki dla recenzenta i dwa skille Claude Code, które sprawdzają twoją aplikację. 29 €.

[iOS Kit](https://devoria.fr/pl/kits/ios): Stwórz aplikację na iPhone'a z Claude Code: Starter Code moich aplikacji, skille sprawdzające jego pracę oraz Apple Review Kit, App Store Screenshots Kit i ASO Kit. 129,99 €.
