Ralat eas submit iOS: punca dan cara membetulkannya
Oleh Mehdi Azizi
Diterbitkan pada , 10 min
eas submit gagal? Mesej sebenar EAS dan App Store Connect, puncanya dan cara membetulkannya: ascAppId, kunci API, perjanjian Apple, kod ITMS.
Apabila eas submit --platform ios gagal, mesejnya hampir selalu memberitahu di mana anda perlu melihat. Sama ada konfigurasi EAS anda tidak lengkap, akaun Apple anda menyekat, atau Apple menolak binari. Dua kes pertama boleh dibetulkan dalam beberapa minit, tanpa build baharu. Kes ketiga dikenali melalui kod ITMS, dan hampir selalu memerlukan build baharu.
Saya menerbitkan app iOS saya, termasuk Solys, TradaZen dan Nolera, dengan Expo dan EAS. Mesej yang dipetik di sini disalin daripada kod sumber EAS CLI, di repositori GitHub rasmi Expo, yang saya semak pada 3 November 2026. Forum lama Expo kini mengarahkan ke Discord: kod sumber kekal sumber yang paling boleh dipercayai. Untuk keseluruhan proses, daripada fail eas.json hingga penghantaran untuk semakan, baca dahulu EAS Submit iOS: menerbitkan app Expo di App Store. Di sini, kita membaiki.
Apa yang dilakukan eas submit, dan apa yang diperlukannya
Menurut dokumentasi Expo, arahan ini menghantar fail .ipa anda ke App Store Connect. Build muncul dalam TestFlight selepas Apple memprosesnya, biasanya 10 hingga 15 minit. Ia tidak menghantar app anda untuk semakan: langkah itu masih perlu dibuat dalam App Store Connect.
Halaman Expo tentang penghantaran iOS menyenaraikan tiga prasyarat:
- akaun Apple Developer berbayar, wajib untuk sebarang penghantaran ke App Store;
- pengecam bundle dalam
ios.bundleIdentifier; - EAS CLI dipasang dan disambungkan ke akaun Expo anda.
Untuk menghantar tanpa interaksi, halaman yang sama menambah dua tetapan:
ascAppIddalam profilsubmitdieas.json, iaitu nombor rekod app anda di App Store Connect;- kunci API App Store Connect, diurus oleh EAS atau disediakan sendiri. Cara mencipta, peranan dan pembatalannya diterangkan dalam kunci API App Store Connect (.p8).
Profil minimum hanya beberapa baris. Nilainya rekaan:
{
"submit": {
"production": {
"ios": {
"ascAppId": "1234567890"
}
}
}
}
Jika EAS sudah menyimpan kunci API anda, profil ini sudah memadai. Itulah keadaannya bagi kebanyakan app saya.
Membaca mesej: tiga keluarga ralat
Sebelum mencari pembetulan, kenal pasti saat arahan itu berhenti. Jadual ini ialah panduan yang saya guna setiap kali gagal.
| Saat kegagalan | Keluarga | Build baharu? |
|---|---|---|
| Sebelum sebarang penghantaran | Konfigurasi EAS | Tidak |
| Sambungan ke Apple, penciptaan rekod app | Akaun Apple | Tidak |
| Selepas penghantaran, kod ITMS-90xxx | Binari ditolak | Hampir selalu |
Butirannya boleh dibaca di halaman penghantaran, dalam papan pemuka Expo. Expo menasihatkan anda membaca log di situ dan mencari gelembung "Build Annotations", yang menandakan punca kegagalan biasa. Di terminal, pilihan --verbose sentiasa memaparkan log EAS Submit, menurut rujukan EAS CLI.
Ralat konfigurasi EAS
"Set ascAppId in the submit profile (eas.json) or re-run this command in interactive mode."
Anda menjalankan arahan dengan --non-interactive, contohnya dalam integrasi berterusan (CI), dan profil anda tiada ascAppId. Kod EAS CLI lalu berhenti: ia tidak boleh bertanya kepada anda, dan tidak boleh mencipta rekod app bagi pihak anda.
Pembetulan: salin nombor rekod app anda ke dalam ascAppId. Expo menunjukkan di mana untuk mencarinya: dalam App Store Connect, buka app anda, kemudian App Information. Ia ialah medan Apple ID, di bawah General Information, nombor kira-kira sepuluh digit. Ia bukan alamat e-mel Apple anda, dan bukan pengecam bundle anda.
Pada Nolera, tanpa ascAppId, arahan itu meminta sesi Apple Developer, yang akan tamat tempoh. Sejak nombor itu berada dalam eas.json, penghantaran tidak meminta apa-apa lagi.
Tambah
ascAppIdsebelum build, bukan selepas. Sehingga SDK 57, cap jari yang dikira oleh Expo sentiasa merangkumieas.json. Pada Vigie, yang versi runtime-nya mengikut polisifingerprint, menambah nombor ini selepas build telah mengubah cap jari: kemas kini yang diterbitkan selepas itu tidak akan sampai ke build yang dipasang. Sejak SDK 58, pratetap lalai cap jari,balanced, mengabaikaneas.json, menurut log perubahan Expo.
"App Store Connect API Keys cannot be set up in --non-interactive mode."
Profil anda tiada kunci, dan EAS tidak mempunyai kunci yang dikaitkan dengan app anda. Expo menjelaskannya: dalam mod bukan interaktif, arahan itu tidak boleh meminta kunci daripada anda, lalu gagal dengan mesej ini.
Dua pembetulan yang mungkin:
- Biarkan EAS mencipta dan menyimpan kunci. Jalankan
eas credentials --platform iossekali dalam mod interaktif, di mesin anda, dan biarkan ia mengkonfigurasi kunci API App Store Connect untuk app anda. - Bawa kunci anda sendiri dalam
ascApiKeyPath,ascApiKeyIssuerIddanascApiKeyId. Menurut rujukan eas.json, ketiga-tiga medan ini menerima pemboleh ubah persekitaran, seperti$ASC_API_KEY_PATH.
Pada app terbaru saya, pilihan --auto-submit mahukan Apple ID untuk mencipta kunci penghantarannya. Saya letakkan tiga medan kunci saya sendiri dalam profil salinan kerja saya, yang tidak pernah di-commit. Kemudian saya hantar build yang siap dengan --id dan --non-interactive.
"EXPO_APPLE_APP_SPECIFIC_PASSWORD must be in the format xxxx-xxxx-xxxx-xxxx, where x is a lowercase letter."
Pemboleh ubah itu mengandungi sesuatu selain kata laluan khusus app, selalunya kata laluan Apple anda sendiri. EAS CLI menyemak format ini sebelum sebarang penghantaran.
Menurut bantuan Apple, kata laluan khusus app dijana di account.apple.com, bahagian App-Specific Passwords, dengan pengesahan dua faktor diaktifkan. Ia dibatalkan sebaik sahaja anda menukar kata laluan akaun Apple anda. Expo menganggap kaedah ini kurang selamat berbanding kunci API, kaedah lalai dan disyorkannya.
Ralat akaun Apple
"… agree to the latest Program License Agreement in your developer account."
Mesej penuhnya bermula dengan "You currently don't have access to this membership resource". Di pihak Apple, respons mentahnya mungkin mengandungi "Unable to process request - PLA Update available". Langkah penghantaran EAS yang lebih baharu pula memaparkan "A required Apple agreement is missing or has expired".
Puncanya sama: Apple telah mengemas kini perjanjian, dan tiada sesiapa yang menerimanya. Hanya pemegang akaun, Account Holder, boleh menerima perjanjian, menurut jadual peranan Apple. Kod EAS memintanya melalui halaman Business di App Store Connect, kemudian, jika Apple menawarkannya, melalui akaunnya di developer.apple.com. Selepas itu, jalankan semula arahan. Perjanjian untuk app berbayar ada panduannya sendiri: Paid Apps Agreement dalam App Store Connect.
"App Store Connect rejected the API authentication credentials."
Apple membalas dengan ralat 401, NOT_AUTHORIZED. EAS menyebut tiga punca: kunci yang tidak lagi aktif, kunci daripada akaun App Store Connect lain, atau Key ID, kandungan kunci atau Issuer ID yang salah.
Semak kedua-dua pengecam dalam App Store Connect, menu Users and Access, tab Integrations. Menurut Apple, Issuer ID dipaparkan di bahagian atas halaman, dan Key ID dalam senarai kunci aktif. Kunci yang telah dibatalkan tidak boleh diaktifkan semula. Apple memaparkannya selama 30 hari di bawah Revoked: anda perlu menjana kunci baharu.
"App Store Connect app for application identifier … was not found."
Rekod app yang disasarkan oleh ascAppId tidak dapat ditemui dengan kunci anda. EAS meminta anda menyemak nombor ini, dan memastikan kunci itu benar-benar mempunyai akses ke app dalam akaun yang betul. Ia malah menyenaraikan beberapa app yang kelihatan dengan kunci itu. Dengan alat penghantaran Apple, masalah yang sama dipaparkan sebagai "No suitable application records were found".
Tiga punca kerap berlaku, dua daripadanya dicatat dalam bebenang forum Apple ini:
- Rekod app tidak wujud. Cipta dalam App Store Connect, atau buang
ascAppIdsupaya arahan itu menciptanya. - Nombor itu daripada akaun lain. Anda menyalin
ascAppIddaripada pasukan lain, atau projek lain. - Pengguna tidak mempunyai akses ke app. App Manager atau Developer boleh dihadkan kepada app tertentu. Kunci pasukan pula mempunyai akses ke semua app dalam akaun.
"… is not available to team" atau "… is not available to provider"
Mesej ini muncul apabila EAS mencipta rekod app bagi pihak anda, kerana tiada ascAppId. Pengecam bundle sudah diambil oleh pasukan lain. EAS meminta anda menukarnya dalam konfigurasi app anda, kemudian jalankan semula.
"App name "…" is already taken. Using generated name "…""
Ini bukan kegagalan. Apabila nama sudah diambil di App Store, EAS menambah enam aksara rawak dan mencuba semula, sehingga lima kali. Anda boleh menamakan semula rekod app kemudian dalam App Store Connect. Untuk mengelakkannya, isi appName dan language dalam profil sebelum penghantaran pertama: tanpa language, bahasa utama ialah en-US.
Ralat binari: kod ITMS
Selepas penghantaran, Apple memproses build. Jika ditolak, log akan menyebut satu atau beberapa kod ITMS. Inilah kod yang dikenali dan diterjemahkan oleh langkah penghantaran EAS:
| Kod ITMS | Apa yang ditolak Apple | Pembetulan |
|---|---|---|
| 90189 | Nombor build sudah digunakan | autoIncrement |
| 90062, 90186, 90478 | Versi ditutup atau sudah dilepasi | Naikkan version |
| 90683 | Ayat kebenaran tiada | ios.infoPlist |
| 90725 | SDK iOS terlalu lama | Imej iOS atau SDK Expo |
| 90054, 90055 | Bundle berbeza daripada rekod sasaran | Betulkan ascAppId |
| 90022, 90023, 90391, 90713 | Ikon tiada atau diisytiharkan salah | Semak semula ikon |
| 90771 | Pengecam tugas latar belakang tiada | ios.infoPlist |
Tiga penjelasan daripada mesej-mesej ini:
- Nombor build adalah unik bagi setiap versi. Untuk 90189, EAS mengesyorkan
"autoIncrement": truedalameas.json. Semuanya ada dalam nombor build dan versi. - Untuk 90725, EAS menasihatkan anda memilih imej iOS yang lebih baharu dalam
eas.json, dan jika perlu beralih ke SDK Expo yang disokong. - Untuk 90771, Info.plist anda mengisytiharkan mod latar belakang
processing, tetapi bukan kunciBGTaskSchedulerPermittedIdentifiers.
Kecuali untuk 90054 dan 90055, di mana anda hanya perlu menyasarkan rekod app yang betul atau build lain, pembetulannya melibatkan binari: buat build semula, kemudian hantar semula. Dua kod ada panduannya sendiri: ITMS-90683 dengan Expo dan ITMS-90725.
Pada akhir September 2026, satu build Solys ditolak semasa penghantaran kerana ITMS-90683. Saya telah membuang ayat kebenaran untuk foto semasa mengemas fail konfigurasi. Solys tidak menggunakan foto, tetapi satu library dalam projek memanggil API Photos iOS. Apple menganalisis binari, bukan penggunaan sebenar: sejak itu, saya tidak pernah lagi membuang ayat-ayat ini.
Status Missing Compliance pula bukan ralat penghantaran. Ia bermaksud pengisytiharan penyulitan anda tiada, yang diterangkan dalam panduan penerbitan dengan EAS.
Senarai semak saya sebelum setiap penghantaran
ascAppIdada dalam profilsubmit, ditambah sebelum build.- Kunci API diurus oleh EAS, atau tiga medannya menunjuk ke
.p8yang disimpan di luar repositori. - Account Holder telah menerima perjanjian terkini dalam App Store Connect.
autoIncrementaktif, dengan"appVersionSource": "remote", disyorkan oleh Expo sejak EAS CLI 12.versionlebih tinggi daripada versi terakhir yang diluluskan.- Setiap API sensitif dalam binari ada ayat kebenarannya.
- Untuk app baharu,
appNamedanlanguagediisi sebelum penghantaran pertama.
Menghantar app pertama anda tanpa tersekat
Arahan ini hanya satu langkah. iOS & Android Kit bermula daripada kod permulaan app saya, termasuk langganan, dan mengikuti empat langkah hingga ke App Store, mengikut rentak anda.
Jika anda sedang menyediakan pelancaran pertama, buat diagnostik percuma anda: ia memberitahu apa yang benar-benar menyekat anda dan menghantar senarai semak anti-penolakan Apple saya. Untuk rekod app, tangkapan skrin dan semakan, halaman menerbitkan aplikasi di App Store menerangkan setiap langkah.
Soalan lazim
Kenapa eas submit hanya gagal dalam integrasi berterusan?
Dalam mod --non-interactive, arahan itu tidak boleh bertanya apa-apa kepada anda. Ia memerlukan ascAppId dalam profil dan kunci API yang sudah dikaitkan dengan app, atau tiga medannya dalam eas.json. Di mesin anda, ia akan bertanyakan soalan-soalan ini.
Perlukah build semula selepas ralat eas submit?
Hanya jika Apple menolak binari, dengan kod ITMS. Pengecualian: untuk ITMS-90054 dan 90055, build itu menyasarkan rekod app yang salah, jadi anda cuma perlu menghantarnya semula ke rekod yang betul. Ralat konfigurasi dan akaun dibetulkan dalam eas.json, dalam App Store Connect atau dalam akaun Apple anda. Kemudian anda hantar semula build yang sama, contohnya dengan --latest atau --id.
Di mana untuk melihat log penghantaran EAS Submit?
Di halaman penghantaran, dalam papan pemuka Expo. Expo menasihatkan anda membaca log di situ dan gelembung "Build Annotations". Di terminal, tambah --verbose untuk sentiasa memaparkan log.
Bolehkah eas submit digunakan dengan akaun Apple percuma?
Tidak. Expo memerlukan akaun Apple Developer berbayar untuk menghantar app ke App Store. Akaun percuma membolehkan anda menguji di iPhone sendiri, tetapi bukan menggunakan App Store Connect.
Peranan apa yang perlu diberikan kepada kunci API untuk eas submit?
Panduan Expo memberikan peranan Admin kepada kunci. Menurut jadual peranan Apple, penghantaran build juga terbuka kepada peranan App Manager dan Developer. Build Expo saya berjalan dengan kunci pasukan berperanan App Manager. Hanya Account Holder dan Admin boleh menjana kunci pasukan.
Apakah maksud "Increment Build Number" dalam EAS?
Apple telah menolak build dengan kod ITMS-90189: nombor build ini sudah wujud untuk versi ini. Aktifkan "autoIncrement": true dalam eas.json, atau naikkan ios.buildNumber, kemudian buat build semula.

