Publishing artinya mengirim build rilis Laundry Bu Rini ke App Store Connect (Apple) dan Google Play Console, lengkap dengan identitas, tanda tangan, nomor versi, halaman toko, dan keterangan privasi, lalu menunggu review. Bayangin Bu Rini membuka cabang di mal. Dia bayar sewa ke pengelola (akun developer), memasang papan nama yang gak bisa diganti (bundle ID), menyegel tiap kiriman barang dengan cap tokonya (signing), memberi nomor urut di tiap kiriman (nomor build), lalu menunggu petugas mal memeriksa sebelum tokonya boleh buka (review).
🧪 Tebakan cepat: Kamu memperbaiki salah ketik, mengubah
versiondiapp.jsondari"1.0.0"jadi"1.0.1", build ulang tanpaautoIncrement, lalu mengunggah ke Play Console. Unggahannya diterima? Jawabannya ada di bagian "Versi: yang dibaca orang dan yang dihitung toko".
Akun dan biaya
Dicek di halaman resmi pada 11 Oktober 2026:
| Apple Developer Program | Google Play Console | |
|---|---|---|
| Biaya | 99 USD per tahun (ditagih dalam mata uang lokal) | 25 USD, sekali bayar |
| Jenis akun | individu atau organisasi (organisasi butuh nomor D-U-N-S) | Personal atau Organization |
| Syarat tambahan | akun harus aktif selama aplikasinya mau tetap dijual | akun Personal yang dibuat setelah 13 November 2023: closed test dengan minimal 12 tester yang ikut terus-menerus selama 14 hari, lalu mengajukan akses production |
Aturan 12 tester itu ketat: tester yang keluar lalu masuk lagi mulai hitungan 14 harinya dari nol. Pengajuan akses production biasanya dijawab dalam 7 hari atau kurang.
Identitas aplikasi
ios.bundleIdentifier dan android.package sudah diisi id.laundryburini.app sejak pelajaran Expo. Di toko, ID ini identitas aplikasinya: Play Console gak mengizinkan package name diganti, dan di App Store bundle ID terikat ke catatan aplikasinya. Mengganti ID berarti aplikasi baru, dengan pengguna dan ulasan dari nol.
Versi: yang dibaca orang dan yang dihitung toko
Di app.json |
iOS | Android | Siapa yang membaca |
|---|---|---|---|
version: "1.0.0" |
CFBundleShortVersionString |
versionName |
pengguna, di halaman toko |
ios.buildNumber: "1" |
CFBundleVersion |
toko | |
android.versionCode: 1 |
versionCode (bilangan bulat) |
toko |
Hasil npx expo prebuild di project ini: android/app/build.gradle berisi versionCode 1 dan versionName "1.0.0", dan Info.plist berisi CFBundleShortVersionString 1.0.0 dan CFBundleVersion 1. Toko menghitung nomor build, bukan version. Jadi version "1.0.1" dengan versionCode yang tetap 1 ditolak Play Console: Version code 1 has already been used. Try another version code. Itu jawaban tebakannya. Di Apple, nomor build yang sama untuk versi yang sama ditolak dengan ITMS-90189: Redundant Binary Upload.
Biarkan EAS yang menaikkan nomor build:
{
"cli": { "appVersionSource": "remote" },
"build": {
"production": { "autoIncrement": true }
},
"submit": {
"production": { "android": { "track": "internal" } }
}
}
appVersionSource: "remote"(bawaan sejak EAS CLI 12): nomor build disimpan di server EAS, jadi dua orang di tim gak memakai nomor yang sama.autoIncrement: truemenaikkanversionCodedanbuildNumberdi tiap build production.versiongak ikut naik: itu kamu ubah sendiri saat ada rilis yang perlu diumumkan.
Signing: tanda tangan di tiap build
Signing adalah menandatangani file aplikasi (APK/AAB atau IPA) dengan sertifikat digital. Toko dan HP memakainya untuk memastikan build itu dari developer yang sama dan isinya gak diubah orang lain.
- iOS: distribution certificate (milik akun Apple) plus provisioning profile (satu per aplikasi, mengikat sertifikat ke
id.laundryburini.app). EAS bisa membuat dan menyimpan keduanya. Lihat isinya denganeas credentials. - Android: kamu menandatangani
.aabdengan upload key (keystore yang dibuatkan EAS). Google memeriksanya, lalu menandatangani ulang APK untuk HP dengan app signing key miliknya (Play App Signing, otomatis untuk aplikasi baru). Fingerprint kunci Google inilah yang masukassetlinks.jsondi pelajaran deep link. - Upload key hilang? Aplikasinya gak hilang: buat kunci baru, lalu ajukan "Request upload key reset" di Play Console. Build yang ditandatangani kunci lain ditolak dengan
Your Android App Bundle is signed with the wrong key. Ensure that your App Bundle is signed with the correct signing key and try again.
Build dan kirim dengan EAS
eas build --platform all --profile production # .aab untuk Play, .ipa untuk App Store
eas submit --platform android # butuh Google Service Account key
eas submit --platform ios # butuh App Store Connect API key, masuk TestFlight
- Menurut dokumentasi Expo,
eas submitpertama ke Play membuat rilis di track internal testing dengan status draft. Lengkapi dulu halaman toko di Play Console sebelum dipromosikan. - Track Play: internal (sampai 100 tester, tersedia dalam hitungan menit, bisa tanpa review standar), closed (daftar tester), open (siapa saja bisa ikut), lalu production.
- Syarat unggah per Oktober 2026: build iOS dibuat dengan Xcode 26 dan SDK iOS 26 (sejak 28 April 2026). Aplikasi dan update di Play harus menargetkan Android 16, API 36 (sejak 31 Agustus 2026). Prebuild project ini sudah
targetSdk 36.
Halaman toko dan privasi
- Halaman toko: nama, deskripsi, ikon, screenshot, kategori, dan URL kebijakan privasi (wajib di kedua toko).
- App Privacy di App Store Connect ("label nutrisi" privasi): data apa yang dikumpulkan, apakah terhubung ke identitas pengguna, apakah dipakai untuk tracking. Wajib untuk aplikasi baru dan tiap update, termasuk data yang dikumpulkan SDK pihak ketiga.
- Data safety di Play Console: wajib untuk semua aplikasi, bahkan yang gak mengumpulkan data. Isinya data yang dikumpulkan dan dibagikan, apakah dienkripsi saat dikirim, dan apakah pengguna bisa meminta datanya dihapus.
- Untuk Laundry Bu Rini, yang perlu dicantumkan antara lain nama dan nomor HP akun, lokasi alamat jemput (pelajaran sensor), dan token push.
Review: yang sering bikin ditolak
- Login tanpa akun demo. Panduan Apple 2.1 minta akun demo (dan backend yang menyala) kalau aplikasinya butuh login. Isi di App Review Information. Di Play, isi bagian App access.
- Push dijadikan syarat. Panduan 4.5.4: aplikasi harus tetap jalan tanpa izin notifikasi, dan push promosi butuh persetujuan eksplisit plus cara berhenti. Minta izin saat relevan (misalnya setelah order dibuat), bukan di layar pertama.
- Bisa daftar akun tapi gak bisa hapus akun. Panduan 5.1.1(v): kalau aplikasi bisa membuat akun, harus bisa menghapusnya dari dalam aplikasi.
- Waktu review Apple: minimal 50% kiriman ditinjau dalam 24 jam dan 90% dalam 48 jam.
⚠️ Jebakan yang sering ketemu
- Menaikkan
versiontapi bukan nomor build. Toko menghitungversionCodedanbuildNumber. PakaiautoIncrement: truedenganappVersionSource: "remote". - Membuat keystore baru untuk update. Play menolak "signed with the wrong key". Pakai keystore yang sama (simpan di EAS), atau minta reset upload key.
- Reviewer gak bisa login. Sertakan akun demo dan pastikan server menyala selama review.
- Lupa syarat akun Personal baru. Tanpa 12 tester yang bertahan 14 hari di closed test, tombol production belum terbuka.
- Mengira EAS Update menggantikan review. Update cuma membawa JavaScript dan aset. Kode native baru tetap lewat build, submit, dan review.
TL;DR: Akun Apple Developer Program 99 USD per tahun, Google Play 25 USD sekali bayar (dicek 11 Oktober 2026); akun Play Personal baru wajib closed test dengan 12 tester selama 14 hari berturut-turut. bundleIdentifier dan package (id.laundryburini.app) adalah identitas permanen. version dibaca pengguna, sedangkan toko menghitung versionCode dan buildNumber, yang harus naik di tiap unggahan: pakai appVersionSource: "remote" dan autoIncrement: true. App signing adalah menandatangani APK/AAB/IPA dengan sertifikat digital untuk membuktikan identitas developer dan keutuhan build: iOS dengan distribution certificate dan provisioning profile, Android dengan upload key yang ditandatangani ulang Play App Signing (upload key yang hilang bisa di-reset). eas build dan eas submit mengirim ke TestFlight dan track internal Play. Isi halaman toko, kebijakan privasi, App Privacy, dan Data safety, lalu siapkan akun demo, push yang gak wajib, dan penghapusan akun supaya lolos review.