Guideline 2.5.4: Apple zamietlo režim na pozadí
Autor: Mehdi Azizi
Zverejnené , 9 min
Guideline 2.5.4: Apple zamietne režim na pozadí, ktorý nevyužíva žiadna funkcia. Odstráň kľúč alebo ukáž reviewerovi zvuk, polohu či hovor.
Guideline 2.5.4 obmedzuje režimy na pozadí na ich zamýšľané použitie: zvuk, poloha, VoIP hovory, dokončenie úlohy, lokálne notifikácie. Zamietnutie príde, keď tvoj Info.plist deklaruje niektorý z týchto režimov a reviewer nenájde žiadnu funkciu, ktorá ho potrebuje. Ak ho nič nevyužíva, kľúč odstráň, inak ukáž reviewerovi funkciu do tridsiatich sekúnd.
Svoje vlastné iOS appky publikujem s Expo. Solys, môj budík s minihrami, deklaruje režim audio: odstránil som ho a potom ho z iného dôvodu vrátil. Tento návod vychádza z textu Apple, zo zamietnutí, ktoré zverejnili iní vývojári, a z mojich projektov. Celkový prehľad dôvodov nájdeš v článku prečo Apple zamieta appky.
Čo hovorí guideline 2.5.4?
Pravidlo sa zmestí do jednej vety, v sekcii 2 „Performance“, časť 2.5 „Software Requirements“, v App Review Guidelines: „Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc.“
Inými slovami: služba na pozadí slúži len na to, na čo existuje. Odtiaľ názov „Guideline 2.5.4 - Performance - Software Requirements“.
Appka, ktorá prejde na pozadie, sa štandardne pozastaví. Aby mohla bežať ďalej, deklaruje jeden alebo viac režimov v kľúči UIBackgroundModes vo svojom Info.plist. Dokumentácia Apple o režimoch na pozadí žiada používať ich striedmo, kvôli batérii, a uprednostniť iné riešenie, keď existuje. Každý deklarovaný režim je sľub, ktorý si reviewer môže overiť.
Režimy na pozadí a ich zamýšľané použitie
| Režim | Kľúč | Zamýšľané použitie |
|---|---|---|
| Audio, AirPlay, PiP | audio | Počuteľný zvuk na pozadí |
| Poloha | location | Nepretržitá poloha |
| Voice over IP | voip | Hovory s CallKit |
| Načítanie | fetch | Pravidelný obsah zo siete |
| Spracovanie | processing | Naplánované úlohy |
| Vzdialené notifikácie | remote-notification | Push nového obsahu |
Táto tabuľka zhŕňa stránku Apple. V zamietnutiach zverejnených na fórach sa najčastejšie objavujú audio, location a voip.
Čo znamená správa o zamietnutí 2.5.4?
Správa pomenuje príslušný režim. Dva príklady, ktoré vývojári zverejnili na fórach Apple:
- Audio: „Your app still declares support for audio in the UIBackgroundModes key in your Info.plist but did not include features that require persistent audio.“ Ďalej spresňuje, že kľúč
audioje určený pre appky, ktoré prehrávajú počuteľný obsah na pozadí, napríklad hudobný prehrávač. Ponúka dve cesty: tento obsah pridať alebo kľúč odstrániť (vlákno na fóre). - Poloha: vo vlákne z decembra 2024 Apple nenašlo okrem sledovania zamestnancov žiadnu funkciu, ktorá by potrebovala trvalú polohu, a napísalo, že samotné toto použitie nie je vhodné.
Ako to čítam ja: reviewer nečíta tvoj kód, hľadá funkciu. Musí ju vedieť spustiť, prepnúť appku na pozadie a vidieť, že beží ďalej.
Existuje aj opačný prípad. Vo vlákne z mája 2026 bola appka na čítanie nahlas, ktorá režim audio naozaj používala, zamietnutá niekoľkokrát: reviewer nedokázal zvuk spustiť. Iný vývojár tam píše, že podľa neho jeho prípad odblokovalo priložené video. Je to svedectvo, nie pravidlo Apple.
Odkiaľ sa kľúč vzal, keď si ho nepridal?
S Expo vypĺňajú Info.plist pri prebuilde konfiguračné pluginy. Režim na pozadí sa teda môže dostať do tvojho binárky bez toho, aby si o tom rozhodol.
Plugin expo-audio s predvoleným nastavením
Dokumentácia expo-audio to uvádza: voľba enableBackgroundPlayback má predvolene hodnotu true a na iOS pridáva režim audio. Stačí teda deklarovať plugin v krátkom tvare, "expo-audio", a režim je deklarovaný.
Presne to som našiel, keď som pred prvým odoslaním prechádzal TradaZen: krátke zvuky rozhrania v popredí, ale plugin deklarovaný v krátkom tvare. Oprava sa zmestí do app.json:
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
Iné balíky pridávajú režim po svojom. Voľba isIosBackgroundLocationEnabled v expo-location pridá location, len ak ju zapneš. expo-background-task zase pridá processing pri prebuilde hneď, ako je nainštalovaný.
Priečinok ios/, ktorý drží starý kľúč
Druhá pasca, ktorú som zažil so Solys v júli 2026. Z app.json som audio odstránil, ale kľúč zostal v ios/Solys/Info.plist, vygenerovanom skôr. Prebuild bez --clean tento projekt upraví namiesto toho, aby ho vytvoril nanovo, a plugin kľúč pridá, no nikdy ho neodstráni. Lokálny build by ho do binárky zabalil. Build EAS v cloude začína z nového prebuildu, keď git priečinok ios/ ignoruje, čo bol môj prípad.
Pred každým buildom si overím, čo sa naozaj odošle:
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
Prvý príkaz vypíše režimy, ktoré prebuild zapíše do Info.plist. Druhý vytvorí natívny projekt nanovo pre lokálny build a vymaže pritom priečinok ios/. Pri Solys prvý zobrazí "UIBackgroundModes":["audio"], pri TradaZen nič: obe sú zámerné.
Pridanie alebo odstránenie režimu mení Info.plist, teda binárku: treba nový build, vzdialená aktualizácia nestačí. Dokumentácia EAS Update radí tieto zmeny medzi tie, ktoré vyžadujú novú binárku, rovnako ako pri ITMS-90683.
Solys: deklarovaný režim audio so skutočným dôvodom
Solys je budík, ale režim audio neslúži na zvonenie alarmu: zvonenie ide cez AlarmKit, službu budíkov od Apple dostupnú od iOS 26 (dokumentácia AlarmKit). Zvoní systém, aj v tichom režime, nie appka.
História kľúča, pretože úvaha je dôležitejšia než samotný riadok:
- Koncom júla 2026 ho odstraňujem. Nič neprehrávalo zvuk na pozadí: zvukové efekty minihier zostávajú v popredí a alarm od appky nezávisí.
- O dva dni ho vraciam, spolu s nočným počúvaním. Táto voľba nahráva mikrofónom zvuky tvojej noci a analyzuje ich na iPhone. Nahrávanie musí pokračovať aj pri zamknutej obrazovke a dokumentácia expo-audio uvádza, že voľba nahrávania na pozadí tiež pridáva režim
audio.
Odôvodnenie zmenilo povahu: režim slúži na nahrávanie, nie na prehrávanie. Tri poistky, viditeľné v appke:
- počúvanie je voľba predvolene vypnutá, zapína sa v nastaveniach alebo vo večernom rituáli;
- má vlastnú obrazovku so súhlasom, ako to pri každom nahrávaní vyžaduje pravidlo 2.5.14, a nič neopustí telefón;
- mikrofón sa zavrie desať minút pred alarmom, aby sa počúvanie a zvonenie nikdy neprekážali.
Nemôžem zaručiť, že reviewer túto deklaráciu vždy prijme. Viem ale pri každom prvku povedať, na čo slúži a kde ho vidieť.
Budíky, ktoré držali appku hore
Pred AlarmKit nemohla budíková appka tretej strany zvoniť ako alarm od Apple. Niektoré knižnice preto držali appku hore: dokumentácia Flutter balíka alarm2 opisuje tichý audio prehrávač, ktorý beží až do alarmu. Lenže tichý zvuk nie je počuť. Od iOS 26 robí AlarmKit túto obchádzku zbytočnou.
Ponechať alebo odstrániť režim: rozhodovacia tabuľka
| Tvoja situácia | Čo robiť |
|---|---|
| Krátke zvuky v popredí | Odstrániť audio |
| Hudba alebo audiokniha | Ponechať, ukázať |
| Dlhé nahrávanie | Ponechať + súhlas |
| Budík alebo časovač | AlarmKit (iOS 26) |
| Občasná poloha | Významné zmeny polohy |
| Synchronizácia bez súrnosti | fetch alebo processing |
| Audio alebo video hovory | voip s CallKit |
Pri polohe uvádza stránka Apple ako alternatívu k režimu location službu významných zmien polohy.
Ďalšie body pravidla 2.5: 2.5.1 a 2.5.2
2.5.1: verejné API a frameworky na svojom mieste
„Apps may only use public APIs and must run on the currently shipping OS.“ Appka používa len verejné API, beží na aktuálnej verzii systému a opúšťa to, čo je zastarané. Rovnako ako pri 2.5.4 slúži každý framework na svoje zamýšľané použitie, uvedené v popise: HealthKit na zdravie, HomeKit na inteligentnú domácnosť. Ak knižnica volá súkromné API, zamietnutie odnesie tvoja appka.
2.5.2: žiadny stiahnutý kód, ktorý mení appku
Appka zostáva samostatná vo svojom balíku. Nesmie „download, install, or execute code which introduces or changes features or functionality of the app“. Obmedzenú výnimku majú len vzdelávacie appky, ktoré učia programovať, s kódom úplne viditeľným a upraviteľným používateľom.
Pri Expo sa to týka EAS Update, ktorého dokumentácia pripomína, že aktualizácie musia dodržiavať pravidlá App Store. Vzdialené aktualizácie používaj na opravy, nikdy na doručenie funkcie, ktorú reviewer nevidel. Oprava súvisiaca s review ide cez nový build, ako vysvetľujem v návode ku guideline 2.1.
Ako odpovedať na zamietnutie 2.5.4?
Konverzácia prebieha v sekcii App Review tvojej appky, kde odpovedáš na správu od App Review. Dva prípady:
- Režim nič nevyužíva: odstráň ho, sprav nový build, over introspekciu a odpovedz dvoma vetami.
- Režim slúži skutočnej funkcii: odpovedz presným postupom a krátkym videom, potom tento text zopakuj v poznámkach pre review pri každej verzii.
Šablóna, ktorú by som použil, na prispôsobenie (vetu o alarme vynechaj, ak tvoja appka žiadny nemá):
Hello,
The "audio" background mode is used only by [feature], an
optional feature that [records / plays] audio while the
device is locked. It is off by default.
How to test:
1. Open [screen] and turn on [feature].
2. Accept the microphone permission if asked.
3. Tap [button], then lock the device.
[What the reviewer will hear or see.]
Our alarm does not use this mode: it is scheduled with
AlarmKit and rings through the system.
Attached: a short screen recording of these steps.
Best regards,
Checklist 2.5.4 pred odoslaním
- Introspekcia Expo zobrazuje len zámerné režimy a pri každom vieš pomenovať jeho funkciu.
- Žiadny plugin nie je deklarovaný v krátkom tvare, ak predvolene pridáva režim, ako expo-audio.
- Tvoj lokálny priečinok
ios/nedrží žiadny starý kľúč, alebo kompiluješ z čistého prebuildu. - Funkcia sa spustí rýchlo, bez skrytého nastavenia, a poznámky pre review hovoria, ktorý režim slúži na čo a ako ho otestovať.
- Každé nahrávanie si vyžiada výslovný súhlas a zobrazuje viditeľný indikátor. Pravidlá o žiadostiach o povolenia sú v návode ku guideline 5.1.1.
- Pri budíku ide zvonenie cez AlarmKit, nie cez zvuk prehrávaný z appky.
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: prečítame si správu od Apple a tvoj Info.plist spolu, cez videohovor. Celý postup nájdeš na stránke appka zamietnutá od Apple.
Pripravuješ svoje prvé vydanie? Sprav si bezplatnú diagnostiku: zoradí kroky a pošle ti môj checklist proti zamietnutiu od Apple.
Nikto nemôže zaručiť, že Apple tvoju appku prijme. Dobre odôvodnený režim na pozadí sa však dá obhájiť za tridsať sekúnd.
Často kladené otázky
Čo znamená „Guideline 2.5.4 - Performance - Software Requirements“?
Je to názov zamietnutia, keď Apple usúdi, že režim na pozadí v tvojom Info.plist neslúži na svoje zamýšľané použitie. Správa pomenuje režim a navrhne ukázať funkciu, ktorá ho využíva, alebo kľúč odstrániť.
Treba po zamietnutí 2.5.4 nový build?
Ak režim odstrániš alebo upravíš, áno: kľúč je v Info.plist, teda v binárke. Ak je režim odôvodnený, môže stačiť odpoveď s presným postupom a videom.
Môžem si ponechať režim audio kvôli pár zvukom rozhrania?
Nie. Krátke zvuky prehrávané v popredí ho nepotrebujú. S Expo nastav v plugine expo-audio enableBackgroundPlayback na false.
Potrebuje budíková appka režim audio?
Na zvonenie nie, ak sa opiera o AlarmKit, dostupný od iOS 26: alarm prehráva systém. V Solys slúži režim audio na nočné počúvanie, ktoré nahráva pri zamknutej obrazovke.
Prečo Apple uvádza 2.5.4, keď som nič nedeklaroval?
Možno to za teba urobil plugin: expo-audio predvolene pridáva režim audio a starý priečinok ios/ môže držať kľúč, ktorý si z konfigurácie odstránil. Over si to cez npx expo config --type introspect.

