EAS Submit iOS: publikasi app Expo ke App Store
Oleh Mehdi Azizi
Terbit , 8 mnt
EAS Submit mengirim build iOS ke App Store Connect dan masuk ke TestFlight. Pengiriman ke review tetap dilakukan di App Store Connect.
eas submit --platform ios mengirim build iOS kamu ke App Store Connect, dan build itu muncul di TestFlight setelah diproses Apple. Perintah ini tidak mengirim app kamu ke review Apple: memilih build dan mengirimnya ke review tetap harus kamu lakukan di App Store Connect. Supaya bisa diotomatisasi, perintah ini butuh nomor listing app kamu (ascAppId) dan API key App Store Connect.
Saya memublikasikan app iOS saya, termasuk Solys, TradaZen, dan Nolera, dengan Expo, EAS Build, dan EAS Submit. Panduan ini mengikuti dokumentasi Expo tentang pengiriman iOS, yang saya baca ulang pada 25 Oktober 2026. Kalau kamu tidak punya Mac, alur lengkapnya ada di publikasi app iOS tanpa Mac. Di sini, kita fokus ke pengirimannya.
Yang kamu perlukan sebelum perintah pertama
Expo menyebut tiga prasyarat:
- Akun Apple Developer berbayar. Harga dan cara daftarnya ada di akun developer Apple.
- Bundle identifier di
ios.bundleIdentifier. Menurut referensi konfigurasi Expo, kamu bebas membuatnya, tapi harus unik di App Store. - EAS CLI terpasang, lalu
eas logindengan akun Expo kamu.
Kamu juga butuh build produksi yang sudah ditandatangani. EAS Build membuatnya dengan sertifikat dan profil yang dikelolanya untuk kamu, seperti dijelaskan di sertifikat dan provisioning profile iOS.
Listing App Store Connect: kamu atau EAS?
EAS Submit mengirim binary ke app yang harus sudah ada di App Store Connect.
Kamu bisa membuatnya sendiri. Bantuan Apple menjelaskan jendela New App: platform, nama, bahasa utama, bundle identifier, SKU, dan akses pengguna. Kamu butuh peran Account Holder, Admin, atau App Manager.
EAS juga bisa membuatnya saat pengiriman pertama. Menurut halaman Expo tentang TestFlight, eas submit membuat listing saat kamu mengirim build pertama. Menurut referensi eas.json, mengisi ascAppId akan melewati langkah ini. Namanya diambil dari appName, atau kalau tidak ada, dari name di konfigurasi kamu. Bahasa utamanya diambil dari language, yang default-nya en-US. Kalau app kamu pertama rilis dalam bahasa Prancis, isi language sebelum pengiriman pertama itu.
Setelah itu, salin nomor listing ke ascAppId. Expo menjelaskan tempatnya: buka app kamu di App Store Connect, lalu App Information. Itu kolom Apple ID, di bawah General Information. Ini berupa angka, bukan bundle identifier kamu.
Kenapa pakai API key, bukan Apple ID kamu
EAS Submit terhubung ke Apple dengan Apple ID kamu atau dengan API key App Store Connect.
Apple ID terbentur autentikasi dua faktor, yang diwajibkan Apple untuk semua pengguna App Store Connect: harus ada orang yang mengonfirmasi login. App-specific password, yang diberikan lewat EXPO_APPLE_APP_SPECIFIC_PASSWORD, bisa melewati langkah ini, tapi menurut Expo kurang aman dibanding API key, yang jadi metode default dan rekomendasinya. API key memungkinkan autentikasi tanpa interaksi apa pun, jadi pengiriman bisa diotomatisasi.
Ada dua cara untuk mendapatkannya:
- Biarkan EAS yang mengelolanya. Jalankan
eas credentials --platform ios, pilih profilproduction, login ke akun Apple kamu, lalu pilih "App Store Connect: Manage your API Key". - Pakai key milikmu sendiri. Di App Store Connect: Users and Access, tab Integrations, App Store Connect API, Team Keys, lalu Generate API Key. Kamu butuh akun Admin, dan panduan Expo memberi peran Admin ke key tersebut.
Untuk cara kedua, catat Key ID, yang tampil di daftar key aktif, dan Issuer ID, di bagian atas halaman Integrations. Yang paling penting, simpan file .p8: kamu hanya bisa mengunduhnya sekali, dan Apple tidak menyimpan salinannya.
Menurut Apple, key Admin bisa membuat dan menghapus pengguna di akun kamu. Apple meminta agar key ini tidak pernah disimpan di repositori kode.
File eas.json minimal untuk disalin
Semua nilainya palsu: ganti dengan milikmu.
{
"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"
}
}
}
}
appVersionSourcedanautoIncrement: server EAS menyimpan build number dan menaikkannya di setiap build produksi. Expo merekomendasikan mode remote ini sejak EAS CLI 12.ascAppId: nomor listing app kamu. Tanpa ini, mode non-interaktif gagal.appleTeamId: ID tim Apple Developer kamu.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: API key kamu. Ketiga kolom ini menerima environment variable. Tambahkan folderkeyske.gitignorekamu.
Kolom appleId hanya dipakai kalau kamu login dengan Apple ID. Kalau EAS sudah mengelola key kamu, hapus juga tiga kolom ascApiKey. Di tiga app saya, yang saya cek ulang pada 25 Oktober, profil submit produksinya hanya berisi ascAppId, ditambah appleTeamId di Solys: tidak ada key di file.
Jalankan build, lalu kirim
eas build --platform ios --profile production
eas submit --platform ios
Tanpa opsi lain, eas submit memintamu memilih build yang akan dikirim dan, saat pertama dijalankan, menanyakan Apple ID kamu. Profil submit production dipakai secara default kalau ada. Referensi EAS CLI mencantumkan opsi agar kamu tidak perlu memilih:
| Opsi | Fungsinya |
|---|---|
--latest | Mengirim build iOS terakhir |
--id | Mengirim build EAS tertentu |
--path | Mengirim file .ipa lokal |
--url | Mengirim arsip online |
--groups | Menambahkan ke grup internal |
--what-to-test | Mengisi "What to test" |
Untuk menjalankan semuanya sekaligus, tambahkan --auto-submit ke perintah build. Menurut halaman Expo tentang pengiriman otomatis, build yang selesai langsung diteruskan ke EAS Submit dengan profil submit yang namanya sama dengan profil build. Untuk memilih profil lain: --auto-submit-with-profile=nama. Build dikirim ke TestFlight, bukan ke review.
Di continuous integration, tambahkan --non-interactive dan token EXPO_TOKEN. Perintahnya tidak bisa menanyakan apa pun ke kamu: ia butuh ascAppId di profil dan API key, entah yang sudah ditautkan EAS ke app, atau milikmu di tiga kolom ascApiKey.
Yang terjadi setelah pengiriman
1. Apple memproses build. Build harus melewati proses ini sebelum muncul di App Store Connect, dan Apple mengirimimu e-mail saat selesai. Menurut Expo, biasanya butuh 10 sampai 15 menit sebelum terlihat di TestFlight.
2. Kepatuhan ekspor. Status Missing Compliance berarti deklarasi enkripsi kamu belum ada. App Store Connect menanyakan hal ini di setiap versi baru, kecuali Info.plist sudah menjawabnya. Di Expo, key-nya bernama ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Menurut Apple, false cocok kalau app kamu, termasuk library-nya, tidak memakai enkripsi sama sekali atau hanya enkripsi yang dikecualikan. Enkripsi sistem, seperti HTTPS lewat URLSession, biasanya termasuk yang dikecualikan. Hanya deklarasikan false kalau memang benar untuk app kamu: deklarasi ini mengikatmu. Seperti semua key Info.plist, perubahan ini butuh build baru.
3. TestFlight. Pada status Ready to Submit, menurut Apple, build bisa diberikan ke tester internal, menjalani beta review untuk tester eksternal, atau dikirim ke review App Store. Kolom groups di profil menambahkannya ke grup internal kamu. Selebihnya ada di TestFlight untuk menguji app.
Pengiriman bukan pengajuan ke review
Expo menuliskannya: build TestFlight tidak otomatis dipublikasikan di App Store. EAS Submit tidak mengisi listing ataupun screenshot kamu. Masih ada empat langkah di App Store Connect, yang dijelaskan di bantuan Apple tentang pengajuan ke review:
- Isi metadata wajib untuk versi tersebut.
- Pilih build di bagian Build pada versi tersebut.
- Klik "Add for Review". Versinya berubah ke Ready for Review, tapi belum ada yang dikirim ke review.
- Klik "Submit for Review". Statusnya berubah ke In Review saat review dimulai.
Error yang sering muncul dan cara memperbaikinya
| Error yang tampil | Penyebab | Perbaikan |
|---|---|---|
| ITMS-90189 | Build number sudah dipakai | autoIncrement |
| ITMS-90062 atau 90186 | Versi sudah ditutup | Naikkan version |
| "Set ascAppId" | ascAppId tidak ada di CI | Tambahkan ascAppId |
| "API Keys cannot" | Tidak ada key yang ditautkan | eas credentials |
| ITMS-90683 | Purpose string tidak ada | ios.infoPlist |
| ITMS-91053 | Manifest tidak lengkap | ios.privacyManifests |
| ITMS-90725 | SDK iOS terlalu lama | Naikkan SDK Expo |
| Missing Compliance | Enkripsi belum dideklarasikan | usesNonExemptEncryption |
Menurut Expo, build number yang sudah dipakai adalah penyebab umum penolakan saat pengiriman: semuanya ada di build number dan versi. Tiga error punya panduan sendiri: ITMS-90683 dengan Expo, ITMS-91053 dengan Expo, dan ITMS-90725.
Dua pesan dalam tanda kutip berasal dari EAS dan diperbaiki di konfigurasinya. Missing Compliance juga bisa diselesaikan dengan menjawab pertanyaan di App Store Connect. Untuk semua baris lainnya, perbaikannya menyentuh binary: buat build ulang, lalu kirim lagi. Update jarak jauh tidak mengubah Info.plist, manifest, maupun nomor-nomornya.
Kirim app pertamamu tanpa coba-coba
Perintah ini hanya satu langkah. iOS Kit berangkat dari starter code app-app saya, termasuk langganan, dan mengikuti empat langkah sampai ke App Store, sesuai ritmemu.
Kalau kamu sedang menyiapkan rilis pertama, ikuti diagnostik gratis: diagnostik ini memberi tahu apa yang benar-benar menghambatmu dan mengirimkan checklist anti-penolakan Apple saya. Untuk listing, screenshot, dan validasi, halaman publikasi aplikasi di App Store membahas setiap langkahnya.
Pertanyaan umum
Bagaimana cara memublikasikan app Expo di App Store?
Jalankan build produksi dengan EAS Build, lalu kirim dengan eas submit --platform ios. Setelah diproses Apple, build muncul di TestFlight. Di App Store Connect, isi listing, pilih build itu di versinya, lalu klik "Add for Review" dan "Submit for Review".
Apakah EAS Submit mengirim app saya ke review Apple?
Tidak. EAS Submit mengirim binary ke App Store Connect, dan build masuk ke TestFlight. Pengajuan ke review dilakukan manual di App Store Connect, setelah listing diisi dan build dipilih.
Di mana menemukan ascAppId app saya?
Di App Store Connect, buka app kamu, lalu App Information. Itu kolom Apple ID, di bawah General Information. Isinya angka, jangan sampai tertukar dengan bundle identifier kamu.
Apakah perlu Apple ID untuk memakai eas submit?
Saat pertama dijalankan, perintah ini menanyakannya. Setelah itu, dengan ascAppId di profil dan API key App Store Connect, perintah ini bisa berjalan tanpa interaksi, bahkan di continuous integration. API key adalah metode default dan rekomendasi Expo.
Berapa lama sampai build terlihat di TestFlight?
Menurut Expo, biasanya 10 sampai 15 menit pemrosesan di Apple, yang mengirimimu e-mail saat selesai. Kalau build tertahan di status Missing Compliance, jawab pertanyaan tentang enkripsi, lalu deklarasikan di konfigurasi kamu untuk build berikutnya.