# Guideline 2.5.4: Apple zamietlo režim na pozadí

> Guideline 2.5.4: Apple zamietne režim na pozadí, ktorý nevyužíva žiadna funkcia. Odstráň kľúč alebo ukáž reviewerovi zvuk, polohu či hovor.

Pôvodná stránka: [Guideline 2.5.4: Apple zamietlo režim na pozadí](https://devoria.fr/sk/blog/guideline-2-5-4-rezim-na-pozadi-zamietnutie)
Autor: [Mehdi Azizi](https://devoria.fr/sk/mehdi-azizi)
Zverejnenie: 2026-11-04
Posledná revízia obsahu: 2026-11-04


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](https://devoria.fr/sk/blog/zamietnutie-aplikacie-apple-pricina).

## Č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](https://developer.apple.com/app-store/review/guidelines/#2.5.4): „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í](https://developer.apple.com/documentation/xcode/configuring-background-execution-modes) ž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ľúč `audio` je 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](https://developer.apple.com/forums/thread/95216)).
- **Poloha**: vo [vlákne z decembra 2024](https://developer.apple.com/forums/thread/771202) 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](https://developer.apple.com/forums/thread/826849) 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](https://docs.expo.dev/versions/latest/sdk/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`:

```json
{
  "expo": {
    "plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
  }
}
```

Iné balíky pridávajú režim po svojom. Voľba `isIosBackgroundLocationEnabled` v [expo-location](https://docs.expo.dev/versions/latest/sdk/location/) pridá `location`, len ak ju zapneš. [expo-background-task](https://docs.expo.dev/versions/latest/sdk/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:

```bash
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](https://docs.expo.dev/eas-update/introduction/) radí tieto zmeny medzi tie, ktoré vyžadujú novú binárku, rovnako ako pri [ITMS-90683](https://devoria.fr/sk/blog/itms-90683-missing-purpose-string-expo).

## 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](https://developer.apple.com/documentation/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:

1. **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í.
2. **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](https://developer.apple.com/app-store/review/guidelines/#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](https://pub.dev/packages/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](https://devoria.fr/sk/blog/guideline-2-1-zamietnutie-app-store).

## Ako odpovedať na zamietnutie 2.5.4?

Konverzácia prebieha v sekcii App Review tvojej appky, kde [odpovedáš na správu od App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/). 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á):

```text
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](https://devoria.fr/sk/blog/guideline-5-1-1-zamietnutie-app-store).
- Pri budíku ide zvonenie cez AlarmKit, nie cez zvuk prehrávaný z appky.

## Skontroluj si podklady pred odoslaním

[Review Kit](https://devoria.fr/sk/kits/app-review) 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](https://devoria.fr/sk/coaching): 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](https://devoria.fr/sk/expertise/aplikacia-zamietnuta-apple).

Pripravuješ svoje prvé vydanie? [Sprav si bezplatnú diagnostiku](https://devoria.fr/sk/diagnostic): 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`.


## Tvoj projekt

[Review Kit](https://devoria.fr/sk/kits/app-review): Môj checklist na App Store review, moje opravené zamietnutia od Apple, checklist pre Google Play a tri skilly pre Claude Code. 49 €.

[iOS & Android Kit](https://devoria.fr/sk/kits/ios): Vytvor si appku pre iPhone a Android s Claude Code: štartovací kód mojich appiek, cesta až do obchodov a všetky kity. 99 €.

[Diagnostika: čo ťa delí od tvojej iPhone appky](https://devoria.fr/sk/diagnostic): 7 otázok, 60 sekúnd: zistíš, čo ti naozaj bráni zverejniť tvoju iPhone appku, dostaneš cestu v 4 krokoch a kit, ktorý ti sedí.
