# Error eas submit iOS: penyebab dan cara memperbaikinya

> eas submit gagal? Pesan asli dari EAS dan App Store Connect, penyebab, serta cara memperbaikinya: ascAppId, kunci API, perjanjian Apple, kode ITMS.

Halaman asli: [Error eas submit iOS: penyebab dan cara memperbaikinya](https://devoria.fr/id/blog/error-eas-submit-ios-cara-memperbaiki)
Penulis: [Mehdi Azizi](https://devoria.fr/id/mehdi-azizi)
Terbit: 2026-11-04
Revisi konten terakhir: 2026-11-04


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](https://github.com/expo/eas-cli), 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](https://devoria.fr/id/blog/eas-submit-ios-publikasi-app-expo-app-store). Di sini, kita memperbaiki.

## Apa yang dilakukan eas submit, dan apa yang dibutuhkannya

Menurut [dokumentasi Expo](https://docs.expo.dev/deploy/submit-to-app-stores/), 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](https://docs.expo.dev/submit/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:

- **`ascAppId`** di profil `submit` pada `eas.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)](https://devoria.fr/id/blog/api-key-app-store-connect-p8).

Profil minimalnya cuma beberapa baris. Nilainya fiktif:

```json
{
  "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](https://docs.expo.dev/deploy/submit-to-app-stores/) 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](https://docs.expo.dev/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](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) 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](https://github.com/expo/fyi/blob/main/asc-app-id.md): 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 `ascAppId` sebelum build, bukan sesudahnya. Sampai SDK 57, [fingerprint yang dihitung Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/src/sourcer/Expo.ts) selalu menyertakan `eas.json`. Di Vigie, yang runtime version-nya mengikuti kebijakan `fingerprint`, 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`, mengabaikan `eas.json`, menurut [changelog Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/CHANGELOG.md).

### "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](https://docs.expo.dev/submit/ios/): 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 ios` dalam mode interaktif di komputermu, lalu biarkan ia menyiapkan kunci API App Store Connect untuk aplikasimu.
- **Pakai kuncimu sendiri** di `ascApiKeyPath`, `ascApiKeyIssuerId`, dan `ascApiKeyId`. Menurut [referensi eas.json](https://docs.expo.dev/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](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) memeriksa format ini sebelum pengiriman apa pun.

Menurut [bantuan Apple](https://support.apple.com/en-us/102654), 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](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md), 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](https://developer.apple.com/help/account/access/roles/). [Kode EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) 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](https://devoria.fr/id/blog/paid-apps-agreement-status-w-8ben-pembayaran-pertama).

### "App Store Connect rejected the API authentication credentials."

Apple membalas dengan error 401, `NOT_AUTHORIZED`. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) 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](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests), 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](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 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](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiUtils.ts) 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](https://developer.apple.com/forums/thread/106806):

- **Listing-nya belum ada.** Buat di App Store Connect, atau hapus `ascAppId` supaya perintahnya yang membuatkan.
- **Nomornya berasal dari akun lain.** Kamu menyalin `ascAppId` dari 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](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) 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](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/credentials/ios/appstore/ensureAppExists.ts) 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`](https://docs.expo.dev/eas/json/).

## 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](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/functions/uploadToAsc.ts):

| 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": true` di `eas.json`. Semuanya ada di [nomor build dan versi](https://devoria.fr/id/blog/build-number-app-store-connect-versi-nomor-build).
- **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 kunci `BGTaskSchedulerPermittedIdentifiers`.

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](https://devoria.fr/id/blog/itms-90683-missing-purpose-string-expo) dan [ITMS-90725](https://devoria.fr/id/blog/itms-90725-sdk-version-issue-expo).

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](https://devoria.fr/id/blog/eas-submit-ios-publikasi-app-expo-app-store).

## Checklist saya sebelum setiap pengiriman

- `ascAppId` ada di profil `submit`, ditambahkan sebelum build.
- Kunci API dikelola EAS, atau ketiga kolomnya mengarah ke `.p8` yang disimpan di luar repositori.
- Account Holder sudah menyetujui perjanjian terbaru di App Store Connect.
- `autoIncrement` aktif, dengan `"appVersionSource": "remote"`, yang [direkomendasikan Expo](https://docs.expo.dev/build-reference/app-versions/) sejak EAS CLI 12.
- `version` lebih tinggi dari versi terakhir yang disetujui.
- Setiap API sensitif yang ada di binary punya purpose string-nya.
- Untuk aplikasi baru, `appName` dan `language` sudah diisi sebelum pengiriman pertama.

## Mengirim aplikasi pertamamu tanpa tersendat

Perintah ini hanyalah satu langkah. [iOS & Android Kit](https://devoria.fr/id/kits/ios) 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](https://devoria.fr/id/diagnostic): 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](https://devoria.fr/id/expertise/publikasi-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.


## Proyekmu

[Review Kit](https://devoria.fr/id/kits/app-review): Checklist review App Store saya, penolakan Apple yang sudah saya perbaiki, checklist Google Play, dan tiga skill Claude Code. Rp 999.000.

[iOS & Android Kit](https://devoria.fr/id/kits/ios): Bikin app iPhone dan Android kamu dengan Claude Code: kode awal dari app-app saya, langkah demi langkah sampai ke store, dan semua kit. Rp 1.999.000.

[Diagnosis: apa yang memisahkanmu dari app iPhone-mu](https://devoria.fr/id/diagnostic): 7 pertanyaan, 60 detik: kamu tahu apa yang benar-benar menghambatmu merilis app iPhone, jalurmu dalam 4 tahap, dan kit yang cocok untukmu.
