EAS Submit iOS: publikacja aplikacji Expo w App Store
Autor: Mehdi Azizi
Opublikowano , 8 min
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.
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, sprawdzonej 25 października 2026. Jeśli nie masz Maca, całą ścieżkę znajdziesz w publikacji aplikacji iOS bez Maca. 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.
- Identyfikator pakietu (bundle identifier) w
ios.bundleIdentifier. Według dokumentacji konfiguracji Expo wymyślasz go sam, ale musi być unikalny w App Store. - Zainstalowane EAS CLI, a potem
eas loginna 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 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 eas submit tworzy kartę, gdy wysyłasz pierwszy build. Zgodnie z dokumentacją 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 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 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 profilproduction, 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 nadaje kluczowi rolę Admin.
W drugim przypadku zanotuj Key ID, widoczny na liście aktywnych kluczy, oraz Issuer ID, na górze strony Integrations. Przede wszystkim zachowaj plik .p8: możesz go pobrać tylko raz, 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.
{
"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"
}
}
}
}
appVersionSourceiautoIncrement: serwery EAS przechowują numer buildu i podbijają go przy każdym buildzie produkcyjnym. Expo zaleca ten tryb zdalny 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 folderkeysdo.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ę
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 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 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 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:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Według Apple 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, 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.
Wysyłka to nie zgłoszenie do recenzji
Expo pisze to wprost: 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:
- Wypełnij wymagane metadane wersji.
- Wybierz build w sekcji Build wersji.
- Kliknij „Add for Review”. Wersja przechodzi w Ready for Review, ale nic jeszcze nie poszło do recenzji.
- 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, ITMS-91053 w 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 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ę: 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.
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.