Guideline 2.3.1: skryté funkcie a OTA aktualizácie
Autor: Mehdi Azizi
Zverejnené , 9 min
Guideline 2.3.1: Apple odmieta každú skrytú, neaktívnu alebo v poznámkach nepopísanú funkciu. Čo môžeš zmeniť na diaľku a čo si vyžaduje nový build.
Guideline 2.3.1 zakazuje skryté, neaktívne alebo nezdokumentované funkcie: všetko, čo tvoja appka robí, musí byť viditeľné pre používateľa aj pre reviewera. Každú novinku treba presne popísať v poznámkach pre review. Aktualizácia na diaľku môže opraviť to, čo Apple videl, nikdy nemôže pridať to, čo Apple nevidel.
Svoje iOS appky vydávam cez Expo a každá má EAS Update už od prvého buildu, aby som mohol posielať opravy. Moje pravidlo: žiadna aktualizácia na diaľku, kým je verzia v review. Tento návod vychádza z textu Apple, jeho licencie, dokumentácie Expo a zverejnených zamietnutí.
Čo hovorí guideline 2.3.1?
Pravidlo 2.3.1 otvára časť 2.3 „Accurate Metadata“ v App Review Guidelines, v sekcii 2 „Performance“. Text začína takto: „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.“ Jednoducho: nič skryté, uspané ani nezdokumentované.
Ďalšia časť sa týka každého odoslania: „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.“ Každú novinku musíš presne popísať v poznámkach pre review a reviewer k nej musí mať prístup. „Opravy chýb a vylepšenia“ teda nestačí.
Ten istý odsek mieri aj na zavádzajúci marketing: sľubovať obsah alebo službu, ktorá neexistuje, alebo zobrazovať falošnú cenu, v App Store aj inde.
Táto časť mi pomohla pri Nolere. Keď som pred vydaním prečítal jej stránku v obchode, našiel som dve neoveriteľné vety: „rozhranie len vo francúzštine“, ktorá už neplatila, a „najčastejšie vyberaný balík“ pri appke, ktorá ešte nikdy nevyšla. Aj poznámky pre reviewera popisovali zastaraný stav produktu. Presne na toto táto časť mieri. Pravidlo 2.3.10 sa zas týka hlavne stránky v obchode.
Čo znamená správa o zamietnutí 2.3.1?
Zamietnutie má názov „Guideline 2.3.1 - Performance“, niekedy s dodatkom „Hidden Features“. Dve správy, ktoré zverejnili vývojári v React Native:
- Marec 2024, v GitHub tickete CodePush: „The app contains hidden features.“, bez ďalšieho vysvetlenia. Vývojár žiada upresnenie a dostane doplnok podľa 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.“ Z ticketu nie je jasné, či appka potom prešla.
- Február 2023, v inom tickete, Apple vytýka v binárke „CodePush-related remote code downloading/updating support“.
Môj výklad: reviewer nevidí tvoje aktualizácie, vidí kód, ktorý ich dokáže prijať. Oba prípady sa týkajú CodePush. Nenašiel som žiadne nedávne verejné zamietnutie kvôli EAS Update, čo však nič nedokazuje.
Aktualizácie na diaľku: čo dovoľuje 2.5.2 a licencia
Pravidlo 2.5.2, ktorému sa venujem aj v návode o režimoch na pozadí, zakazuje appke „download, install, or execute code which introduces or changes features or functionality of the app“.
Článok 3.3.1(B) v Apple Developer Program License Agreement zakazuje stiahnutý spustiteľný kód, ale upresňuje: „Interpreted code may be downloaded to an Application“. Za troch podmienok: tento kód nemení hlavný účel appky, neobchádza podpis, sandbox ani bezpečnostné prvky systému a nevytvára obchod s inými appkami.
JavaScript v Expo appke je interpretovaný kód: podľa mňa teda EAS Update do tohto rámca patrí. Jeho dokumentácia pripomína, že aktualizácie sa riadia pravidlami App Store a že „changes to your app's behavior need to be reviewed“. Pri kritickej chybe Expo odporúča opravu na diaľku a potom nové odoslanie, ktoré ju bude obsahovať.
Moja hranica: opravovať a dolaďovať to, čo existuje, áno. Meniť to, čím appka je alebo čo predáva, nie.
Čo môžeš zmeniť na diaľku a čo si vyžaduje nový build
Prehľad, ktorý používam, vychádza zo stránok Apple a Expo citovaných tu. Riadok „bezplatné, ktoré sa stane platené“ a posledné dva sú môj výklad.
| Zmena | Cesta | Prečo |
|---|---|---|
| Chyba v JavaScripte | Aktualizácia na diaľku | Použitie, s ktorým Expo počíta |
| Text, preklad, štýl | Aktualizácia na diaľku | Použitie, s ktorým Expo počíta |
| Cena predplatného | App Store Connect | Žiadna zmena kódu |
| Propagačný text | App Store Connect | Bez nového odoslania |
| Nákup už schváleného typu | Review samotného nákupu | Pravidlo App Store Connect |
| Prvý nákup daného typu | Nová verzia | Pravidlo App Store Connect |
| Nová funkcia | Nová verzia | 2.3.1 a 2.5.2 |
| Bezplatné, ktoré sa stane platené | Nová verzia | Treba upraviť stránku a poznámky |
| Povolenie, Info.plist | Nový build | Súbor v binárke |
| Natívny modul, Expo SDK | Nový build | Zmenený natívny kód |
| Prepínač, ktorý vypína | Vzdialená konfigurácia | Tolerované, ak je dočasný |
| Prepínač, ktorý odhaľuje | Zakázané | Funkcia nikdy neprešla review |
Propagačný text sa dá zmeniť „without requiring an updated submission“, podľa stránky Apple o informáciách o verzii. Prvý nákup každého typu ide s novou verziou, ďalšie samostatne, podľa pomocníka o odosielaní nákupov. Expo radí natívny kód, povolenia a verziu SDK medzi veci, ktoré si vyžadujú novú binárku, rovnako ako pri ITMS-90683. Prepínač, ktorý vypne pokazenú funkciu, nepridáva nič nové, pokiaľ neberie predplatiteľom to, za čo zaplatili.
Prepínače na diaľku bez zamietnutia
Prepínač na diaľku, čiže feature flag, nie je sám osebe zakázaný: všetko závisí od toho, čo skrýva. Moje pravidlá:
- Všetko, čo prepínač dokáže zobraziť, je pre reviewera prítomné a zapnuté, a je pomenované v poznámkach pre review.
- A/B test porovnáva dve varianty, ktoré reviewer môže vidieť, nikdy nie variantu po review a variantu, ktorú nikto nevidel.
- Žiadny kód nezisťuje, že prebieha review, aby sa správal inak. To je presná definícia skrytej funkcie.
- Paywall riadený na diaľku ukazuje len schválené produkty a každá varianta dodržiava pravidlo 3.1.2.
Demo režim a testovacie účty
Guideline 2.1 vyžaduje demo účet, ak má tvoja appka prihlásenie, a zapnutý server. Ak ti ho právne alebo bezpečnostné povinnosti nedovolia poskytnúť, môže ho nahradiť zabudovaný demo režim, ale len „with prior approval by Apple“, a musí ukazovať všetky funkcie. Stránka Apple o informáciách o verzii dodáva: účet nevyprší a ďalšie účty idú do poznámok, ktoré majú limit 4 000 bajtov.
Súvis s 2.3.1: demo režim alebo testovací účet, ktorý otvára obrazovky inak neviditeľné, musí byť popísaný. Tajné gesto, kód alebo špeciálny účet bez upozornenia je skrytá funkcia. Každý špeciálny prístup uveď v poznámkach aj s tým, čo otvára.
Moje pravidlo: žiadna aktualizácia na diaľku počas review
Prečo mám EAS Update všade: v Solys, mojom budíku, chyba v JavaScripte stlmila appku, len čo raz zlyhal zvukový efekt. Oprava mala tri riadky, ale na jej doručenie bol potrebný celý build a review. Odvtedy majú všetky moje appky expo-updates od prvého buildu: je to natívny modul, binárka skompilovaná bez neho nikdy nič nedostane. Moja konfigurácia v app.json:
{
"expo": {
"runtimeVersion": { "policy": "fingerprint" },
"updates": { "fallbackToCacheTimeout": 0, "checkAutomatically": "ON_LOAD" }
}
}
S fingerprint sa aktualizácia dostane len k binárkam, ktorých natívny kód sedí (runtime verzie). Ale kým verzia čaká na review alebo ním prechádza, nič nevydávam. Z dvoch dôvodov.
- Reviewer by opravu nevidel. S
fallbackToCacheTimeoutna 0 sa nová inštalácia spustí so zabudovaným kódom a aktualizáciu použije až pri ďalšom spustení (dokumentácia expo-updates). Reviewer nainštaluje, raz spustí a testuje binárku. Nolera bola zamietnutá, hoci oprava už bola doručená na diaľku: rozprávam o tom v návode k 2.1. - To, čo reviewer testuje, musí zostať tým, čo dostanú používatelia. Meniť správanie počas review vytvára rozdiel medzi verziou, ktorú videl, a verziou, ktorá sa doručí.
Presné poznámky pre review
Pravidlo 2.3.1 odmieta všeobecné popisy. Šablóna, ktorú by som použil, v angličtine:
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.
Ako odpovedať na zamietnutie 2.3.1?
Odpovedz v App Store Connect, kde odpovedáš na správu od App Review.
- Správa je nejasná: opýtaj sa, o ktorú funkciu ide, ako vývojár v tickete z roku 2024.
- Skutočná funkcia je zle popísaná: uveď presnú cestu a krátke video, potom doplň poznámky.
- Prepínač odhaľuje niečo nové: odstráň ho, alebo ho zapni a popíš, potom urob nový build.
- Problém je v kóde na aktualizácie: vysvetli, že slúži na opravy v rámci článku 3.3.1(B). V tickete z roku 2023 Apple žiadal jeho odstránenie.
Checklist 2.3.1 pred odoslaním
- Každá novinka vo verzii je popísaná v poznámkach aj s cestou k nej.
- Každý prepínač na diaľku je pre review zapnutý a pomenovaný v poznámkach.
- Žiadny kód nemení správanie pre reviewera.
- Špeciálne prístupy sú popísané: demo režim, testovací účet, gesto.
- Stránka v obchode ani paywall nesľubujú nič, čo build nerobí.
- Počas review nie je vydaná žiadna aktualizácia na diaľku.
Skontroluj si podklady pred odoslaním
Review Kit obsahuje môj checklist pred odoslaním, šablóny poznámok pre testera a skills pre Claude Code, ktoré prejdú tvoj projekt. Ak chceš ľudský pohľad, rezervuj si so mnou hodinu: spolu prejdeme tvoje poznámky pre review a nastavenie aktualizácií cez videohovor. Celý postup nájdeš na stránke appka zamietnutá od Apple.
Pripravuješ svoje prvé vydanie? Urob si bezplatnú diagnostiku: zoradí ti kroky a pošle ti môj checklist proti zamietnutiu od Apple.
Často kladené otázky
Čo znamená „Guideline 2.3.1 - Performance - Hidden Features“?
Apple usúdil, že tvoja appka obsahuje skrytú, neaktívnu alebo v poznámkach pre review chýbajúcu funkciu. Správa môže mieriť aj na kód, ktorý dokáže appku zmeniť po review, niekedy spolu so zamietnutím 2.5.2.
Povoľuje Apple EAS Update?
Licencia povoľuje stiahnutý interpretovaný kód, pokiaľ nemení hlavný účel appky. Opravovať áno. Pridať funkciu, ktorá neprešla review, nie.
Dajú sa v iOS appke používať feature flagy?
Áno, ak všetko, čo môžu zobraziť, prešlo review. Každý prepínač pre review zapni a popíš ho v poznámkach.
Treba reviewerovi oznámiť demo režim?
Áno. Zabudovaný demo režim vyžaduje predchádzajúci súhlas Apple a musí ukazovať všetky funkcie.
Dá sa počas review vydať aktualizácia na diaľku?
Výslovne to nič nezakazuje. Reviewer by ju však pri prvom spustení nevidel a vytvára rozdiel oproti verzii, ktorá prešla review. Ja to nerobím nikdy.

