Guideline 2.5.4: háttérmód miatti elutasítás az Apple-nél
Írta: Mehdi Azizi
Megjelent: , 9 p
Guideline 2.5.4: az Apple elutasítja a deklarált, de semmire nem használt háttérmódot. Töröld a kulcsot, vagy mutasd meg a reviewernek a funkciót.
A 2.5.4-es guideline a háttérmódokat a rendeltetésszerű használatukra korlátozza: hang, helymeghatározás, VoIP-hívások, feladat befejezése, helyi értesítések. Akkor jön az elutasítás, ha az Info.plist fájlod deklarál egy ilyen módot, de a reviewer nem talál olyan funkciót, amelynek szüksége lenne rá. Ha semmi nem használja, töröld a kulcsot, ha pedig igen, mutasd meg a funkciót a reviewernek harminc másodperc alatt.
A saját iOS-appjaimat Expóval adom ki. A Solys, a minijátékos ébresztőm, deklarálja az audio módot: kivettem, aztán egy másik okból visszaraktam. Ez az útmutató az Apple szövegére, más fejlesztők által közzétett elutasításokra és a saját projektjeimre épül. Az elutasítási okok áttekintéséhez olvasd el, miért utasítja el az Apple az appokat.
Mit mond a 2.5.4-es guideline?
A szabály egyetlen mondat az App Review Guidelines 2. szakaszában („Performance”), a 2.5-ös „Software Requirements” részben: „Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc.”
Magyarul: egy háttérszolgáltatás csak arra való, amire kitalálták. Innen jön a „Guideline 2.5.4 - Performance - Software Requirements” cím.
Alapértelmezés szerint a háttérbe került app felfüggesztődik. Ha tovább akar futni, egy vagy több módot kell deklarálnia az Info.plist UIBackgroundModes kulcsában. Az Apple háttérmódokról szóló dokumentációja az akkumulátor miatt takarékos használatot kér, és azt, hogy válassz más megoldást, ha van. Minden deklarált mód egy ígéret, amit a reviewer ellenőrizhet.
A háttérmódok és a rendeltetésük
| Mód | Kulcs | Rendeltetés |
|---|---|---|
| Audio, AirPlay, PiP | audio | Hallható hang a háttérben |
| Helymeghatározás | location | Folyamatos pozíció |
| Voice over IP | voip | Hívások CallKittel |
| Lekérés | fetch | Rendszeres hálózati tartalom |
| Feldolgozás | processing | Ütemezett feladatok |
| Távoli értesítések | remote-notification | Push új tartalomról |
Ez a táblázat az Apple oldalát foglalja össze. A fórumokon közzétett elutasításokban az audio, a location és a voip fordul elő a leggyakrabban.
Mit jelent a 2.5.4-es elutasító üzenet?
Az üzenet megnevezi az érintett módot. Két példa, amit fejlesztők tettek közzé az Apple fórumain:
- 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.” A folytatás pontosítja, hogy az
audiokulcs olyan appoknak való, amelyek a háttérben hallható tartalmat szólaltatnak meg, például egy zenelejátszónak. Két kiutat kínál: add hozzá ezt a tartalmat, vagy töröld a kulcsot (fórumszál). - Helymeghatározás: egy 2024. decemberi szálban az Apple az alkalmazottak követésén kívül nem talált olyan funkciót, ami állandó pozíciót igényelne, és azt írta, hogy ez a használat önmagában nem megfelelő.
Ahogy én látom: a reviewer nem a kódodat olvassa, hanem egy funkciót keres. El kell tudnia indítani, háttérbe tenni az appot, és látni, hogy tovább működik.
A fordított eset is létezik. Egy 2026. májusi szálban egy felolvasó appot, amely tényleg használta az audio módot, többször elutasítottak: a reviewer nem tudta elindítani a hangot. Egy másik fejlesztő azt írja ott, hogy szerinte egy csatolt videó oldotta meg az ő esetét. Ez egy beszámoló, nem az Apple szabálya.
Honnan jön a kulcs, ha nem te adtad hozzá?
Expóval a config pluginok töltik ki az Info.plistet a prebuild során. Egy háttérmód tehát úgy is bekerülhet a binárisodba, hogy nem te döntöttél róla.
Az expo-audio plugin alapbeállítással
Az expo-audio dokumentációja leírja: az enableBackgroundPlayback opció alapértéke true, és iOS-en hozzáadja az audio módot. Ha a plugint rövid formában, "expo-audio"-ként deklarálod, már ezzel deklaráltad a módot.
Ezt találtam a TradaZen átnézésekor, az első beküldés előtt: rövid felületi hangok az előtérben, de rövid formában deklarált plugin. A javítás az app.json fájlban van:
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
Más csomagok a maguk módján adnak hozzá módot. Az expo-location isIosBackgroundLocationEnabled opciója csak akkor adja hozzá a location módot, ha bekapcsolod. Az expo-background-task viszont már telepítéskor hozzáadja a processing módot a prebuildnél.
Az ios/ mappa, ami megőrzi a régi kulcsot
A második csapda, amibe 2026 júliusában a Solysszal belefutottam. Kivettem az audio módot az app.json fájlból, de a kulcs ott maradt a korábban generált ios/Solys/Info.plist fájlban. A --clean nélküli prebuild módosítja ezt a projektet ahelyett, hogy újra létrehozná, a plugin pedig hozzáadja a kulcsot, de soha nem veszi ki. Egy helyi build belecsomagolta volna. A felhős EAS build friss prebuildből indul, ha az ios/ mappát a git figyelmen kívül hagyja, és nálam ez volt a helyzet.
Minden build előtt ellenőrzöm, mi kerül ki valójában:
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
Az első kilistázza a módokat, amelyeket a prebuild az Info.plistbe ír. A második újra létrehozza a natív projektet egy helyi buildhez, az ios/ mappa törlésével. A Solysnál az első parancs "UIBackgroundModes":["audio"] eredményt ad, a TradaZennél semmit: mindkettő szándékos.
Egy mód hozzáadása vagy törlése módosítja az Info.plistet, vagyis a binárist: új build kell, egy távoli frissítés nem elég. Az EAS Update dokumentációja ezeket a változásokat az új binárist igénylők közé sorolja, ahogy az ITMS-90683 esetében is.
Solys: deklarált audio mód, valódi okkal
A Solys ébresztő, de az audio mód nem az ébresztés megszólaltatására kell: a csörgést az AlarmKit intézi, az Apple iOS 26 óta elérhető ébresztőszolgáltatása (AlarmKit dokumentáció). A rendszer csörög, még néma módban is, nem az app.
A kulcs története, mert a gondolatmenet fontosabb, mint maga a sor:
- 2026. július végén kiveszem. Semmi nem szólt a háttérben: a minijátékok hangeffektjei az előtérben maradnak, és az ébresztő nem függ az apptól.
- Két nappal később visszarakom az éjszakai hallgatás miatt. Ez az opció mikrofonnal rögzíti az éjszakád zajait, és az iPhone-on elemzi őket. A felvételnek zárolt képernyővel is folytatódnia kell, és az expo-audio dokumentációja szerint a háttérfelvétel opciója szintén hozzáadja az
audiomódot.
Az indoklás jellege megváltozott: a mód felvételre kell, nem lejátszásra. Három biztosíték, ami az appban látható:
- a hallgatás alapból kikapcsolt opció, amit a beállításokban vagy az esti rutinban lehet bekapcsolni;
- saját beleegyezési képernyője van, ahogy azt a 2.5.14-es szabály minden felvételnél megköveteli, és semmi nem hagyja el a telefont;
- a mikrofon tíz perccel az ébresztés előtt lezárul, hogy a hallgatás és a csörgés soha ne zavarja egymást.
Nem tudom garantálni, hogy egy reviewer mindig elfogadja ezt a deklarációt. Azt viszont minden elemről meg tudom mondani, mire való és hol látható.
Az ébresztők, amelyek ébren tartották az appot
Az AlarmKit előtt egy külső ébresztőapp nem tudott úgy csörögni, mint az Apple ébresztője. Egyes könyvtárak ezért ébren tartották az appot: a Flutteres alarm2 csomag dokumentációja egy néma hanglejátszót ír le, ami az ébresztésig fut. Csakhogy egy néma hang semmit nem szólaltat meg. iOS 26 óta az AlarmKit feleslegessé teszi ezt a kerülőutat.
Megtartani vagy törölni a módot: a döntési táblázat
| Helyzeted | Mit csinálj |
|---|---|
| Rövid hangok az előtérben | Töröld az audio módot |
| Zene vagy hangoskönyv | Tartsd meg, mutasd meg |
| Hosszú felvétel | Tartsd meg + beleegyezés |
| Ébresztő vagy időzítő | AlarmKit (iOS 26) |
| Pozíció időnként | Jelentős helyváltozások |
| Nem sürgős szinkronizálás | fetch vagy processing |
| Hang- vagy videohívások | voip CallKittel |
A pozíciónál az Apple oldala a jelentős helyváltozások szolgáltatását említi a location mód alternatívájaként.
A 2.5 többi pontja: 2.5.1 és 2.5.2
2.5.1: publikus API-k és rendeltetésszerűen használt frameworkök
„Apps may only use public APIs and must run on the currently shipping OS.” Az app csak publikus API-kat használ, a rendszer aktuális verzióján fut, és elhagyja az elavult dolgokat. Ahogy a 2.5.4-nél, itt is minden framework a rendeltetésére szolgál, és ezt a leírás is említi: HealthKit az egészséghez, HomeKit az okosotthonhoz. Ha egy könyvtár privát API-t hív, az elutasítást a te appod kapja.
2.5.2: nincs letöltött kód, ami megváltoztatja az appot
Az app önálló marad a saját csomagjában. Nem „download, install, or execute code which introduces or changes features or functionality of the app”. Csak a programozást tanító oktatási appok kapnak korlátozott kivételt, teljesen látható és a felhasználó által szerkeszthető kóddal.
Expónál ez az EAS Update-et érinti, amelynek dokumentációja emlékeztet: a frissítéseknek meg kell felelniük az App Store szabályainak. A távoli frissítéseket hibajavításra használd, soha ne olyan funkció szállítására, amit a reviewer nem látott. A reviewhoz kötődő javítás új buildet igényel, ahogy a 2.1-es guideline útmutatójában elmagyarázom.
Hogyan válaszolj egy 2.5.4-es elutasításra?
A beszélgetés az appod App Review szekciójában zajlik, ahol válaszolsz az App Review üzenetére. Két eset van:
- A mód semmire nem kell: töröld, készíts új buildet, ellenőrizd az introspectiont, aztán válaszolj két mondatban.
- A mód valódi funkciót szolgál: válaszolj a pontos útvonallal és egy rövid videóval, majd ezt a szöveget írd be minden verzió review notes mezőjébe is.
A sablon, amit én használnék, testre szabva (az ébresztős mondatot töröld, ha az appodban nincs ilyen):
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,
2.5.4-es checklist beküldés előtt
- Az Expo introspection csak a szándékos módokat mutatja, és mindegyiknél meg tudod nevezni a funkciót.
- Egyetlen plugin sincs rövid formában deklarálva, ha alapból módot ad hozzá, mint az expo-audio.
- A helyi
ios/mappád nem őriz régi kulcsot, vagy tiszta prebuildből fordítasz. - A funkció gyorsan elindítható, rejtett beállítás nélkül, és a review notes leírja, melyik mód mire kell és hogyan tesztelhető.
- Minden felvétel kifejezett beleegyezést kér, és látható jelzést mutat. Az engedélykérésekre vonatkozó szabályokat az 5.1.1-es guideline útmutatójában találod.
- Ébresztőnél a csörgés az AlarmKiten keresztül megy, nem az appból lejátszott hangként.
Ellenőrizd a csomagod beküldés előtt
A Review Kit tartalmazza a beküldés előtti checklistemet, sablonokat a tesztelőnek szóló jegyzetekhez és Claude Code skilleket, amelyek átnézik a projektedet. Ha emberi szemre van szükséged, foglalj velem egy órát: videóhívásban együtt átnézzük az Apple üzenetét és az Info.plistedet. A teljes folyamat az Apple által elutasított app oldalon van.
Az első megjelenésedre készülsz? Csináld meg az ingyenes diagnózist: sorba rendezi a lépéseket, és elküldi neked az Apple-elutasítás elleni checklistemet.
Senki nem garantálhatja, hogy az Apple elfogadja az appodat. Egy jól megindokolt háttérmódot viszont harminc másodperc alatt meg lehet védeni.
Gyakori kérdések
Mit jelent a „Guideline 2.5.4 - Performance - Software Requirements”?
Ez az elutasítás címe, amikor az Apple úgy ítéli meg, hogy az Info.plisted egyik háttérmódja nem a rendeltetésére szolgál. Az üzenet megnevezi a módot, és azt javasolja, hogy mutasd meg az azt használó funkciót, vagy töröld a kulcsot.
Kell új build egy 2.5.4-es elutasítás után?
Ha törölsz vagy módosítasz egy módot, igen: a kulcs az Info.plistben, tehát a binárisban van. Ha a mód indokolt, elég lehet egy válasz a pontos útvonallal és egy videóval.
Megtarthatom az audio módot néhány felületi hang miatt?
Nem. Az előtérben lejátszott rövid hangoknak nincs rá szükségük. Expóval állítsd az expo-audio pluginban az enableBackgroundPlayback értékét false-ra.
Kell egy ébresztőappnak az audio mód?
A csörgéshez nem, ha az iOS 26 óta elérhető AlarmKitre épül: a rendszer játssza le az ébresztést. A Solysnál az audio mód az éjszakai hallgatáshoz kell, ami zárolt képernyővel is rögzít.
Miért hivatkozik az Apple a 2.5.4-re, ha semmit nem deklaráltam?
Lehet, hogy egy plugin megtette helyetted: az expo-audio alapból hozzáadja az audio módot, és egy régi ios/ mappa megőrizhet egy kulcsot, amit a konfigurációdból már kivettél. Ellenőrizd a npx expo config --type introspect paranccsal.

