Guideline 2.3.1: fitur tersembunyi dan update OTA
Oleh Mehdi Azizi
Terbit , 9 mnt
Guideline 2.3.1: Apple menolak fitur tersembunyi, dorman, atau yang tidak ada di catatan review. Ini yang bisa kamu ubah jarak jauh dan yang butuh build baru.
Guideline 2.3.1 melarang fitur tersembunyi, dorman, atau tidak terdokumentasi: semua yang dilakukan app kamu harus terlihat oleh pengguna dan reviewer. Setiap hal baru harus dijelaskan secara spesifik di catatan review. Update jarak jauh boleh memperbaiki apa yang sudah dilihat Apple, tapi tidak pernah boleh menambahkan apa yang belum dilihat Apple.
Saya merilis app iOS saya dengan Expo, dan setiap app sudah membawa EAS Update sejak build pertamanya untuk mengirim perbaikan. Aturan saya: tidak ada update jarak jauh selama sebuah versi sedang direview. Panduan ini berdasarkan teks Apple, lisensinya, dokumentasi Expo, dan penolakan yang dipublikasikan.
Apa isi guideline 2.3.1?
2.3.1 membuka bagian 2.3 "Accurate Metadata" dari App Review Guidelines, di section 2 "Performance". Teksnya dimulai begini: "Don't include any hidden, dormant, or undocumented features in your app; your app's functionality should be clear to end users and App Review." Singkatnya: tidak ada yang disembunyikan, ditidurkan, atau tidak didokumentasikan.
Kalimat berikutnya berlaku untuk setiap submission: "All new features, functionality, and product changes must be described with specificity in the Notes for Review section of App Store Connect (generic descriptions will be rejected) and accessible for review." Setiap hal baru harus dijelaskan secara spesifik di catatan review, dan bisa diakses oleh reviewer. Jadi "Perbaikan bug dan peningkatan" tidak cukup.
Paragraf yang sama juga menyasar marketing yang menyesatkan: menjanjikan konten atau layanan yang tidak ada, atau menampilkan harga palsu, di App Store maupun di tempat lain.
Bagian ini berguna buat saya di Nolera. Saat membaca ulang halaman App Store-nya sebelum rilis, saya menemukan dua kalimat yang tidak bisa diverifikasi: "antarmuka hanya dalam bahasa Prancis", yang sudah tidak benar lagi, dan "paket paling banyak dipilih", untuk app yang belum pernah dirilis. Catatan untuk reviewer juga menggambarkan kondisi produk yang sudah usang. Persis itulah yang disasar bagian ini. Sementara 2.3.10 lebih menyasar halaman App Store.
Apa arti pesan penolakan 2.3.1?
Penolakannya berjudul "Guideline 2.3.1 - Performance", kadang diikuti "Hidden Features". Dua pesan yang dipublikasikan oleh developer React Native:
- Maret 2024, di sebuah issue GitHub CodePush: "The app contains hidden features.", tanpa penjelasan lain. Developer-nya meminta klarifikasi dan menerima tambahan berdasarkan 2.5.2: "Your app, extension, or linked framework appears to contain code designed explicitly with the capability to change the app's behavior or functionality after App Review approval." Issue itu tidak menyebutkan apakah app-nya akhirnya lolos.
- Februari 2023, di issue lain, Apple menyasar "CodePush-related remote code downloading/updating support" di dalam binary.
Pembacaan saya: reviewer tidak melihat update kamu, dia melihat kode yang mampu menerimanya. Kedua kasus ini menyasar CodePush. Saya belum menemukan penolakan publik terbaru yang menyasar EAS Update, tapi itu tidak membuktikan apa-apa.
Update jarak jauh: apa yang diizinkan 2.5.2 dan lisensi
Aturan 2.5.2, yang juga saya bahas di panduan mode background, melarang app untuk "download, install, or execute code which introduces or changes features or functionality of the app".
Pasal 3.3.1(B) dari Apple Developer Program License Agreement melarang kode executable yang diunduh, tapi menegaskan: "Interpreted code may be downloaded to an Application". Dengan tiga syarat: kode itu tidak mengubah tujuan utama app, tidak mengakali signing, sandbox, atau fitur keamanan sistem, dan tidak membuat toko untuk app lain.
JavaScript di app Expo adalah kode yang diinterpretasi: menurut saya, EAS Update masuk dalam kerangka ini. Dokumentasinya mengingatkan bahwa update mengikuti aturan App Store, dan bahwa "changes to your app's behavior need to be reviewed". Untuk bug kritis, Expo menyarankan perbaikan jarak jauh, lalu submission baru yang membawa perbaikan itu.
Garis saya: memperbaiki dan menyesuaikan yang sudah ada, boleh. Mengubah apa app itu atau apa yang dijualnya, tidak.
Yang bisa kamu ubah jarak jauh, yang butuh build baru
Tabel yang saya pakai, diambil dari halaman Apple dan Expo yang dikutip di sini. Baris "gratis yang jadi berbayar" dan dua baris terakhir adalah pembacaan saya.
| Perubahan | Jalur | Alasan |
|---|---|---|
| Bug JavaScript | Update jarak jauh | Penggunaan yang dimaksud Expo |
| Teks, terjemahan, gaya | Update jarak jauh | Penggunaan yang dimaksud Expo |
| Harga langganan | App Store Connect | Tidak ada kode yang diubah |
| Teks promosi | App Store Connect | Tanpa submission baru |
| Pembelian dari tipe yang sudah disetujui | Review pembelian saja | Aturan App Store Connect |
| Pembelian pertama dari suatu tipe | Versi baru | Aturan App Store Connect |
| Fitur baru | Versi baru | 2.3.1 dan 2.5.2 |
| Gratis yang jadi berbayar | Versi baru | Halaman dan catatan perlu diperbarui |
| Izin, Info.plist | Build baru | File di dalam binary |
| Modul native, SDK Expo | Build baru | Kode native berubah |
| Sakelar yang mematikan | Konfigurasi jarak jauh | Ditoleransi kalau sementara |
| Sakelar yang memunculkan | Dilarang | Fitur tidak pernah direview |
Teks promosi bisa diubah "without requiring an updated submission", menurut halaman Apple tentang informasi versi. Pembelian pertama dari setiap tipe dikirim bersama versi baru, yang berikutnya bisa sendiri, menurut halaman bantuan tentang submission pembelian. Expo menggolongkan kode native, izin, dan versi SDK sebagai hal yang butuh binary baru, sama seperti untuk ITMS-90683. Sakelar yang mematikan fitur yang rusak tidak menambahkan hal baru, selama tidak menghapus apa yang sudah dibayar pelanggan.
Sakelar jarak jauh tanpa penolakan
Sakelar jarak jauh, atau feature flag, tidak dilarang dengan sendirinya: semuanya tergantung pada apa yang disembunyikannya. Aturan saya:
- Semua yang bisa ditampilkan oleh sebuah sakelar sudah ada dan menyala untuk reviewer, dan disebutkan di catatan review.
- Tes A/B membandingkan dua varian yang bisa dilihat reviewer, tidak pernah satu varian yang sudah direview dan satu yang belum pernah dilihat.
- Tidak ada kode yang mendeteksi review untuk berperilaku berbeda. Itu definisi paling murni dari fitur tersembunyi.
- Paywall yang dikendalikan jarak jauh hanya menampilkan produk yang sudah disetujui, dan setiap variannya mematuhi aturan 3.1.2.
Mode demo dan akun tes
Guideline 2.1 meminta akun demo kalau app kamu punya fitur login, dengan server yang menyala. Kalau kewajiban hukum atau keamanan membuatmu tidak bisa menyediakannya, mode demo bawaan bisa menggantikannya, tapi hanya "with prior approval by Apple", dan mode itu harus menampilkan semua fitur. Halaman Apple tentang informasi versi menambahkan: akunnya tidak boleh kedaluwarsa, dan akun tambahan dimasukkan ke catatan, yang dibatasi 4.000 byte.
Hubungannya dengan 2.3.1: mode demo atau akun tes yang membuka layar yang tidak terlihat dengan cara lain harus dijelaskan. Gestur rahasia, kode, atau akun khusus yang tidak disebutkan adalah fitur tersembunyi. Sebutkan setiap akses khusus di catatan, beserta apa yang dibukanya.
Aturan saya: tidak ada update jarak jauh selama review
Kenapa EAS Update ada di semua app saya: di Solys, app alarm saya, ada bug JavaScript yang membuat app jadi bisu begitu efek suara gagal sekali saja. Perbaikannya cuma tiga baris, tapi butuh build lengkap dan review untuk mengirimnya. Sejak itu, semua app saya membawa expo-updates sejak build pertama: ini modul native, binary yang dikompilasi tanpanya tidak akan pernah menerima apa pun. Konfigurasi saya, di app.json:
{
"expo": {
"runtimeVersion": { "policy": "fingerprint" },
"updates": { "fallbackToCacheTimeout": 0, "checkAutomatically": "ON_LOAD" }
}
}
Dengan fingerprint, update hanya sampai ke binary yang kode native-nya cocok (runtime version). Tapi selama sebuah versi menunggu atau sedang menjalani review, saya tidak merilis apa pun. Dua alasannya.
- Reviewer tidak akan melihat perbaikannya. Dengan
fallbackToCacheTimeoutbernilai 0, instalasi baru berjalan dengan kode bawaan dan menerapkan update di peluncuran berikutnya (dokumentasi expo-updates). Reviewer menginstal, membuka sekali, dan menguji binary-nya. Nolera ditolak padahal perbaikannya sudah dikirim jarak jauh: saya ceritakan di panduan 2.1. - Yang diuji reviewer harus tetap sama dengan yang diterima pengguna. Mengubah perilaku selama review menciptakan selisih antara versi yang dilihat dan versi yang dikirim.
Catatan review yang spesifik
2.3.1 menolak deskripsi generik. Template yang akan saya pakai, dalam bahasa Inggris:
What's new in this version:
- [Feature]: [where to find it, how to test it].
Remote configuration:
- "[flag]" controls [feature]. It is ON for review.
Over-the-air updates:
- The app uses expo-updates for bug fixes only.
No update will be published during this review.
Demo account: see Sign-in information. It never expires.
Bagaimana menanggapi penolakan 2.3.1?
Tanggapi di App Store Connect, tempat kamu membalas pesan App Review.
- Pesannya tetap samar: tanyakan fitur mana yang dimaksud, seperti developer di issue 2024.
- Fitur sungguhan kurang dijelaskan: berikan jalur persisnya dan video singkat, lalu lengkapi catatannya.
- Sebuah sakelar memunculkan hal yang belum direview: hapus sakelarnya, atau nyalakan dan jelaskan, lalu buat build ulang.
- Kode update yang dipermasalahkan: jelaskan bahwa kode itu untuk perbaikan, dalam kerangka pasal 3.3.1(B). Di issue 2023, Apple meminta kode itu dihapus.
Checklist 2.3.1 sebelum submission
- Setiap hal baru di versi ini dijelaskan di catatan, beserta jalurnya.
- Setiap sakelar jarak jauh menyala untuk review dan disebutkan di catatan.
- Tidak ada kode yang mengubah perilaku untuk reviewer.
- Akses khusus dijelaskan: mode demo, akun tes, gestur.
- Halaman App Store dan paywall tidak menjanjikan apa pun yang tidak dilakukan build.
- Tidak ada update jarak jauh yang dirilis selama review.
Cek berkasmu sebelum dikirim
Review Kit berisi checklist saya sebelum pengiriman, template catatan untuk tester, dan skill Claude Code yang membaca ulang proyekmu. Kalau mau dicek manusia, pesan satu jam dengan saya: kita baca ulang catatan review dan konfigurasi update-mu bersama, lewat video call. Langkah lengkapnya ada di halaman app ditolak Apple.
Sedang menyiapkan rilis pertamamu? Ikuti diagnostik gratis: diagnostik ini menyusun langkah-langkahnya secara berurutan dan mengirimkan checklist anti-penolakan Apple saya.
Pertanyaan umum
Apa arti "Guideline 2.3.1 - Performance - Hidden Features"?
Apple menganggap app kamu berisi fitur tersembunyi, dorman, atau yang tidak ada di catatan review. Pesan ini juga bisa menyasar kode yang mampu mengubah app setelah review, kadang disertai penolakan 2.5.2.
Apakah EAS Update diizinkan Apple?
Lisensinya mengizinkan kode terinterpretasi yang diunduh selama tidak mengubah tujuan utama app. Memperbaiki, boleh. Menambahkan fitur yang belum direview, tidak.
Bolehkah memakai feature flag di app iOS?
Boleh, kalau semua yang bisa ditampilkannya sudah direview. Nyalakan setiap sakelar untuk review dan jelaskan di catatan.
Apakah mode demo perlu diberitahukan ke reviewer?
Ya. Mode demo bawaan butuh persetujuan Apple terlebih dahulu dan harus menampilkan semua fitur.
Bolehkah merilis update jarak jauh selama review?
Tidak ada larangan tertulis secara eksplisit. Tapi reviewer tidak akan melihatnya di peluncuran pertama, dan update itu menciptakan selisih dengan versi yang direview. Saya selalu menahan diri.

