eas submit iOS: najczęstsze błędy i jak je naprawić
Autor: Mehdi Azizi
Opublikowano , 10 min
eas submit się wywala? Prawdziwe komunikaty EAS i App Store Connect, ich przyczyny i poprawki: ascAppId, klucz API, umowa Apple, kody ITMS.
Kiedy eas submit --platform ios kończy się błędem, komunikat prawie zawsze mówi, gdzie szukać. Albo twoja konfiguracja EAS jest niekompletna, albo blokuje twoje konto Apple, albo Apple odrzuca binarkę. Dwa pierwsze przypadki naprawisz w kilka minut, bez nowego buildu. Trzeci rozpoznasz po kodzie ITMS i prawie zawsze wymaga nowego buildu.
Publikuję swoje aplikacje iOS, w tym Solys, TradaZen i Nolera, z Expo i EAS. Cytowane tu komunikaty są skopiowane z kodu źródłowego EAS CLI, z oficjalnego repozytorium Expo na GitHubie, przejrzanego 3 listopada 2026. Stare forum Expo przekierowuje teraz na Discorda: kod pozostaje najpewniejszym źródłem. Pełną ścieżkę, od pliku eas.json do wysłania do recenzji, znajdziesz najpierw w EAS Submit iOS: publikacja aplikacji Expo w App Store. Tutaj naprawiamy.
Co robi eas submit i czego potrzebuje
Według dokumentacji Expo polecenie wysyła twój plik .ipa do App Store Connect. Build pojawia się w TestFlight po przetworzeniu przez Apple, zwykle po 10 do 15 minutach. Nie wysyła twojej aplikacji do recenzji: ten krok robisz sam w App Store Connect.
Strona Expo o wysyłce na iOS wymienia trzy wymagania:
- płatne konto Apple Developer, wymagane przy każdej wysyłce do App Store;
- identyfikator bundle w
ios.bundleIdentifier; - zainstalowane EAS CLI, zalogowane na twoje konto Expo.
Do wysyłki bez interakcji ta sama strona dodaje dwa ustawienia:
ascAppIdw profilusubmitweas.json, czyli numer twojej karty w App Store Connect;- klucz API App Store Connect, zarządzany przez EAS albo dostarczony przez ciebie. Jego tworzenie, rolę i unieważnianie opisuję w klucz API App Store Connect (.p8).
Minimalny profil to kilka linijek. Wartość jest przykładowa:
{
"submit": {
"production": {
"ios": {
"ascAppId": "1234567890"
}
}
}
}
Jeśli EAS już przechowuje twój klucz API, ten profil wystarczy. Tak jest w większości moich aplikacji.
Jak czytać komunikat: trzy rodziny błędów
Zanim zaczniesz szukać poprawki, sprawdź, w którym momencie polecenie się zatrzymuje. Ta tabela to schemat, który stosuję przy każdym niepowodzeniu.
| Moment błędu | Rodzina | Nowy build? |
|---|---|---|
| Przed jakąkolwiek wysyłką | Konfiguracja EAS | Nie |
| Łączenie z Apple, tworzenie karty | Konto Apple | Nie |
| Po wysyłce, kod ITMS-90xxx | Odrzucona binarka | Prawie zawsze |
Szczegóły przeczytasz na stronie danego zgłoszenia w panelu Expo. Expo radzi, żeby czytać tam logi i szukać dymka „Build Annotations”, który wskazuje typowe przyczyny błędów. W terminalu opcja --verbose zawsze wyświetla logi EAS Submit, według dokumentacji EAS CLI.
Błędy konfiguracji EAS
„Set ascAppId in the submit profile (eas.json) or re-run this command in interactive mode.”
Uruchomiłeś polecenie z --non-interactive, na przykład w CI, a twój profil nie zawiera ascAppId. Kod EAS CLI wtedy się zatrzymuje: nie może zadać ci pytania ani utworzyć karty za ciebie.
Poprawka: przepisz numer karty do ascAppId. Expo pokazuje, gdzie go znaleźć: w App Store Connect otwórz swoją aplikację, potem App Information. To pole Apple ID w sekcji General Information, liczba z mniej więcej dziesięcioma cyframi. To nie jest ani twój e-mail Apple, ani identyfikator bundle.
W Nolerze bez ascAppId polecenie żądało ode mnie sesji Apple Developer, która wygasa. Odkąd numer jest w eas.json, wysyłka o nic już nie pyta.
Dodaj
ascAppIdprzed buildem, nie po. Do SDK 57 odcisk liczony przez Expo zawsze obejmujeeas.json. W Vigie, której runtime version korzysta z politykifingerprint, dodanie tego numeru po buildzie zmieniło odcisk: aktualizacja opublikowana później nigdy nie dotarłaby do zainstalowanego buildu. Od SDK 58 domyślne ustawienie odcisku,balanced, ignorujeeas.json, według changeloga Expo.
„App Store Connect API Keys cannot be set up in --non-interactive mode.”
Twój profil nie zawiera klucza, a EAS nie ma żadnego przypisanego do twojej aplikacji. Expo to wyjaśnia: w trybie nieinteraktywnym polecenie nie może poprosić cię o klucz i kończy się tym komunikatem.
Dwie możliwe poprawki:
- Pozwól EAS utworzyć i przechowywać klucz. Uruchom raz
eas credentials --platform iosw trybie interaktywnym na swoim komputerze i pozwól mu skonfigurować klucz API App Store Connect dla twojej aplikacji. - Użyj własnego klucza w
ascApiKeyPath,ascApiKeyIssuerIdiascApiKeyId. Według dokumentacji eas.json te trzy pola przyjmują zmienne środowiskowe, takie jak$ASC_API_KEY_PATH.
W mojej ostatniej aplikacji opcja --auto-submit chciała Apple ID, żeby utworzyć swój klucz do wysyłki. Wpisałem trzy pola mojego własnego klucza do profilu w lokalnej kopii roboczej, nigdy niecommitowanej. Potem wysłałem gotowy build z --id i --non-interactive.
„EXPO_APPLE_APP_SPECIFIC_PASSWORD must be in the format xxxx-xxxx-xxxx-xxxx, where x is a lowercase letter.”
Zmienna zawiera coś innego niż hasło dla aplikacji, często samo twoje hasło Apple. EAS CLI sprawdza ten format przed jakąkolwiek wysyłką.
Według pomocy Apple hasło dla aplikacji generujesz na account.apple.com, w sekcji App-Specific Passwords, z włączonym uwierzytelnianiem dwuskładnikowym. Zostaje unieważnione, gdy tylko zmienisz hasło do konta Apple. Expo uważa tę metodę za mniej bezpieczną niż klucz API, który jest jego domyślną i zalecaną metodą.
Błędy konta Apple
„… agree to the latest Program License Agreement in your developer account.”
Pełny komunikat zaczyna się od „You currently don't have access to this membership resource”. Po stronie Apple surowa odpowiedź może zawierać „Unable to process request - PLA Update available”. Nowsze kroki wysyłki EAS pokazują raczej „A required Apple agreement is missing or has expired”.
Przyczyna jest ta sama: Apple zaktualizowało umowę i nikt jej nie zaakceptował. Tylko właściciel konta, Account Holder, może akceptować umowy, według tabeli ról Apple. Kod EAS prosi go o przejście przez stronę Business w App Store Connect, a potem, jeśli Apple to zaproponuje, przez jego konto na developer.apple.com. Następnie uruchom polecenie ponownie. Umowa dla płatnych aplikacji ma osobny poradnik: Paid Apps Agreement w App Store Connect.
„App Store Connect rejected the API authentication credentials.”
Apple odpowiedziało błędem 401, NOT_AUTHORIZED. EAS podaje trzy przyczyny: klucz, który nie jest już aktywny, klucz z innego konta App Store Connect albo błędny Key ID, treść klucza lub Issuer ID.
Sprawdź oba identyfikatory w App Store Connect, w menu Users and Access, zakładka Integrations. Według Apple Issuer ID wyświetla się na górze strony, a Key ID na liście aktywnych kluczy. Unieważnionego klucza nigdy nie da się reaktywować. Apple pokazuje go przez 30 dni w sekcji Revoked: musisz wygenerować nowy.
„App Store Connect app for application identifier … was not found.”
Karty wskazanej przez ascAppId nie da się znaleźć z twoim kluczem. EAS prosi, żebyś sprawdził ten numer i to, czy klucz ma dostęp do aplikacji na właściwym koncie. Wypisuje nawet kilka aplikacji widocznych z tym kluczem. W narzędziach do wysyłki Apple ten sam problem wygląda jako „No suitable application records were found”.
Powtarzają się trzy przyczyny, z czego dwie wskazano w tym wątku na forum Apple:
- Karta nie istnieje. Utwórz ją w App Store Connect albo usuń
ascAppId, żeby polecenie ją utworzyło. - Numer pochodzi z innego konta. Skopiowałeś
ascAppIdinnego zespołu albo innego projektu. - Użytkownik nie ma dostępu do aplikacji. App Manager albo Developer może mieć dostęp ograniczony do wybranych aplikacji. Klucz zespołowy natomiast ma dostęp do wszystkich aplikacji na koncie.
„… is not available to team” albo „… is not available to provider”
Ten komunikat pojawia się, gdy EAS tworzy kartę za ciebie, bo brakuje ascAppId. Identyfikator bundle jest już zajęty przez inny zespół. EAS prosi, żebyś zmienił go w konfiguracji aplikacji i uruchomił polecenie ponownie.
„App name "…" is already taken. Using generated name "…"”
To nie jest błąd. Gdy nazwa jest już zajęta w App Store, EAS dodaje sześć losowych znaków i próbuje ponownie, maksymalnie pięć razy. Nazwę karty zmienisz później w App Store Connect. Żeby tego uniknąć, uzupełnij appName i language w profilu przed pierwszą wysyłką: bez language językiem głównym jest en-US.
Błędy binarki: kody ITMS
Po wysyłce Apple przetwarza build. Jeśli go odrzuci, log podaje jeden lub kilka kodów ITMS. Oto te, które krok wysyłki EAS rozpoznaje i tłumaczy:
| Kod ITMS | Co odrzuca Apple | Poprawka |
|---|---|---|
| 90189 | Numer buildu już zajęty | autoIncrement |
| 90062, 90186, 90478 | Wersja zamknięta lub już przekroczona | Podnieś version |
| 90683 | Brak opisu uprawnienia | ios.infoPlist |
| 90725 | Zbyt stary iOS SDK | Obraz iOS lub SDK Expo |
| 90054, 90055 | Bundle inny niż we wskazanej karcie | Popraw ascAppId |
| 90022, 90023, 90391, 90713 | Brakujące lub źle zadeklarowane ikony | Sprawdź ikony |
| 90771 | Brak identyfikatorów zadań w tle | ios.infoPlist |
Trzy uwagi wynikające z tych komunikatów:
- Numer buildu jest unikalny w obrębie wersji. Przy 90189 EAS zaleca
"autoIncrement": trueweas.json. Wszystko znajdziesz w numer buildu i wersja. - Przy 90725 EAS radzi wybrać nowszy obraz iOS w
eas.json, a w razie potrzeby przejść na wspierane SDK Expo. - Przy 90771 twój Info.plist deklaruje tryb działania w tle
processing, ale bez kluczaBGTaskSchedulerPermittedIdentifiers.
Poza 90054 i 90055, gdzie wystarczy wskazać właściwą kartę albo inny build, poprawka dotyczy binarki: zrób nowy build, a potem wyślij go ponownie. Dwa kody mają osobne poradniki: ITMS-90683 z Expo i ITMS-90725.
Pod koniec września 2026 build Solys został odrzucony przy dostarczeniu z powodu ITMS-90683. Podczas porządków w pliku konfiguracyjnym usunąłem opis uprawnienia do zdjęć. Solys nie korzysta ze zdjęć, ale jedna z bibliotek w projekcie wywołuje API Photos w iOS. Apple analizuje binarkę, a nie faktyczne użycie: od tamtej pory nigdy nie usuwam tych opisów.
Status Missing Compliance to natomiast nie błąd wysyłki. Brakuje twojej deklaracji dotyczącej szyfrowania, opisanej w poradniku publikacji z EAS.
Moja checklista przed każdą wysyłką
ascAppIdjest w profilusubmit, dodany przed buildem.- Klucz API jest zarządzany przez EAS albo jego trzy pola wskazują na plik
.p8trzymany poza repozytorium. - Account Holder zaakceptował najnowsze umowy w App Store Connect.
autoIncrementjest włączony, razem z"appVersionSource": "remote", zalecanym przez Expo od EAS CLI 12.versionjest wyższa niż ostatnia zatwierdzona wersja.- Każde wrażliwe API obecne w binarce ma swój opis uprawnienia.
- W nowej aplikacji
appNameilanguagesą uzupełnione przed pierwszą wysyłką.
Wyślij swoją pierwszą aplikację bez blokad
Polecenie to tylko jeden krok. iOS & Android Kit startuje od kodu bazowego moich aplikacji, razem z subskrypcjami, i prowadzi przez cztery etapy aż do App Store, w twoim tempie.
Jeśli przygotowujesz swoją pierwszą premierę, zrób darmową diagnozę: powie ci, co naprawdę cię blokuje, i wyśle ci moją checklistę przeciw odrzuceniom przez Apple. Jeśli chodzi o kartę, zrzuty ekranu i zatwierdzenie, strona publikacja aplikacji w App Store omawia każdy krok.
Najczęściej zadawane pytania
Dlaczego eas submit kończy się błędem tylko w CI?
W trybie --non-interactive polecenie nie może cię o nic zapytać. Potrzebuje ascAppId w profilu i klucza API już przypisanego do aplikacji albo jego trzech pól w eas.json. Na twoim komputerze zadałoby ci te pytania.
Czy po błędzie eas submit trzeba robić nowy build?
Tylko jeśli Apple odrzuci binarkę z kodem ITMS. Wyjątek: przy ITMS-90054 i 90055 build trafił do złej karty, wystarczy wysłać go do właściwej. Błędy konfiguracji i konta naprawiasz w eas.json, w App Store Connect albo na koncie Apple. Potem wysyłasz ten sam build, na przykład z --latest albo --id.
Gdzie zobaczyć logi wysyłki EAS Submit?
Na stronie zgłoszenia w panelu Expo. Expo radzi czytać tam logi i dymek „Build Annotations”. W terminalu dodaj --verbose, żeby zawsze wyświetlać logi.
Czy można użyć eas submit z darmowym kontem Apple?
Nie. Expo wymaga płatnego konta Apple Developer do wysłania aplikacji do App Store. Darmowe konto pozwala testować na własnym iPhonie, ale nie korzystać z App Store Connect.
Jaką rolę nadać kluczowi API dla eas submit?
Poradnik Expo nadaje kluczowi rolę Admin. Według tabeli ról Apple wysyłanie buildów jest dostępne także dla ról App Manager i Developer. Moje buildy Expo działają z kluczem zespołowym o roli App Manager. Tylko Account Holder i Admini mogą generować klucz zespołowy.
Co oznacza „Increment Build Number” w EAS?
Apple odrzuciło build z kodem ITMS-90189: ten numer buildu już istnieje dla tej wersji. Włącz "autoIncrement": true w eas.json albo podnieś ios.buildNumber, a potem zrób nowy build.

