Guideline 2.5.4: Apple zavrne način delovanja v ozadju
Avtor: Mehdi Azizi
Objavljeno , 9 min
Guideline 2.5.4: Apple zavrne način delovanja v ozadju, ki ga nobena funkcija ne uporablja. Odstrani ključ ali pregledovalcu pokaži zvok, lokacijo ali klic.
Guideline 2.5.4 omejuje načine delovanja v ozadju na njihov predvideni namen: zvok, lokacija, klici VoIP, dokončanje opravila, lokalna obvestila. Zavrnitev pride, ko tvoj Info.plist prijavi enega od teh načinov, pregledovalec pa ne najde nobene funkcije, ki bi ga potrebovala. Če ga nič ne uporablja, ključ odstrani, sicer pa pregledovalcu funkcijo pokaži v tridesetih sekundah.
Svoje aplikacije za iOS objavljam z Expo. Solys, moja budilka z mini igrami, prijavlja način audio: odstranil sem ga, potem pa ga iz drugega razloga vrnil. Ta vodnik temelji na Applovem besedilu, na zavrnitvah, ki so jih objavili drugi razvijalci, in na mojih projektih. Za pregled vseh razlogov preberi, zakaj Apple zavrne aplikacijo.
Kaj pravi guideline 2.5.4?
Pravilo je en sam stavek, v razdelku 2 „Performance“, delu 2.5 „Software Requirements“ dokumenta App Review Guidelines: „Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc.“
Po domače: storitev v ozadju služi samo temu, za kar obstaja. Od tod naslov „Guideline 2.5.4 - Performance - Software Requirements“.
Aplikacija, ki gre v ozadje, se privzeto zaustavi. Če želi teči naprej, prijavi enega ali več načinov v ključu UIBackgroundModes v svojem Info.plist. Applova dokumentacija o načinih delovanja v ozadju zaradi baterije zahteva, da jih uporabljaš varčno in da izbereš drugo rešitev, kadar obstaja. Vsak prijavljen način je obljuba, ki jo pregledovalec lahko preveri.
Načini delovanja v ozadju in njihov namen
| Način | Ključ | Predvideni namen |
|---|---|---|
| Audio, AirPlay, PiP | audio | Slišen zvok v ozadju |
| Lokacija | location | Neprekinjena lokacija |
| Voice over IP | voip | Klici s CallKit |
| Pridobivanje | fetch | Redna omrežna vsebina |
| Obdelava | processing | Načrtovana opravila |
| Oddaljena obvestila | remote-notification | Push nove vsebine |
Tabela povzema Applovo stran. V zavrnitvah, objavljenih na forumih, se najpogosteje pojavljajo audio, location in voip.
Kaj pomeni sporočilo o zavrnitvi 2.5.4?
Sporočilo navede sporni način. Dva primera, ki so ju razvijalci objavili na Applovih forumih:
- 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.“ Nadaljevanje pojasni, da je ključ
audionamenjen aplikacijam, ki v ozadju predvajajo slišno vsebino, na primer predvajalniku glasbe. Ponudi dva izhoda: dodaj takšno vsebino ali odstrani ključ (nit na forumu). - Lokacija: v niti iz decembra 2024 Apple ni našel nobene funkcije razen sledenja zaposlenim, ki bi zahtevala stalno lokacijo, in je zapisal, da ta uporaba sama po sebi ni primerna.
Moje branje: pregledovalec ne bere tvoje kode, išče funkcijo. Zagnati jo mora, aplikacijo poslati v ozadje in videti, da deluje naprej.
Obstaja tudi obraten primer. V niti iz maja 2026 je bila aplikacija za branje na glas, ki je način audio res uporabljala, večkrat zavrnjena: pregledovalcu ni uspelo sprožiti zvoka. Drug razvijalec tam piše, da je po njegovem mnenju njegov primer odblokiral priložen video. To je pričevanje, ne Applovo pravilo.
Od kod ključ, če ga nisi dodal?
Pri Expo Info.plist ob prebuildu izpolnijo konfiguracijski vtičniki. Način delovanja v ozadju lahko torej pride v tvoj binarni paket, ne da bi se ti za to odločil.
Vtičnik expo-audio s privzetimi nastavitvami
Dokumentacija expo-audio to navaja: možnost enableBackgroundPlayback ima privzeto vrednost true in na iOS doda način audio. Že to, da vtičnik prijaviš v kratki obliki, "expo-audio", torej prijavi način.
Prav to sem našel, ko sem pred prvo oddajo pregledoval TradaZen: kratki zvoki vmesnika v ospredju, vtičnik pa prijavljen v kratki obliki. Popravek je v app.json:
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
Drugi paketi dodajo način po svoje. Možnost isIosBackgroundLocationEnabled v expo-location doda location samo, če jo vklopiš. expo-background-task pa ob prebuildu doda processing takoj, ko je nameščen.
Mapa ios/, ki obdrži stari ključ
Druga past, ki sem jo doživel pri Solys julija 2026. audio sem odstranil iz app.json, ključ pa je ostal v prej ustvarjenem ios/Solys/Info.plist. Prebuild brez --clean ta projekt spremeni, namesto da bi ga ustvaril na novo, vtičnik pa ključ doda, nikoli pa ga ne odstrani. Lokalni build bi ga vključil. Build EAS v oblaku začne s svežim prebuildom, kadar git mapo ios/ ignorira, kar je bil moj primer.
Pred vsakim buildom preverim, kaj bo res odšlo:
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
Prvi ukaz izpiše načine, ki jih bo prebuild zapisal v Info.plist. Drugi za lokalni build na novo ustvari nativni projekt in izbriše mapo ios/. Pri Solys prvi pokaže "UIBackgroundModes":["audio"], pri TradaZen nič: oboje je namerno.
Dodajanje ali odstranjevanje načina spremeni Info.plist, torej binarni paket: potreben je nov build, posodobitev na daljavo ne zadošča. Dokumentacija EAS Update te spremembe uvršča med tiste, ki zahtevajo nov binarni paket, tako kot pri ITMS-90683.
Solys: prijavljen način audio, z dobrim razlogom
Solys je budilka, a način audio ne služi zvonjenju alarma: zvonjenje gre prek AlarmKit, Applove storitve za alarme, ki je na voljo od iOS 26 (dokumentacija AlarmKit). Zvoni sistem, tudi v tihem načinu, ne aplikacija.
Zgodovina ključa, ker je razmislek pomembnejši od vrstice:
- Konec julija 2026 ga odstranim. Nič ni predvajalo zvoka v ozadju: zvočni učinki mini iger ostanejo v ospredju, alarm pa ni odvisen od aplikacije.
- Dva dni pozneje ga vrnem, skupaj s poslušanjem noči. Ta možnost z mikrofonom snema zvoke tvoje noči in jih analizira na iPhonu. Snemanje mora teči tudi pri zaklenjenem zaslonu, dokumentacija expo-audio pa navaja, da tudi možnost snemanja v ozadju doda način
audio.
Utemeljitev je spremenila naravo: način služi snemanju, ne predvajanju. Tri varovala, vidna v aplikaciji:
- poslušanje je možnost, ki je privzeto izklopljena in se vklopi v nastavitvah ali v večernem ritualu;
- ima svoj zaslon za privolitev, kot za vsako snemanje zahteva pravilo 2.5.14, in nič ne zapusti telefona;
- mikrofon se zapre deset minut pred alarmom, da se poslušanje in zvonjenje nikoli ne motita.
Ne morem zagotoviti, da bo pregledovalec to prijavo vedno sprejel. Za vsak element pa znam povedati, čemu služi in kje ga je videti.
Budilke, ki so aplikacijo držale budno
Pred AlarmKit budilka tretjega razvijalca ni mogla zvoniti kot Applov alarm. Nekatere knjižnice so zato aplikacijo držale budno: dokumentacija paketa Flutter alarm2 opisuje tih predvajalnik zvoka, ki teče do alarma. Toda nem zvok ne predvaja ničesar slišnega. Od iOS 26 je zaradi AlarmKit ta ovinek nepotreben.
Obdržati ali odstraniti način: odločitvena tabela
| Tvoja situacija | Kaj narediti |
|---|---|
| Kratki zvoki v ospredju | Odstrani audio |
| Glasba ali zvočna knjiga | Obdrži, pokaži ga |
| Dolgo snemanje | Obdrži + privolitev |
| Budilka ali časovnik | AlarmKit (iOS 26) |
| Občasna lokacija | Pomembne spremembe lokacije |
| Nenujna sinhronizacija | fetch ali processing |
| Zvočni ali video klici | voip s CallKit |
Za lokacijo Applova stran kot alternativo načinu location navaja storitev pomembnih sprememb lokacije.
Druge točke razdelka 2.5: 2.5.1 in 2.5.2
2.5.1: javni API-ji in ogrodja na svojem mestu
„Apps may only use public APIs and must run on the currently shipping OS.“ Aplikacija uporablja samo javne API-je, teče na trenutni različici sistema in opusti zastarelo. Tako kot pri 2.5.4 vsako ogrodje služi svojemu predvidenemu namenu, omenjenemu v opisu: HealthKit za zdravje, HomeKit za pametni dom. Če knjižnica kliče zasebni API, zavrnitev dobi tvoja aplikacija.
2.5.2: brez prenesene kode, ki spreminja aplikacijo
Aplikacija ostane samostojna v svojem paketu. Ne sme „download, install, or execute code which introduces or changes features or functionality of the app“. Omejeno izjemo imajo samo izobraževalne aplikacije, ki učijo programiranja, s kodo, ki jo uporabnik v celoti vidi in lahko spreminja.
Pri Expo to zadeva EAS Update, katerega dokumentacija opominja, da morajo posodobitve spoštovati pravila App Store. Posodobitve na daljavo uporabljaj za popravke, nikoli za dostavo funkcije, ki je pregledovalec ni videl. Popravek, povezan s pregledom, gre prek novega builda, kot razložim v vodniku za guideline 2.1.
Kako odgovoriti na zavrnitev 2.5.4?
Pogovor poteka v razdelku App Review tvoje aplikacije, kjer odgovoriš na sporočilo App Review. Dva primera:
- Način ne služi ničemur: odstrani ga, naredi nov build, preveri introspekcijo in odgovori v dveh stavkih.
- Način služi pravi funkciji: odgovori z natančno potjo in kratkim videom, nato to besedilo ponovi v opombah za pregled pri vsaki različici.
Predloga, ki bi jo uporabil, prilagodi jo (stavek o alarmu odstrani, če ga tvoja aplikacija nima):
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,
Kontrolni seznam 2.5.4 pred oddajo
- Introspekcija Expo prikaže samo želene načine in za vsakega znaš poimenovati funkcijo.
- Noben vtičnik ni prijavljen v kratki obliki, če privzeto doda način, kot expo-audio.
- Tvoja lokalna mapa
ios/ne hrani nobenega starega ključa, ali pa gradiš iz čistega prebuilda. - Funkcija se sproži hitro, brez skrite nastavitve, opombe za pregled pa povedo, kateri način služi čemu in kako ga preizkusiti.
- Vsako snemanje zahteva izrecno privolitev in prikazuje viden indikator. Pravila o zahtevah za dovoljenja so v vodniku za guideline 5.1.1.
- Pri budilki gre zvonjenje prek AlarmKit, ne prek zvoka, ki ga predvaja aplikacija.
Preveri svojo oddajo pred pošiljanjem
Review Kit združuje moj kontrolni seznam pred oddajo, predloge opomb za preizkuševalca in skille za Claude Code, ki pregledajo tvoj projekt. Če želiš človeški pogled, rezerviraj uro z mano: Applovo sporočilo in tvoj Info.plist prebereva skupaj, prek videoklica. Celoten postopek je na strani aplikacija, ki jo je Apple zavrnil.
Pripravljaš svojo prvo objavo? Opravi brezplačno diagnostiko: korake postavi v pravi vrstni red in ti pošlje moj kontrolni seznam proti Applovim zavrnitvam.
Nihče ne more zagotoviti, da bo Apple sprejel tvojo aplikacijo. Dobro utemeljen način delovanja v ozadju pa se ubrani v tridesetih sekundah.
Pogosta vprašanja
Kaj pomeni „Guideline 2.5.4 - Performance - Software Requirements“?
To je naslov zavrnitve, ko Apple presodi, da način delovanja v ozadju v tvojem Info.plist ne služi svojemu predvidenemu namenu. Sporočilo navede način in predlaga, da pokažeš funkcijo, ki ga uporablja, ali odstraniš ključ.
Je po zavrnitvi 2.5.4 potreben nov build?
Če način odstraniš ali spremeniš, da: ključ je v Info.plist, torej v binarnem paketu. Če je način upravičen, lahko zadošča odgovor z natančno potjo in videom.
Lahko obdržim način audio za nekaj zvokov vmesnika?
Ne. Kratki zvoki, predvajani v ospredju, ga ne potrebujejo. Pri Expo v vtičniku expo-audio nastavi enableBackgroundPlayback na false.
Ali budilka potrebuje način audio?
Za zvonjenje ne, če se opira na AlarmKit, ki je na voljo od iOS 26: alarm predvaja sistem. Pri Solys način audio služi poslušanju noči, ki snema pri zaklenjenem zaslonu.
Zakaj Apple navaja 2.5.4, čeprav nisem ničesar prijavil?
Morda je to namesto tebe naredil vtičnik: expo-audio privzeto doda način audio, stara mapa ios/ pa lahko obdrži ključ, ki si ga odstranil iz konfiguracije. Preveri z npx expo config --type introspect.

