Guideline 2.3.1: rejtett funkciók és OTA frissítések iOS-en
Írta: Mehdi Azizi
Megjelent: , 9 p
A 2.3.1-es guideline tiltja a rejtett, alvó vagy a review jegyzetekből kimaradt funkciókat. Mit módosíthatsz távolról, és mihez kell új build?
A 2.3.1-es guideline tiltja a rejtett, alvó vagy dokumentálatlan funkciókat: mindennek, amit az appod csinál, láthatónak kell lennie a felhasználó és a reviewer számára. Minden újdonságot pontosan le kell írni a review jegyzetekben. Egy távoli frissítés kijavíthatja azt, amit az Apple látott, de soha nem adhat hozzá olyat, amit az Apple nem látott.
Az iOS-es appjaimat Expóval adom ki, és mindegyikben már az első buildtől benne van az EAS Update, hogy javításokat tudjak kiküldeni. A szabályom: amíg egy verzió review alatt van, semmilyen távoli frissítést nem adok ki. Ez az útmutató az Apple szövegére, a licencére, az Expo dokumentációjára és nyilvánosan megosztott elutasításokra épül.
Mit mond a 2.3.1-es guideline?
A 2.3.1 nyitja az App Review Guidelines 2.3-as, „Accurate Metadata” részét, a 2-es, „Performance” szakaszon belül. A szöveg így kezdődik: „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.” Magyarul: semmi rejtett, alvó vagy dokumentálatlan.
A folytatás minden beküldésre vonatkozik: „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.” Minden újdonságot pontosan le kell írni a review jegyzetekben, és a reviewer számára elérhetővé kell tenni. A „hibajavítások és fejlesztések” tehát nem elég.
Ugyanez a bekezdés a megtévesztő marketingre is kiterjed: ha olyan tartalmat vagy szolgáltatást ígérsz, ami nincs benne, vagy hamis árat mutatsz, akár az App Store-ban, akár máshol.
Ez a rész a Noleránál jól jött. Amikor a megjelenés előtt átolvastam az adatlapját, két ellenőrizhetetlen mondatot találtam: „csak francia nyelvű felület”, ami már nem volt igaz, és „a legnépszerűbb csomag”, egy soha ki nem adott appnál. A reviewernek szóló jegyzetek is a termék egy elavult állapotát írták le. Pontosan ezt célozza ez a rész. A 2.3.10 viszont főleg az adatlapról szól.
Mit jelent a 2.3.1-es elutasító üzenet?
Az elutasítás címe „Guideline 2.3.1 - Performance”, néha „Hidden Features” kiegészítéssel. Két üzenet, amit React Native fejlesztők tettek közzé:
- 2024 március, egy CodePush GitHub ticketben: „The app contains hidden features.”, minden további részlet nélkül. A fejlesztő pontosítást kér, és a 2.5.2 alapján kap egy kiegészítést: „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.” A ticketből nem derül ki, hogy az app később átment-e.
- 2023 február, egy másik ticketben az Apple a bináris „CodePush-related remote code downloading/updating support” részét kifogásolja.
Az én olvasatom: a reviewer nem a frissítéseidet látja, hanem azt a kódot, ami képes fogadni őket. Mindkét eset a CodePusht érinti. EAS Update-et érintő friss nyilvános elutasítást nem találtam, de ez semmit nem bizonyít.
Távoli frissítések: mit enged a 2.5.2 és a licenc
A 2.5.2-es szabály, amiről a háttérmódokról szóló útmutatóban is írok, megtiltja, hogy az app „download, install, or execute code which introduces or changes features or functionality of the app”.
Az Apple Developer Program License Agreement 3.3.1(B) pontja tiltja a letöltött futtatható kódot, de kimondja: „Interpreted code may be downloaded to an Application”. Három feltétellel: ez a kód nem változtatja meg az app fő célját, nem kerüli meg sem az aláírást, sem a sandboxot, sem a rendszer biztonsági funkcióit, és nem hoz létre más appok áruházát.
Egy Expo app JavaScriptje interpretált kód: szerintem az EAS Update ebbe a keretbe fér bele. A dokumentációja emlékeztet rá, hogy a frissítések az App Store szabályait követik, és hogy „changes to your app's behavior need to be reviewed”. Kritikus hibánál az Expo a távoli javítást javasolja, majd egy új beküldést, ami már tartalmazza.
Az én határom: ami létezik, azt javítani és finomítani igen. Megváltoztatni, hogy mi az app vagy mit árul, nem.
Mit módosíthatsz távolról, és mihez kell új build
Az a táblázat, amit én használok, az itt idézett Apple és Expo oldalak alapján. Az „ingyenesből fizetős lesz” sor és az utolsó kettő az én értelmezésem.
| Változtatás | Út | Miért |
|---|---|---|
| JavaScript hiba | Távoli frissítés | Az Expo erre szánta |
| Szöveg, fordítás, stílus | Távoli frissítés | Az Expo erre szánta |
| Előfizetés ára | App Store Connect | Nem változik kód |
| Promóciós szöveg | App Store Connect | Új beküldés nélkül |
| Már jóváhagyott típusú vásárlás | Csak a vásárlás review | App Store Connect szabály |
| Egy típus első vásárlása | Új verzió | App Store Connect szabály |
| Új funkció | Új verzió | 2.3.1 és 2.5.2 |
| Ingyenesből fizetős lesz | Új verzió | Adatlap és jegyzetek átnézése |
| Engedély, Info.plist | Új build | A bináris része |
| Natív modul, Expo SDK | Új build | Változik a natív kód |
| Lekapcsoló kapcsoló | Távoli konfiguráció | Ideiglenesen elfogadott |
| Felfedő kapcsoló | Tilos | Soha nem volt review-n |
A promóciós szöveg „without requiring an updated submission” módosítható, az Apple verzióinformációkról szóló oldala szerint. Minden típus első vásárlása új verzióval megy, a későbbiek önállóan, a vásárlások beküldéséről szóló súgó szerint. Az Expo a natív kódot, az engedélyeket és az SDK verzióját azok közé sorolja, amikhez új bináris kell, ahogy az ITMS-90683 esetében is. Egy kapcsoló, ami lekapcsol egy elromlott funkciót, nem ad hozzá semmi újat, amíg nem veszi el azt, amiért az előfizetők fizettek.
Távoli kapcsolók elutasítás nélkül
A távoli kapcsoló, vagyis feature flag, önmagában nem tilos: minden azon múlik, mit rejt. Az én szabályaim:
- Minden, amit egy kapcsoló meg tud jeleníteni, ott van és be van kapcsolva a reviewernek, és meg van nevezve a review jegyzetekben.
- Egy A/B teszt két olyan változatot hasonlít össze, amit a reviewer láthat, soha nem egy átnézettet és egy újat.
- Semmilyen kód nem érzékeli a review-t, hogy másképp viselkedjen. Ez maga a rejtett funkció definíciója.
- Egy távolról vezérelt paywall csak jóváhagyott termékeket mutat, és minden változat betartja a 3.1.2-es szabályt.
Demó mód és tesztfiókok
A 2.1-es guideline demó fiókot kér, ha az appodban van bejelentkezés, bekapcsolt szerverrel. Ha jogi vagy biztonsági kötelezettségek miatt nem tudsz ilyet adni, egy beépített demó mód helyettesítheti, de csak „with prior approval by Apple”, és minden funkciót meg kell mutatnia. Az Apple verzióinformációs oldala hozzáteszi: a fiók nem járhat le, a további fiókok pedig a jegyzetekbe kerülnek, amik 4 000 bájtra korlátozottak.
A kapcsolat a 2.3.1-gyel: egy demó módot vagy tesztfiókot, ami máskülönben láthatatlan képernyőket nyit meg, le kell írni. Egy titkos gesztus, kód vagy különleges fiók, amit nem jelzel, rejtett funkció. Nevezz meg minden különleges hozzáférést a jegyzetekben, azzal együtt, hogy mit nyit meg.
A szabályom: review alatt nincs távoli frissítés
Miért van nálam mindenhol EAS Update: a Solysban, az ébresztős appomban, egy JavaScript hiba miatt az app elnémult, ha egy hangeffekt egyszer nem töltött be. A javítás három sor volt, de egy teljes build és egy review kellett a kiküldéséhez. Azóta minden appomban az első buildtől benne van az expo-updates: ez natív modul, egy nélküle fordított bináris soha nem fog semmit kapni. A konfigurációm az app.json-ban:
{
"expo": {
"runtimeVersion": { "policy": "fingerprint" },
"updates": { "fallbackToCacheTimeout": 0, "checkAutomatically": "ON_LOAD" }
}
}
A fingerprint beállítással egy frissítés csak azokhoz a binárisokhoz jut el, amelyeknek egyezik a natív kódja (runtime verziók). De amíg egy verzió vár vagy review alatt van, nem adok ki semmit. Két okból.
- A reviewer nem látná a javítást. Ha a
fallbackToCacheTimeout0, egy friss telepítés a beépített kóddal indul, és a frissítést a következő indításkor alkalmazza (expo-updates dokumentáció). A reviewer telepít, egyszer elindítja, és a binárist teszteli. A Nolerát úgy utasították el, hogy a javítás már ki volt küldve távolról: erről a 2.1-es útmutatóban mesélek. - Amit a reviewer tesztel, annak meg kell egyeznie azzal, amit a felhasználók kapnak. Ha review közben megváltoztatod a viselkedést, eltérés keletkezik az átnézett és a kiszállított verzió között.
Pontos review jegyzetek
A 2.3.1 elutasítja az általános leírásokat. A sablon, amit használnék, angolul:
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.
Hogyan válaszolj egy 2.3.1-es elutasításra?
Az App Store Connectben válaszolj, ahol az App Review üzenetére tudsz reagálni.
- Az üzenet homályos marad: kérdezd meg, melyik funkcióról van szó, ahogy a 2024-es ticket fejlesztője tette.
- Egy valódi funkció rosszul van leírva: add meg a pontos útvonalat és egy rövid videót, aztán egészítsd ki a jegyzeteket.
- Egy kapcsoló újdonságot fed fel: vedd ki, vagy kapcsold be és írd le, aztán készíts új buildet.
- A frissítő kód a gond: magyarázd el, hogy javításokra szolgál, a 3.3.1(B) pont keretein belül. A 2023-as ticketben az Apple az eltávolítását kérte.
A 2.3.1-es checklist beküldés előtt
- A verzió minden újdonsága le van írva a jegyzetekben, az útvonalával együtt.
- Minden távoli kapcsoló be van kapcsolva a review-ra, és meg van nevezve a jegyzetekben.
- Semmilyen kód nem viselkedik másképp a reviewernek.
- A különleges hozzáférések le vannak írva: demó mód, tesztfiók, gesztus.
- Az adatlap és a paywall semmit nem ígér, amit a build nem tud.
- Review alatt nem adsz ki távoli frissítést.
Ellenőrizd a csomagodat beküldés előtt
A Review Kit tartalmazza a beküldés előtti checklistemet, sablonokat a tesztelőnek szóló jegyzetekhez, és Claude Code skilleket, amik átnézik a projektedet. Ha emberi szemre van szükséged, foglalj egy órát velem: videóhívásban együtt átnézzük a review jegyzeteidet és a frissítési konfigurációdat. A teljes folyamat az Apple által elutasított app oldalon van.
Az első megjelenésedre készülsz? Töltsd ki az ingyenes diagnózist: sorba rendezi a lépéseket, és elküldi neked az Apple-elutasítások elleni checklistemet.
Gyakori kérdések
Mit jelent a „Guideline 2.3.1 - Performance - Hidden Features”?
Az Apple úgy ítéli meg, hogy az appodban van egy rejtett, alvó vagy a review jegyzetekből hiányzó funkció. Az üzenet olyan kódra is vonatkozhat, ami képes a review után megváltoztatni az appot, néha egy 2.5.2-es elutasítással együtt.
Engedélyezi az Apple az EAS Update-et?
A licenc engedi a letöltött interpretált kódot, amíg nem változtatja meg az app fő célját. Javítani igen. Review-n nem járt funkciót hozzáadni nem.
Használhatok feature flageket egy iOS appban?
Igen, ha minden, amit meg tudnak jeleníteni, átment a review-n. Kapcsolj be minden kapcsolót a review-ra, és írd le a jegyzetekben.
Jelezni kell a reviewernek a demó módot?
Igen. Egy beépített demó módhoz az Apple előzetes jóváhagyása kell, és minden funkciót meg kell mutatnia.
Kiadhatok távoli frissítést review alatt?
Semmi nem tiltja kifejezetten. De a reviewer az első indításkor nem látná, és eltérést okoz az átnézett verzióhoz képest. Én mindig tartózkodom tőle.

