# Ralat eas submit iOS: punca dan cara membetulkannya

> eas submit gagal? Mesej sebenar EAS dan App Store Connect, puncanya dan cara membetulkannya: ascAppId, kunci API, perjanjian Apple, kod ITMS.

Halaman asal: [Ralat eas submit iOS: punca dan cara membetulkannya](https://devoria.fr/ms/blog/ralat-eas-submit-ios-cara-membetulkan)
Pengarang: [Mehdi Azizi](https://devoria.fr/ms/mehdi-azizi)
Diterbitkan: 2026-11-04
Semakan kandungan terakhir: 2026-11-04


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

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

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

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

Profil minimum hanya beberapa baris. Nilainya rekaan:

```json
{
  "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](https://docs.expo.dev/deploy/submit-to-app-stores/) 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](https://docs.expo.dev/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](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) 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](https://github.com/expo/fyi/blob/main/asc-app-id.md): 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 `ascAppId` sebelum build, bukan selepas. Sehingga SDK 57, [cap jari yang dikira oleh Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/src/sourcer/Expo.ts) sentiasa merangkumi `eas.json`. Pada Vigie, yang versi runtime-nya mengikut polisi `fingerprint`, 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`, mengabaikan `eas.json`, menurut [log perubahan 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."

Profil anda tiada kunci, dan EAS tidak mempunyai kunci yang dikaitkan dengan app anda. [Expo menjelaskannya](https://docs.expo.dev/submit/ios/): 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 ios` sekali dalam mod interaktif, di mesin anda, dan biarkan ia mengkonfigurasi kunci API App Store Connect untuk app anda.
- **Bawa kunci anda sendiri** dalam `ascApiKeyPath`, `ascApiKeyIssuerId` dan `ascApiKeyId`. Menurut [rujukan eas.json](https://docs.expo.dev/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](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) menyemak format ini sebelum sebarang penghantaran.

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

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

Apple membalas dengan ralat 401, `NOT_AUTHORIZED`. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) 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](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests), Issuer ID dipaparkan di bahagian atas halaman, dan Key ID dalam senarai kunci aktif. **Kunci yang telah dibatalkan tidak boleh diaktifkan semula.** [Apple memaparkannya](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 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](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiUtils.ts) 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](https://developer.apple.com/forums/thread/106806):

- **Rekod app tidak wujud.** Cipta dalam App Store Connect, atau buang `ascAppId` supaya arahan itu menciptanya.
- **Nombor itu daripada akaun lain.** Anda menyalin `ascAppId` daripada 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](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) 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](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/credentials/ios/appstore/ensureAppExists.ts) 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`](https://docs.expo.dev/eas/json/).

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

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

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

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

## Senarai semak saya sebelum setiap penghantaran

- `ascAppId` ada dalam profil `submit`, ditambah sebelum build.
- Kunci API diurus oleh EAS, atau tiga medannya menunjuk ke `.p8` yang disimpan di luar repositori.
- Account Holder telah menerima perjanjian terkini dalam App Store Connect.
- `autoIncrement` aktif, dengan `"appVersionSource": "remote"`, [disyorkan oleh Expo](https://docs.expo.dev/build-reference/app-versions/) sejak EAS CLI 12.
- `version` lebih tinggi daripada versi terakhir yang diluluskan.
- Setiap API sensitif dalam binari ada ayat kebenarannya.
- Untuk app baharu, `appName` dan `language` diisi sebelum penghantaran pertama.

## Menghantar app pertama anda tanpa tersekat

Arahan ini hanya satu langkah. [iOS & Android Kit](https://devoria.fr/ms/kits/ios) 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](https://devoria.fr/ms/diagnostic): 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](https://devoria.fr/ms/expertise/terbitkan-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.


## Projek anda

[Review Kit](https://devoria.fr/ms/kits/app-review): Senarai semak review App Store saya, penolakan Apple yang telah saya betulkan, senarai semak Google Play dan tiga skill Claude Code. RM 219.

[iOS & Android Kit](https://devoria.fr/ms/kits/ios): Bina app iPhone dan Android anda dengan Claude Code: kod permulaan app saya, laluan hingga ke store dan semua kit. RM 449.

[Diagnostik: apa yang memisahkan anda daripada app iPhone anda](https://devoria.fr/ms/diagnostic): 7 soalan, 60 saat: anda tahu apa yang benar-benar menghalang anda menerbitkan app iPhone, laluan 4 langkah anda dan kit yang sesuai dengan anda.
