Error eas submit iOS: penyebab dan cara memperbaikinya
Oleh Mehdi Azizi
Terbit , 10 mnt
eas submit gagal? Pesan asli dari EAS dan App Store Connect, penyebab, serta cara memperbaikinya: ascAppId, kunci API, perjanjian Apple, kode ITMS.
Saat eas submit --platform ios gagal, pesannya hampir selalu menunjukkan di mana kamu harus mencari. Entah konfigurasi EAS kamu belum lengkap, akun Apple kamu memblokir, atau Apple menolak binary-nya. Dua kasus pertama bisa diperbaiki dalam beberapa menit, tanpa build baru. Kasus ketiga bisa dikenali dari kode ITMS, dan hampir selalu butuh build baru.
Saya memublikasikan aplikasi iOS saya, termasuk Solys, TradaZen, dan Nolera, dengan Expo dan EAS. Pesan yang dikutip di sini disalin dari kode sumber EAS CLI, di repositori GitHub resmi Expo, yang saya baca ulang pada 3 November 2026. Forum lama Expo sekarang dialihkan ke Discord: kode tetap jadi sumber yang paling bisa dipercaya. Untuk alur lengkapnya, dari file eas.json sampai pengiriman ke review, baca dulu EAS Submit iOS: memublikasikan aplikasi Expo di App Store. Di sini, kita memperbaiki.
Apa yang dilakukan eas submit, dan apa yang dibutuhkannya
Menurut dokumentasi Expo, perintah ini mengirim file .ipa kamu ke App Store Connect. Build muncul di TestFlight setelah diproses Apple, biasanya 10 sampai 15 menit. Perintah ini tidak mengirim aplikasimu ke review: langkah itu tetap harus kamu lakukan di App Store Connect.
Halaman Expo tentang pengiriman iOS mencantumkan tiga prasyarat:
- akun Apple Developer berbayar, wajib untuk setiap pengiriman ke App Store;
- bundle identifier di
ios.bundleIdentifier; - EAS CLI terpasang dan terhubung ke akun Expo kamu.
Untuk mengirim tanpa interaksi, halaman yang sama menambahkan dua pengaturan:
ascAppIddi profilsubmitpadaeas.json, yaitu nomor listing App Store Connect kamu;- kunci API App Store Connect, dikelola oleh EAS atau kamu sediakan sendiri. Cara membuat, perannya, dan cara mencabutnya dijelaskan di kunci API App Store Connect (.p8).
Profil minimalnya cuma beberapa baris. Nilainya fiktif:
{
"submit": {
"production": {
"ios": {
"ascAppId": "1234567890"
}
}
}
}
Kalau EAS sudah menyimpan kunci API kamu, profil ini sudah cukup. Begitu kondisinya di sebagian besar aplikasi saya.
Membaca pesan: tiga kelompok error
Sebelum mencari solusinya, perhatikan di titik mana perintahnya berhenti. Tabel ini adalah panduan yang saya pakai setiap kali gagal.
| Titik kegagalan | Kelompok | Build baru? |
|---|---|---|
| Sebelum pengiriman apa pun | Konfigurasi EAS | Tidak |
| Koneksi ke Apple, pembuatan listing | Akun Apple | Tidak |
| Setelah pengiriman, kode ITMS-90xxx | Binary ditolak | Hampir selalu |
Detailnya bisa dibaca di halaman submission, di dashboard Expo. Expo menyarankan untuk membaca log di sana dan mencari gelembung "Build Annotations", yang menandai penyebab kegagalan yang umum. Di terminal, opsi --verbose selalu menampilkan log EAS Submit, menurut referensi EAS CLI.
Error konfigurasi EAS
"Set ascAppId in the submit profile (eas.json) or re-run this command in interactive mode."
Kamu menjalankan perintah dengan --non-interactive, misalnya di continuous integration, dan profilmu tidak berisi ascAppId. Kode EAS CLI lalu berhenti: ia tidak bisa bertanya padamu, dan tidak bisa membuat listing untukmu.
Solusi: salin nomor listing kamu ke ascAppId. Expo menjelaskan di mana menemukannya: di App Store Connect, buka aplikasimu, lalu App Information. Itu adalah kolom Apple ID, di bawah General Information, berupa angka sekitar sepuluh digit. Ini bukan alamat email Apple kamu, dan bukan bundle identifier kamu.
Di Nolera, tanpa ascAppId, perintahnya meminta sesi Apple Developer, yang bisa kedaluwarsa. Sejak nomornya ada di eas.json, pengiriman tidak meminta apa-apa lagi.
Tambahkan
ascAppIdsebelum build, bukan sesudahnya. Sampai SDK 57, fingerprint yang dihitung Expo selalu menyertakaneas.json. Di Vigie, yang runtime version-nya mengikuti kebijakanfingerprint, menambahkan nomor ini setelah build mengubah fingerprint-nya: update yang dipublikasikan sesudahnya tidak akan pernah sampai ke build yang terpasang. Sejak SDK 58, preset fingerprint default,balanced, mengabaikaneas.json, menurut changelog Expo.
"App Store Connect API Keys cannot be set up in --non-interactive mode."
Profilmu tidak berisi kunci, dan EAS tidak punya kunci yang terhubung ke aplikasimu. Expo menjelaskannya: dalam mode non-interaktif, perintah tidak bisa meminta kunci, dan gagal dengan pesan ini.
Ada dua solusi:
- Biarkan EAS membuat dan menyimpan kuncinya. Jalankan sekali
eas credentials --platform iosdalam mode interaktif di komputermu, lalu biarkan ia menyiapkan kunci API App Store Connect untuk aplikasimu. - Pakai kuncimu sendiri di
ascApiKeyPath,ascApiKeyIssuerId, danascApiKeyId. Menurut referensi eas.json, ketiga kolom ini menerima environment variable, seperti$ASC_API_KEY_PATH.
Di aplikasi terakhir saya, opsi --auto-submit meminta Apple ID untuk membuat kunci pengirimannya. Saya mengisi tiga kolom kunci saya sendiri di profil pada salinan kerja saya, yang tidak pernah di-commit. Lalu saya mengirim build yang sudah selesai 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."
Variabel ini berisi sesuatu selain app-specific password, sering kali kata sandi Apple kamu sendiri. EAS CLI memeriksa format ini sebelum pengiriman apa pun.
Menurut bantuan Apple, app-specific password dibuat di account.apple.com, bagian App-Specific Passwords, dengan autentikasi dua faktor aktif. Password ini dicabut begitu kamu mengganti kata sandi akun Apple. Expo menilai metode ini kurang aman dibanding kunci API, metode default yang mereka rekomendasikan.
Error akun Apple
"… agree to the latest Program License Agreement in your developer account."
Pesan lengkapnya diawali "You currently don't have access to this membership resource". Dari sisi Apple, respons mentahnya bisa berisi "Unable to process request - PLA Update available". Langkah pengiriman EAS yang lebih baru biasanya menampilkan "A required Apple agreement is missing or has expired".
Penyebabnya sama: Apple memperbarui perjanjian, dan belum ada yang menyetujuinya. Hanya pemilik akun, Account Holder, yang bisa menyetujui perjanjian, menurut tabel peran Apple. Kode EAS memintanya membuka halaman Business di App Store Connect, lalu, jika Apple menawarkannya, akunnya di developer.apple.com. Setelah itu, jalankan ulang perintahnya. Perjanjian untuk aplikasi berbayar punya panduannya sendiri: Paid Apps Agreement di App Store Connect.
"App Store Connect rejected the API authentication credentials."
Apple membalas dengan error 401, NOT_AUTHORIZED. EAS menyebut tiga penyebab: kunci yang sudah tidak aktif, kunci dari akun App Store Connect lain, atau Key ID, isi kunci, atau Issuer ID yang salah.
Periksa kedua ID di App Store Connect, menu Users and Access, tab Integrations. Menurut Apple, Issuer ID tampil di bagian atas halaman, dan Key ID ada di daftar kunci aktif. Kunci yang sudah dicabut tidak akan pernah bisa diaktifkan lagi. Apple menampilkannya selama 30 hari di bawah Revoked: kamu harus membuat kunci baru.
"App Store Connect app for application identifier … was not found."
Listing yang dituju ascAppId tidak bisa ditemukan dengan kuncimu. EAS memintamu memeriksa nomor ini, dan memastikan kuncinya memang punya akses ke aplikasi di akun yang benar. Ia bahkan menampilkan beberapa aplikasi yang terlihat dengan kunci tersebut. Dengan alat pengiriman Apple, masalah yang sama muncul dalam bentuk "No suitable application records were found".
Ada tiga penyebab yang sering muncul, dua di antaranya tercatat di thread forum Apple ini:
- Listing-nya belum ada. Buat di App Store Connect, atau hapus
ascAppIdsupaya perintahnya yang membuatkan. - Nomornya berasal dari akun lain. Kamu menyalin
ascAppIddari tim lain, atau dari proyek lain. - Pengguna tidak punya akses ke aplikasi. App Manager atau Developer bisa dibatasi ke aplikasi tertentu. Sementara itu, kunci tim bisa mengakses semua aplikasi di akun tersebut.
"… is not available to team" atau "… is not available to provider"
Pesan ini muncul saat EAS membuatkan listing untukmu karena tidak ada ascAppId. Bundle identifier-nya sudah dipakai tim lain. EAS memintamu menggantinya di konfigurasi aplikasimu, lalu menjalankan ulang.
"App name "…" is already taken. Using generated name "…""
Ini bukan kegagalan. Kalau nama sudah dipakai di App Store, EAS menambahkan enam karakter acak dan mencoba lagi, hingga lima kali. Kamu bisa mengganti nama listing nanti di App Store Connect. Untuk menghindarinya, isi appName dan language di profil sebelum pengiriman pertama: tanpa language, bahasa utamanya adalah en-US.
Error binary: kode ITMS
Setelah pengiriman, Apple memproses build-nya. Kalau ditolak, log menyebut satu atau beberapa kode ITMS. Berikut kode yang dikenali dan diterjemahkan oleh langkah pengiriman EAS:
| Kode ITMS | Yang ditolak Apple | Solusi |
|---|---|---|
| 90189 | Nomor build sudah dipakai | autoIncrement |
| 90062, 90186, 90478 | Versi sudah ditutup atau sudah terlewati | Naikkan version |
| 90683 | Purpose string tidak ada | ios.infoPlist |
| 90725 | SDK iOS terlalu lama | Image iOS atau SDK Expo |
| 90054, 90055 | Bundle berbeda dari listing yang dituju | Perbaiki ascAppId |
| 90022, 90023, 90391, 90713 | Ikon tidak ada atau salah dideklarasikan | Periksa ulang ikon |
| 90771 | ID background task tidak ada | ios.infoPlist |
Tiga catatan dari pesan-pesan ini:
- Nomor build harus unik per versi. Untuk 90189, EAS merekomendasikan
"autoIncrement": truedieas.json. Semuanya ada di nomor build dan versi. - Untuk 90725, EAS menyarankan memilih image iOS yang lebih baru di
eas.json, dan jika perlu beralih ke SDK Expo yang masih didukung. - Untuk 90771, Info.plist kamu mendeklarasikan background mode
processing, tapi tidak punya kunciBGTaskSchedulerPermittedIdentifiers.
Kecuali untuk 90054 dan 90055, yang cukup diatasi dengan menargetkan listing yang benar atau build lain, perbaikannya menyentuh binary: buat build ulang, lalu kirim lagi. Dua kode punya panduannya sendiri: ITMS-90683 dengan Expo dan ITMS-90725.
Akhir September 2026, sebuah build Solys ditolak saat pengiriman karena ITMS-90683. Saya sempat menghapus purpose string untuk foto saat bersih-bersih file konfigurasi. Solys tidak memakai foto, tapi ada library di proyek yang memanggil API Photos iOS. Apple menganalisis binary-nya, bukan penggunaan sebenarnya: sejak itu, saya tidak pernah lagi menghapus string tersebut.
Status Missing Compliance, di sisi lain, bukan error pengiriman. Yang kurang adalah deklarasi enkripsi kamu, yang dijelaskan di panduan publikasi dengan EAS.
Checklist saya sebelum setiap pengiriman
ascAppIdada di profilsubmit, ditambahkan sebelum build.- Kunci API dikelola EAS, atau ketiga kolomnya mengarah ke
.p8yang disimpan di luar repositori. - Account Holder sudah menyetujui perjanjian terbaru di App Store Connect.
autoIncrementaktif, dengan"appVersionSource": "remote", yang direkomendasikan Expo sejak EAS CLI 12.versionlebih tinggi dari versi terakhir yang disetujui.- Setiap API sensitif yang ada di binary punya purpose string-nya.
- Untuk aplikasi baru,
appNamedanlanguagesudah diisi sebelum pengiriman pertama.
Mengirim aplikasi pertamamu tanpa tersendat
Perintah ini hanyalah satu langkah. iOS & Android Kit berangkat dari kode awal aplikasi-aplikasi saya, termasuk langganan, dan mengikuti empat langkah sampai ke App Store, sesuai kecepatanmu.
Kalau kamu sedang menyiapkan rilis pertamamu, ikuti diagnostik gratis: diagnostik ini memberi tahu apa yang sebenarnya menghambatmu dan mengirimkan checklist anti-penolakan Apple saya. Untuk listing, screenshot, dan validasi, halaman memublikasikan aplikasi di App Store membahas setiap langkahnya.
Pertanyaan umum
Kenapa eas submit hanya gagal di continuous integration?
Dalam mode --non-interactive, perintah ini tidak bisa menanyakan apa pun padamu. Ia butuh ascAppId di profil dan kunci API yang sudah terhubung ke aplikasi, atau ketiga kolomnya di eas.json. Di komputermu, ia akan menanyakan hal-hal itu.
Apakah harus build ulang setelah error eas submit?
Hanya jika Apple menolak binary-nya, dengan kode ITMS. Pengecualian: untuk ITMS-90054 dan 90055, build-nya menargetkan listing yang salah, jadi cukup kirim ulang ke listing yang benar. Error konfigurasi dan akun diperbaiki di eas.json, di App Store Connect, atau di akun Apple kamu. Setelah itu kamu mengirim ulang build yang sama, misalnya dengan --latest atau --id.
Di mana melihat log pengiriman EAS Submit?
Di halaman submission, di dashboard Expo. Expo menyarankan membaca log di sana dan gelembung "Build Annotations". Di terminal, tambahkan --verbose agar log selalu ditampilkan.
Bisakah memakai eas submit dengan akun Apple gratis?
Tidak. Expo mewajibkan akun Apple Developer berbayar untuk mengirim aplikasi ke App Store. Akun gratis memungkinkanmu menguji di iPhone sendiri, bukan memakai App Store Connect.
Peran apa yang perlu diberikan ke kunci API untuk eas submit?
Panduan Expo memberi kunci tersebut peran Admin. Menurut tabel peran Apple, pengiriman build juga terbuka untuk peran App Manager dan Developer. Build Expo saya berjalan dengan kunci tim berperan App Manager. Hanya Account Holder dan Admin yang bisa membuat kunci tim.
Apa arti "Increment Build Number" di EAS?
Apple menolak build dengan kode ITMS-90189: nomor build ini sudah ada untuk versi tersebut. Aktifkan "autoIncrement": true di eas.json, atau naikkan ios.buildNumber, lalu buat build ulang.

