Guideline 2.3.1: skrite funkcije in posodobitve OTA
Avtor: Mehdi Azizi
Objavljeno , 9 min
Guideline 2.3.1: Apple zavrne vsako skrito, speče ali v opombah za pregled neopisano funkcijo. Kaj lahko spremeniš na daljavo in kaj zahteva nov build.
Guideline 2.3.1 prepoveduje skrite, speče ali nedokumentirane funkcije: vse, kar tvoja aplikacija počne, mora biti vidno uporabniku in pregledovalcu. Vsako novost natančno opišeš v opombah za pregled. Posodobitev na daljavo lahko popravi to, kar je Apple videl, nikoli pa ne doda tistega, česar Apple ni videl.
Svoje iOS aplikacije objavljam z Expo in vsaka ima EAS Update že od prvega builda, da lahko pošiljam popravke. Moje pravilo: nobene posodobitve na daljavo, dokler je verzija v pregledu. Ta vodnik temelji na Applovem besedilu, njegovi licenci, dokumentaciji Expo in objavljenih zavrnitvah.
Kaj pravi guideline 2.3.1?
2.3.1 odpira del 2.3 »Accurate Metadata« v App Review Guidelines, v razdelku 2 »Performance«. Besedilo se začne tako: »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.« Po domače: nič skritega, spečega ali nedokumentiranega.
Nadaljevanje velja za vsako oddajo: »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.« Vsaka novost mora biti natančno opisana v opombah za pregled in pregledovalcu dostopna. »Popravki napak in izboljšave« torej ne zadošča.
Isti odstavek cilja tudi na zavajajoč marketing: obljubljanje vsebine ali storitve, ki je ni, ali prikaz lažne cene, v App Store ali kje drugje.
Ta del mi je prišel prav pri Noleri. Ko sem pred izidom ponovno bral njen opis, sem našel dva stavka, ki ju ni bilo mogoče preveriti: »vmesnik samo v francoščini«, kar ni bilo več res, in »najpogosteje izbran paket«, za aplikacijo, ki še nikoli ni bila objavljena. Tudi opombe za pregledovalca so opisovale zastarelo stanje izdelka. Točno na to cilja ta del. 2.3.10 pa cilja predvsem na opis v trgovini.
Kaj pomeni sporočilo o zavrnitvi 2.3.1?
Zavrnitev nosi naslov »Guideline 2.3.1 - Performance«, včasih mu sledi »Hidden Features«. Dve sporočili, ki so ju objavili razvijalci React Native:
- Marec 2024, v GitHub ticketu za CodePush: »The app contains hidden features.«, brez drugih podrobnosti. Razvijalec prosi za pojasnilo in dobi dopolnitev po 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.« Iz ticketa ni razvidno, ali je aplikacija potem prišla skozi.
- Februar 2023, v drugem ticketu, Apple cilja na »CodePush-related remote code downloading/updating support« v binarni datoteki.
Kako jaz to razumem: pregledovalec ne vidi tvojih posodobitev, vidi kodo, ki jih lahko sprejema. Oba primera ciljata na CodePush. Nedavne javne zavrnitve zaradi EAS Update nisem našel, kar pa ne dokazuje ničesar.
Posodobitve na daljavo: kaj dovoljujeta 2.5.2 in licenca
Pravilo 2.5.2, ki ga obravnavam tudi v vodniku o načinih v ozadju, aplikaciji prepoveduje, da bi »download, install, or execute code which introduces or changes features or functionality of the app«.
Člen 3.3.1(B) v Apple Developer Program License Agreement prepoveduje preneseno izvršljivo kodo, a pojasni: »Interpreted code may be downloaded to an Application«. Pod tremi pogoji: ta koda ne spremeni glavnega namena aplikacije, ne zaobide podpisa, peskovnika ali varnostnih mehanizmov sistema in ne ustvari trgovine z drugimi aplikacijami.
JavaScript v aplikaciji Expo je interpretirana koda: po mojem EAS Update spada v ta okvir. Njegova dokumentacija opozarja, da posodobitve sledijo pravilom App Store in da »changes to your app's behavior need to be reviewed«. Za kritično napako Expo predlaga popravek na daljavo, nato pa novo oddajo, ki ga vključuje.
Moja meja: popravljati in prilagajati obstoječe, da. Spreminjati, kaj aplikacija je ali kaj prodaja, ne.
Kaj lahko spremeniš na daljavo in kaj zahteva nov build
Tabela, ki jo uporabljam, izhaja iz tu navedenih strani Appla in Expo. Vrstica »brezplačno postane plačljivo« in zadnji dve sta moja razlaga.
| Sprememba | Pot | Zakaj |
|---|---|---|
| Napaka v JavaScriptu | Posodobitev na daljavo | Namen, ki ga predvideva Expo |
| Besedilo, prevod, slog | Posodobitev na daljavo | Namen, ki ga predvideva Expo |
| Cena naročnine | App Store Connect | Koda ni spremenjena |
| Promocijsko besedilo | App Store Connect | Brez nove oddaje |
| Nakup že potrjenega tipa | Pregled samo nakupa | Pravilo App Store Connect |
| Prvi nakup določenega tipa | Nova verzija | Pravilo App Store Connect |
| Nova funkcija | Nova verzija | 2.3.1 in 2.5.2 |
| Brezplačno postane plačljivo | Nova verzija | Popraviti opis in opombe |
| Dovoljenje, Info.plist | Nov build | Datoteka v binarni datoteki |
| Nativni modul, Expo SDK | Nov build | Spremenjena nativna koda |
| Stikalo, ki izklopi | Oddaljena konfiguracija | Sprejemljivo, če je začasno |
| Stikalo, ki razkrije | Prepovedano | Funkcija ni bila nikoli pregledana |
Promocijsko besedilo spremeniš »without requiring an updated submission«, piše na Applovi strani o informacijah o verziji. Prvi nakup vsakega tipa gre z novo verzijo, naslednji samostojno, piše v pomoči o oddaji nakupov. Expo nativno kodo, dovoljenja in verzijo SDK uvršča med stvari, ki zahtevajo novo binarno datoteko, kot pri ITMS-90683. Stikalo, ki izklopi pokvarjeno funkcijo, ne doda ničesar novega, dokler naročnikom ne odvzame tistega, kar so plačali.
Stikala na daljavo brez zavrnitve
Stikalo na daljavo oziroma feature flag samo po sebi ni prepovedano: vse je odvisno od tega, kaj skriva. Moja pravila:
- Vse, kar stikalo lahko prikaže, je prisotno in vklopljeno za pregledovalca ter poimenovano v opombah za pregled.
- A/B test primerja dve varianti, ki ju pregledovalec lahko vidi, nikoli pregledane in nove variante.
- Nobena koda ne zaznava pregleda, da bi se obnašala drugače. To je sama definicija skrite funkcije.
- Paywall, voden na daljavo, prikazuje samo potrjene izdelke, vsaka varianta pa spoštuje pravilo 3.1.2.
Demo način in testni računi
Guideline 2.1 zahteva demo račun, če ima tvoja aplikacija prijavo, s prižganim strežnikom. Če ti zakonske ali varnostne obveznosti preprečujejo, da bi ga dal, ga lahko nadomesti vgrajen demo način, a samo »with prior approval by Apple«, in pokazati mora vse funkcije. Applova stran o informacijah o verziji dodaja: račun ne poteče, dodatni računi pa gredo v opombe, omejene na 4000 bajtov.
Povezava z 2.3.1: demo način ali testni račun, ki odpre sicer nevidne zaslone, mora biti opisan. Skrita kretnja, koda ali poseben račun, ki ni naveden, je skrita funkcija. V opombah poimenuj vsak poseben dostop in kaj odpre.
Moje pravilo: nobene posodobitve na daljavo med pregledom
Zakaj imam EAS Update povsod: pri Solysu, moji budilki, je napaka v JavaScriptu utišala aplikacijo, takoj ko se zvočni učinek enkrat ni predvajal. Popravek je imel tri vrstice, a za dostavo je bil potreben cel build in pregled. Od takrat imajo vse moje aplikacije expo-updates že od prvega builda: to je nativni modul, binarna datoteka, prevedena brez njega, ne bo nikoli prejela ničesar. Moja konfiguracija v app.json:
{
"expo": {
"runtimeVersion": { "policy": "fingerprint" },
"updates": { "fallbackToCacheTimeout": 0, "checkAutomatically": "ON_LOAD" }
}
}
S fingerprint posodobitev doseže samo binarne datoteke z ustrezno nativno kodo (verzije izvajalnega okolja). A medtem ko verzija čaka na pregled ali je v njem, ne objavim ničesar. Iz dveh razlogov.
- Pregledovalec popravka ne bi videl. Ko je
fallbackToCacheTimeout0, se sveža namestitev zažene z vgrajeno kodo in posodobitev uporabi ob naslednjem zagonu (dokumentacija expo-updates). Pregledovalec namesti, zažene enkrat in testira binarno datoteko. Nolera je bila zavrnjena s popravkom, ki je bil na daljavo že dostavljen: o tem pišem v vodniku za 2.1. - Kar pregledovalec testira, mora ostati to, kar dobijo uporabniki. Spreminjanje obnašanja med pregledom ustvari razliko med pregledano in dostavljeno verzijo.
Natančne opombe za pregled
2.3.1 zavrača splošne opise. Predloga, ki bi jo uporabil, v angleščini:
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.
Kako odgovoriti na zavrnitev 2.3.1?
Odgovori v App Store Connect, kjer odgovoriš na sporočilo App Review.
- Sporočilo ostaja nejasno: vprašaj, za katero funkcijo gre, kot razvijalec iz ticketa iz leta 2024.
- Prava funkcija je slabo opisana: daj natančno pot in kratek video, nato dopolni opombe.
- Stikalo razkrije nekaj novega: odstrani ga ali ga vklopi in opiši, nato naredi nov build.
- Težava je koda za posodobitve: pojasni, da služi popravkom, v okviru člena 3.3.1(B). V ticketu iz leta 2023 je Apple zahteval, da jo odstraniš.
Kontrolni seznam 2.3.1 pred oddajo
- Vsaka novost verzije je opisana v opombah, s potjo do nje.
- Vsako stikalo na daljavo je vklopljeno za pregled in poimenovano v opombah.
- Nobena koda ne spreminja obnašanja za pregledovalca.
- Posebni dostopi so opisani: demo način, testni račun, kretnja.
- Opis v trgovini in paywall ne obljubljata ničesar, česar build ne naredi.
- Med pregledom ni objavljena nobena posodobitev na daljavo.
Preveri svojo oddajo pred pošiljanjem
Review Kit združuje moj kontrolni seznam pred oddajo, predloge opomb za testerja in skille za Claude Code, ki pregledajo tvoj projekt. Če želiš človeški pogled, rezerviraj uro z mano: skupaj po videoklicu pregledava tvoje opombe za pregled in konfiguracijo posodobitev. Celoten postopek je na strani aplikacija, ki jo je Apple zavrnil.
Pripravljaš svojo prvo objavo? Naredi brezplačno diagnozo: korake postavi v pravi vrstni red in ti pošlje moj kontrolni seznam proti Applovim zavrnitvam.
Pogosta vprašanja
Kaj pomeni »Guideline 2.3.1 - Performance - Hidden Features«?
Apple meni, da tvoja aplikacija vsebuje skrito ali spečo funkcijo oziroma funkcijo, ki je ni v opombah za pregled. Sporočilo lahko cilja tudi na kodo, ki lahko aplikacijo spremeni po pregledu, včasih skupaj z zavrnitvijo 2.5.2.
Ali Apple dovoli EAS Update?
Licenca dovoljuje preneseno interpretirano kodo, dokler ne spremeni glavnega namena aplikacije. Popravljati, da. Dodati funkcijo, ki ni bila pregledana, ne.
Ali lahko v iOS aplikaciji uporabljam feature flage?
Da, če je bilo vse, kar lahko prikažejo, pregledano. Vsako stikalo za pregled vklopi in ga opiši v opombah.
Ali moram pregledovalcu sporočiti demo način?
Da. Vgrajen demo način zahteva predhodno Applovo odobritev in mora pokazati vse funkcije.
Ali lahko med pregledom objavim posodobitev na daljavo?
Črno na belem tega nič ne prepoveduje. A pregledovalec je ob prvem zagonu ne bi videl, poleg tega ustvari razliko s pregledano verzijo. Sam se tega vedno vzdržim.

