# Guideline 2.3.1: fungsi tersembunyi dan kemas kini OTA

> Guideline 2.3.1: Apple menolak fungsi tersembunyi atau tiada dalam nota semakan. Apa yang boleh diubah dari jauh dan apa yang perlukan build baharu.

Halaman asal: [Guideline 2.3.1: fungsi tersembunyi dan kemas kini OTA](https://devoria.fr/ms/blog/guideline-2-3-1-fungsi-tersembunyi-kemas-kini-ota)
Pengarang: [Mehdi Azizi](https://devoria.fr/ms/mehdi-azizi)
Diterbitkan: 2026-11-04
Semakan kandungan terakhir: 2026-11-04


Guideline 2.3.1 melarang fungsi yang tersembunyi, tidak aktif atau tidak didokumenkan: semua yang dilakukan oleh app anda mesti kelihatan kepada pengguna dan kepada reviewer. Setiap ciri baharu perlu diterangkan dengan tepat dalam nota semakan. **Kemas kini dari jauh boleh membetulkan apa yang Apple sudah lihat, tetapi tidak boleh menambah apa yang Apple belum lihat.**

Saya menerbitkan app iOS saya dengan Expo, dan setiap satu membawa EAS Update sejak build pertamanya untuk menghantar pembetulan. Peraturan saya: tiada kemas kini dari jauh semasa sesuatu versi sedang disemak. Panduan ini bersandarkan teks Apple, lesennya, dokumentasi Expo dan penolakan yang telah diterbitkan.

## Apa kata guideline 2.3.1?

2.3.1 membuka bahagian 2.3 "Accurate Metadata" dalam [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#2.3.1), di bawah seksyen 2 "Performance". Teksnya bermula 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." Ringkasnya: tiada yang tersembunyi, tidak aktif atau tidak didokumenkan.

Sambungannya menyasarkan setiap penghantaran: "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 ciri baharu mesti diterangkan dengan tepat dalam nota semakan, dan boleh diakses oleh reviewer.** Jadi "Pembetulan pepijat dan penambahbaikan" tidak memadai.

Perenggan yang sama juga menyasarkan pemasaran yang mengelirukan: menjanjikan kandungan atau perkhidmatan yang tiada, atau memaparkan harga palsu, sama ada di App Store atau di tempat lain.

Bahagian ini membantu saya dengan Nolera. Semasa menyemak semula halaman app sebelum pelancaran, saya jumpa dua ayat yang tidak boleh disahkan: "antara muka dalam bahasa Perancis sahaja", yang sudah tidak benar, dan "pek paling popular", untuk app yang belum pernah diterbitkan. Nota untuk reviewer juga menerangkan keadaan produk yang sudah lapuk. Itulah tepat sekali yang disasarkan oleh bahagian ini. [2.3.10](https://devoria.fr/ms/blog/guideline-2-3-10-aplikasi-ditolak-metadata) pula lebih menyasarkan halaman app.

## Apa maksud mesej penolakan 2.3.1?

Penolakan ini bertajuk "Guideline 2.3.1 - Performance", kadang-kadang diikuti "Hidden Features". Dua mesej yang diterbitkan oleh pembangun React Native:

- **Mac 2024**, dalam satu [tiket GitHub CodePush](https://github.com/microsoft/react-native-code-push/issues/2680): "The app contains hidden features.", tanpa penjelasan lain. Pembangun itu meminta penjelasan dan menerima tambahan di bawah 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." Tiket itu tidak menyatakan sama ada app tersebut lulus selepas itu.
- **Februari 2023**, dalam satu [tiket lain](https://github.com/microsoft/react-native-code-push/issues/2434), Apple menyasarkan "CodePush-related remote code downloading/updating support" dalam binari.

Tafsiran saya: **reviewer tidak nampak kemas kini anda, dia nampak kod yang mampu menerimanya.** Kedua-dua kes ini menyasarkan CodePush. Saya tidak jumpa penolakan awam terkini yang menyasarkan EAS Update, tetapi itu tidak membuktikan apa-apa.

## Kemas kini dari jauh: apa yang dibenarkan oleh 2.5.2 dan lesen

[Peraturan 2.5.2](https://developer.apple.com/app-store/review/guidelines/#2.5.2), yang saya bincangkan juga dalam panduan [mod latar belakang](https://devoria.fr/ms/blog/guideline-2-5-4-mod-latar-belakang-ditolak-apple), melarang app daripada "download, install, or execute code which introduces or changes features or functionality of the app".

Artikel 3.3.1(B) dalam [Apple Developer Program License Agreement](https://developer.apple.com/support/terms/apple-developer-program-license-agreement/#b331) melarang kod boleh laksana yang dimuat turun, tetapi menyatakan: "Interpreted code may be downloaded to an Application". Dengan tiga syarat: kod itu tidak mengubah tujuan utama app, tidak memintas tandatangan, sandbox atau ciri keselamatan sistem, dan tidak mewujudkan kedai untuk app lain.

JavaScript dalam app Expo ialah kod yang ditafsir: pada pandangan saya, EAS Update termasuk dalam kerangka ini. [Dokumentasinya](https://docs.expo.dev/eas-update/introduction/) mengingatkan bahawa kemas kini mesti mematuhi peraturan App Store, dan bahawa "changes to your app's behavior need to be reviewed". Untuk pepijat kritikal, Expo mencadangkan pembetulan dari jauh, kemudian penghantaran baharu yang membawanya.

**Prinsip saya: membetulkan dan melaras apa yang sedia ada, ya. Mengubah apa app itu atau apa yang dijualnya, tidak.**

## Apa yang boleh diubah dari jauh, apa yang memerlukan build baharu

Ini jadual yang saya gunakan, berdasarkan halaman Apple dan Expo yang dipetik di sini. Baris "Percuma menjadi berbayar" dan dua baris terakhir ialah tafsiran saya.

| Perubahan                        | Laluan                   | Sebab                          |
| -------------------------------- | ------------------------ | ------------------------------ |
| Pepijat JavaScript               | Kemas kini dari jauh     | Kegunaan yang dirancang Expo   |
| Teks, terjemahan, gaya           | Kemas kini dari jauh     | Kegunaan yang dirancang Expo   |
| Harga langganan                  | App Store Connect        | Tiada kod diubah               |
| Teks promosi                     | App Store Connect        | Tanpa penghantaran baharu      |
| Pembelian jenis yang sudah lulus | Semakan pembelian sahaja | Peraturan App Store Connect    |
| Pembelian pertama sesuatu jenis  | Versi baharu             | Peraturan App Store Connect    |
| Fungsi baharu                    | Versi baharu             | 2.3.1 dan 2.5.2                |
| Percuma menjadi berbayar         | Versi baharu             | Halaman dan nota perlu disemak |
| Kebenaran, Info.plist            | Build baharu             | Fail dalam binari              |
| Modul native, SDK Expo           | Build baharu             | Kod native berubah             |
| Suis yang mematikan              | Konfigurasi jauh         | Diterima jika sementara        |
| Suis yang mendedahkan            | Dilarang                 | Fungsi tidak pernah disemak    |

Teks promosi boleh diubah "without requiring an updated submission", menurut halaman Apple tentang [maklumat versi](https://developer.apple.com/help/app-store-connect/reference/app-information/platform-version-information). Pembelian pertama bagi setiap jenis dihantar bersama versi baharu, yang seterusnya boleh dihantar sendiri, menurut bantuan tentang [penghantaran pembelian](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-in-app-purchase). Expo meletakkan kod native, kebenaran dan versi SDK dalam senarai perkara yang memerlukan binari baharu, sama seperti [ITMS-90683](https://devoria.fr/ms/blog/itms-90683-missing-purpose-string-expo). Suis yang mematikan fungsi yang rosak tidak menambah sesuatu yang baharu, selagi ia tidak menarik balik apa yang telah dibayar oleh pelanggan.

## Suis jauh tanpa penolakan

Suis jauh, atau feature flag, tidak dilarang dengan sendirinya: semuanya bergantung pada apa yang disembunyikannya. Peraturan saya:

- **Semua yang boleh dipaparkan oleh sesuatu suis mesti ada dan dihidupkan untuk reviewer**, dan dinamakan dalam nota semakan.
- Ujian A/B membandingkan dua varian yang boleh dilihat oleh reviewer, bukan satu varian yang disemak dan satu yang belum pernah dilihat.
- **Tiada kod yang mengesan semakan untuk berkelakuan berbeza.** Itulah definisi sebenar fungsi tersembunyi.
- Paywall yang dikawal dari jauh hanya memaparkan produk yang telah lulus, dan setiap varian mematuhi [peraturan 3.1.2](https://devoria.fr/ms/blog/guideline-3-1-2-aplikasi-ditolak-langganan).

## Mod demo dan akaun ujian

[Guideline 2.1](https://devoria.fr/ms/blog/guideline-2-1-app-store-penolakan) meminta akaun demo jika app anda mempunyai log masuk, dengan pelayan dihidupkan. Jika kewajipan undang-undang atau keselamatan menghalang anda daripada menyediakannya, mod demo terbina dalam boleh menggantikannya, tetapi hanya "with prior approval by Apple", dan ia mesti menunjukkan semua fungsi. Halaman Apple tentang maklumat versi menambah: akaun itu tidak tamat tempoh, dan akaun tambahan dimasukkan dalam nota, yang terhad kepada 4,000 bait.

Kaitannya dengan 2.3.1: **mod demo atau akaun ujian yang membuka skrin yang tidak kelihatan dalam keadaan biasa mesti diterangkan.** Gerak isyarat rahsia, kod atau akaun khas yang tidak dimaklumkan ialah fungsi tersembunyi. Namakan setiap akses khas dalam nota, berserta apa yang dibukanya.

## Peraturan saya: tiada kemas kini dari jauh semasa semakan

Kenapa EAS Update ada dalam semua app saya: dalam Solys, app jam penggera saya, satu pepijat JavaScript menyebabkan app menjadi senyap sebaik sahaja satu kesan bunyi gagal sekali. Pembetulannya cuma tiga baris, tetapi perlukan build penuh dan semakan untuk dihantar. Sejak itu, semua app saya membawa expo-updates sejak build pertama: ia modul native, jadi binari yang dikompil tanpanya tidak akan menerima apa-apa. Konfigurasi saya, dalam `app.json`:

```json
{
  "expo": {
    "runtimeVersion": { "policy": "fingerprint" },
    "updates": { "fallbackToCacheTimeout": 0, "checkAutomatically": "ON_LOAD" }
  }
}
```

Dengan `fingerprint`, kemas kini hanya sampai kepada binari yang kod native-nya sepadan ([versi runtime](https://docs.expo.dev/eas-update/runtime-versions/)). Tetapi semasa sesuatu versi menunggu atau sedang disemak, saya tidak menerbitkan apa-apa. Dua sebab.

1. **Reviewer tidak akan nampak pembetulan itu.** Dengan `fallbackToCacheTimeout` pada 0, pemasangan baharu bermula dengan kod terbina dan menggunakan kemas kini pada pelancaran seterusnya ([dokumentasi expo-updates](https://docs.expo.dev/versions/latest/sdk/updates/)). Reviewer memasang, melancarkan sekali dan menguji binari. Nolera ditolak walaupun pembetulan sudah dihantar dari jauh: saya ceritakannya dalam panduan 2.1.
2. **Apa yang diuji oleh reviewer mesti kekal sama dengan apa yang diterima pengguna.** Mengubah kelakuan semasa semakan mewujudkan jurang antara versi yang dilihat dan versi yang dihantar.

## Nota semakan yang tepat

2.3.1 menolak penerangan umum. Templat yang saya akan gunakan, dalam bahasa Inggeris:

```text
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 membalas penolakan 2.3.1?

Balas dalam App Store Connect, tempat anda [membalas mesej App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/).

- **Mesejnya kabur**: tanya fungsi mana yang dimaksudkan, seperti pembangun dalam tiket 2024.
- **Fungsi sebenar diterangkan dengan kurang baik**: berikan laluan tepat dan video pendek, kemudian lengkapkan nota.
- **Suis mendedahkan sesuatu yang baharu**: buang suis itu, atau hidupkan dan terangkannya, kemudian buat build semula.
- **Kod kemas kini dipersoalkan**: jelaskan bahawa ia hanya untuk pembetulan, dalam kerangka artikel 3.3.1(B). Dalam tiket 2023, Apple meminta supaya ia dibuang.

## Senarai semak 2.3.1 sebelum penghantaran

- Setiap ciri baharu dalam versi ini diterangkan dalam nota, berserta laluannya.
- Setiap suis jauh dihidupkan untuk semakan dan dinamakan dalam nota.
- Tiada kod yang mengubah kelakuan untuk reviewer.
- Akses khas diterangkan: mod demo, akaun ujian, gerak isyarat.
- Halaman app dan paywall tidak menjanjikan apa-apa yang tidak dilakukan oleh build.
- Tiada kemas kini dari jauh diterbitkan semasa semakan.

## Semak fail anda sebelum dihantar

[Review Kit](https://devoria.fr/ms/kits/app-review) menghimpunkan senarai semak saya sebelum penghantaran, templat nota untuk penguji dan skill Claude Code yang menyemak projek anda. Jika anda mahukan pandangan manusia, [tempah satu jam dengan saya](https://devoria.fr/ms/coaching): kita semak nota semakan dan konfigurasi kemas kini anda bersama-sama, melalui panggilan video. Langkah lengkapnya ada di halaman [app ditolak oleh Apple](https://devoria.fr/ms/expertise/aplikasi-ditolak-apple).

Sedang bersedia untuk pelancaran pertama? [Buat diagnostik percuma anda](https://devoria.fr/ms/diagnostic): ia menyusun langkah mengikut urutan dan menghantar senarai semak anti-penolakan Apple saya kepada anda.

## Soalan lazim

### Apa maksud "Guideline 2.3.1 - Performance - Hidden Features"?

Apple menganggap app anda mengandungi fungsi yang tersembunyi, tidak aktif atau tiada dalam nota semakan. Mesej itu juga boleh menyasarkan kod yang mampu mengubah app selepas semakan, kadang-kadang bersama penolakan 2.5.2.

### Adakah EAS Update dibenarkan oleh Apple?

Lesen membenarkan kod ditafsir yang dimuat turun selagi ia tidak mengubah tujuan utama app. Membetulkan, ya. Menambah fungsi yang belum disemak, tidak.

### Bolehkah feature flag digunakan dalam app iOS?

Ya, jika semua yang boleh dipaparkannya telah disemak. Hidupkan setiap suis untuk semakan dan terangkannya dalam nota.

### Perlukah mod demo dimaklumkan kepada reviewer?

Ya. Mod demo terbina dalam memerlukan kelulusan awal Apple dan mesti menunjukkan semua fungsi.

### Bolehkah kemas kini dari jauh diterbitkan semasa semakan?

Tiada larangan yang tertulis secara jelas. Tetapi reviewer tidak akan nampak kemas kini itu pada pelancaran pertama, dan ia mewujudkan jurang dengan versi yang disemak. Saya sentiasa mengelakkannya.


## 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.
