Guideline 2.5.4: Apple odbija pozadinski način rada
Autor: Mehdi Azizi
Objavljeno , 9 min
Guideline 2.5.4: Apple odbija pozadinski način rada koji nijedna funkcija ne koristi. Ukloni ključ ili revieweru pokaži zvuk, lokaciju ili poziv.
Guideline 2.5.4 ograničava pozadinske načine rada na njihovu predviđenu namjenu: zvuk, lokacija, VoIP pozivi, dovršavanje zadatka, lokalne obavijesti. Odbijanje stiže kad tvoj Info.plist deklarira jedan od tih načina, a reviewer ne pronađe nijednu funkciju kojoj on treba. Ukloni ključ ako ga ništa ne koristi, a inače pokaži funkciju revieweru za trideset sekundi.
Svoje iOS aplikacije objavljujem s Expoom. Solys, moja budilica s mini-igrama, deklarira audio način: uklonio sam ga, pa ga vratio iz drugog razloga. Ovaj se vodič oslanja na Appleov tekst, na odbijanja koja su objavili drugi developeri i na moje projekte. Za pregled svih razloga pročitaj zašto Apple odbija aplikaciju.
Što kaže guideline 2.5.4?
Pravilo stane u jednu rečenicu, u odjeljku 2 „Performance“, dio 2.5 „Software Requirements“, u App Review Guidelines: „Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc.“
Jednostavno rečeno: pozadinska usluga služi samo onome za što postoji. Otuda naslov „Guideline 2.5.4 - Performance - Software Requirements“.
Prema zadanim postavkama, aplikacija koja ode u pozadinu se suspendira. Da bi nastavila raditi, deklarira jedan ili više načina u ključu UIBackgroundModes svog Info.plista. Appleova dokumentacija o pozadinskim načinima rada traži da ih koristiš štedljivo, zbog baterije, i da biraš drugo rješenje kad postoji. Svaki deklarirani način je obećanje koje reviewer može provjeriti.
Pozadinski načini rada i njihova predviđena namjena
| Način | Ključ | Predviđena namjena |
|---|---|---|
| Audio, AirPlay, PiP | audio | Čujni zvuk u pozadini |
| Lokacija | location | Kontinuirana lokacija |
| Voice over IP | voip | Pozivi s CallKitom |
| Dohvaćanje | fetch | Redoviti mrežni sadržaj |
| Obrada | processing | Zakazani zadaci |
| Udaljene obavijesti | remote-notification | Push novog sadržaja |
Ova tablica sažima Appleovu stranicu. U odbijanjima objavljenima na forumima najčešće se pojavljuju audio, location i voip.
Što znači poruka o odbijanju 2.5.4?
Poruka imenuje sporni način. Dva primjera koja su developeri objavili na Appleovim forumima:
- 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.“ Nastavak pojašnjava da je ključ
audionamijenjen aplikacijama koje puštaju čujni sadržaj u pozadini, poput glazbenog playera. Nudi dva izlaza: dodati takav sadržaj ili ukloniti ključ (tema na forumu). - Lokacija: u temi iz prosinca 2024. Apple nije pronašao nijednu funkciju osim praćenja zaposlenika koja traži stalnu lokaciju i napisao je da sama ta namjena nije prikladna.
Moje tumačenje: reviewer ne čita tvoj kod, on traži funkciju. Mora je moći pokrenuti, prebaciti aplikaciju u pozadinu i vidjeti da nastavlja raditi.
Postoji i obrnuti slučaj. U temi iz svibnja 2026. aplikacija za čitanje naglas, koja je stvarno koristila način audio, odbijena je nekoliko puta: reviewer nije uspijevao pokrenuti zvuk. Drugi developer tamo piše da je, po njegovu mišljenju, priloženi video odblokirao njegov slučaj. To je svjedočanstvo, ne Appleovo pravilo.
Odakle ključ kad ga nisi dodao?
S Expoom Info.plist pri prebuildu popunjavaju config pluginovi. Pozadinski način rada tako može ući u tvoj binary, a da to nisi odlučio.
Plugin expo-audio sa zadanim postavkama
Dokumentacija expo-audio to navodi: opcija enableBackgroundPlayback zadano je true i na iOS-u dodaje način audio. Dovoljno je deklarirati plugin u kratkom obliku, "expo-audio", da deklariraš i način.
To sam našao pregledavajući TradaZen prije prvog slanja: kratki zvukovi sučelja u prvom planu, ali plugin deklariran u kratkom obliku. Ispravak stane u app.json:
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
Drugi paketi dodaju način na svoj način. Opcija isIosBackgroundLocationEnabled u expo-location dodaje location samo ako je uključiš. expo-background-task pak dodaje processing pri prebuildu čim je instaliran.
Mapa ios/ koja zadržava stari ključ
Druga zamka, doživljena na Solysu u srpnju 2026. Uklonio sam audio iz app.json, ali ključ je ostao u ios/Solys/Info.plist, generiranom ranije. Prebuild bez --clean mijenja taj projekt umjesto da ga ponovno stvori, a plugin ključ dodaje, ali ga nikad ne uklanja. Lokalni build bi ga uključio. EAS build u oblaku kreće od svježeg prebuilda kad git ignorira ios/, što je bio moj slučaj.
Prije svakog builda provjerim što će stvarno otići:
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
Prva naredba ispisuje načine koje će prebuild upisati u Info.plist. Druga ponovno stvara nativni projekt za lokalni build, brišući mapu ios/. Na Solysu prva prikazuje "UIBackgroundModes":["audio"], na TradaZenu ništa: oboje je namjerno.
Dodavanje ili uklanjanje načina mijenja Info.plist, dakle i binary: treba novi build, udaljeno ažuriranje nije dovoljno. Dokumentacija EAS Update te promjene svrstava među one koje traže novi binary, kao i kod ITMS-90683.
Solys: deklarirani audio način, sa stvarnim razlogom
Solys je budilica, ali način audio ne služi za zvonjavu alarma: zvonjava ide preko AlarmKita, Appleove usluge za alarme dostupne od iOS-a 26 (dokumentacija AlarmKit). Zvoni sustav, čak i u nečujnom načinu, a ne aplikacija.
Povijest ključa, jer je razmišljanje važnije od retka:
- Krajem srpnja 2026. ga uklanjam. Ništa nije puštalo zvuk u pozadini: zvučni efekti mini-igara ostaju u prvom planu, a alarm ne ovisi o aplikaciji.
- Dva dana kasnije ga vraćam, s noćnim slušanjem. Ta opcija mikrofonom snima zvukove tvoje noći i analizira ih na iPhoneu. Snimanje mora nastaviti i dok je zaslon zaključan, a dokumentacija expo-audio navodi da opcija snimanja u pozadini također dodaje način
audio.
Opravdanje je promijenilo prirodu: način služi za snimanje, ne za reprodukciju. Tri zaštite, vidljive u aplikaciji:
- slušanje je opcija koja je zadano isključena i uključuje se iz postavki ili iz večernjeg rituala;
- ima vlastiti zaslon za privolu, kako pravilo 2.5.14 zahtijeva za svako snimanje, i ništa ne napušta telefon;
- mikrofon se zatvara deset minuta prije alarma, da se slušanje i zvonjava nikad ne ometaju.
Ne mogu jamčiti da će reviewer uvijek prihvatiti ovu deklaraciju. Znam reći, za svaki element, čemu služi i gdje ga vidjeti.
Budilice koje su držale aplikaciju budnom
Prije AlarmKita budilica treće strane nije mogla zvoniti kao Appleov alarm. Neke su biblioteke zato držale aplikaciju budnom: dokumentacija Flutter paketa alarm2 opisuje tihi audio player koji radi do alarma. A nečujni zvuk se ne čuje. Od iOS-a 26 AlarmKit čini taj zaobilazni put nepotrebnim.
Zadržati ili ukloniti način: tablica za odluku
| Tvoja situacija | Što napraviti |
|---|---|
| Kratki zvukovi u prvom planu | Ukloniti audio |
| Glazba ili audioknjiga | Zadržati, pokazati |
| Dugo snimanje | Zadržati + privola |
| Budilica ili timer | AlarmKit (iOS 26) |
| Povremena lokacija | Značajne promjene lokacije |
| Sinkronizacija bez žurbe | fetch ili processing |
| Audio ili video pozivi | voip s CallKitom |
Za lokaciju Appleova stranica navodi uslugu značajnih promjena lokacije kao alternativu načinu location.
Ostale točke 2.5: 2.5.1 i 2.5.2
2.5.1: javni API-ji i frameworkovi za svoju namjenu
„Apps may only use public APIs and must run on the currently shipping OS.“ Aplikacija koristi samo javne API-je, radi na trenutnoj verziji sustava i napušta ono što je zastarjelo. Kao i kod 2.5.4, svaki framework služi svojoj predviđenoj namjeni, navedenoj u opisu: HealthKit za zdravlje, HomeKit za pametni dom. Ako neka biblioteka poziva privatni API, odbijanje dobiva tvoja aplikacija.
2.5.2: nema preuzetog koda koji mijenja aplikaciju
Aplikacija ostaje samostalna unutar svog paketa. Ne smije „download, install, or execute code which introduces or changes features or functionality of the app“. Samo edukativne aplikacije koje uče programiranje imaju ograničenu iznimku, s kodom koji je korisniku potpuno vidljiv i koji može mijenjati.
S Expoom se to pitanje tiče EAS Updatea, čija dokumentacija podsjeća da ažuriranja moraju poštovati pravila App Storea. Udaljena ažuriranja koristi za ispravke, nikad za isporuku funkcije koju reviewer nije vidio. Ispravak vezan uz reviziju ide kroz novi build, kako objašnjavam u vodiču za guideline 2.1.
Kako odgovoriti na odbijanje 2.5.4?
Razgovor se vodi u odjeljku App Review tvoje aplikacije, gdje odgovaraš na poruku App Reviewa. Dva slučaja:
- Način ničemu ne služi: ukloni ga, napravi novi build, provjeri introspekciju i odgovori u dvije rečenice.
- Način služi stvarnoj funkciji: odgovori s točnim putem i kratkim videom, a zatim taj tekst ponovi u bilješkama za reviziju svake verzije.
Predložak koji bih koristio, prilagodi ga (ukloni rečenicu o alarmu ako ga tvoja aplikacija nema):
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,
Checklista za 2.5.4 prije slanja
- Expo introspekcija prikazuje samo željene načine i za svaki znaš imenovati funkciju.
- Nijedan plugin nije deklariran u kratkom obliku ako zadano dodaje način, kao expo-audio.
- Tvoja lokalna mapa
ios/ne čuva nijedan stari ključ ili kompajliraš iz čistog prebuilda. - Funkcija se pokreće brzo, bez skrivenih postavki, a bilješke za reviziju kažu koji način služi čemu i kako ga testirati.
- Svako snimanje traži izričitu privolu i prikazuje vidljiv indikator. Pravila o traženju dopuštenja su u vodiču za guideline 5.1.1.
- Kod budilice zvonjava ide preko AlarmKita, a ne preko zvuka koji pušta aplikacija.
Provjeri svoju prijavu prije slanja
Review Kit okuplja moju checklistu prije slanja, predloške bilješki za testera i Claude Code skillove koji pregledavaju tvoj projekt. Za ljudski pogled rezerviraj sat vremena sa mnom: zajedno čitamo Appleovu poruku i tvoj Info.plist, putem videopoziva. Cijeli postupak je na stranici aplikacija odbijena od Applea.
Pripremaš svoje prvo izdanje? Napravi besplatnu dijagnostiku: posložit će korake redom i poslati ti moju checklistu protiv Appleovih odbijanja.
Nitko ne može jamčiti da će Apple prihvatiti tvoju aplikaciju. Dobro opravdan pozadinski način rada, međutim, braniš za trideset sekundi.
Česta pitanja
Što znači „Guideline 2.5.4 - Performance - Software Requirements“?
To je naslov odbijanja kad Apple procijeni da pozadinski način rada iz tvog Info.plista ne služi svojoj predviđenoj namjeni. Poruka imenuje način i predlaže da pokažeš funkciju koja ga koristi ili da ukloniš ključ.
Treba li novi build nakon odbijanja 2.5.4?
Ako uklanjaš ili mijenjaš način, da: ključ je u Info.plistu, dakle u binaryju. Ako je način opravdan, može biti dovoljan odgovor s točnim putem i videom.
Smijem li zadržati audio način za nekoliko zvukova sučelja?
Ne. Kratkim zvukovima u prvom planu on ne treba. S Expoom postavi enableBackgroundPlayback na false u pluginu expo-audio.
Treba li budilici audio način?
Ne za zvonjavu, ako se oslanja na AlarmKit, dostupan od iOS-a 26: alarm pušta sustav. Na Solysu način audio služi za noćno slušanje, koje snima dok je zaslon zaključan.
Zašto Apple navodi 2.5.4 iako ništa nisam deklarirao?
Možda je to umjesto tebe napravio plugin: expo-audio zadano dodaje način audio, a stara mapa ios/ može zadržati ključ koji si uklonio iz konfiguracije. Provjeri s npx expo config --type introspect.

