Guideline 2.5.4: Apple hylkäsi taustatilan
Kirjoittaja: Mehdi Azizi
Julkaistu , 9 min
Guideline 2.5.4: Apple hylkää taustatilan, jota mikään toiminto ei käytä. Poista avain tai näytä arvioijalle ääni, sijainti tai puhelu.
Guideline 2.5.4 rajaa taustatilat niiden tarkoitettuun käyttöön: ääni, sijainti, VoIP-puhelut, tehtävän loppuun vienti, paikalliset ilmoitukset. Hylkäys tulee, kun Info.plist-tiedostosi ilmoittaa jonkin näistä tiloista eikä arvioija löydä yhtään toimintoa, joka sitä tarvitsee. Poista avain, jos mikään ei käytä sitä. Muuten näytä toiminto arvioijalle kolmessakymmenessä sekunnissa.
Julkaisen omia iOS-sovelluksiani Expolla. Solys, minipelejä sisältävä herätyskelloni, ilmoittaa audio-tilan: poistin sen ja lisäsin sen sitten takaisin toisesta syystä. Tämä opas perustuu Applen tekstiin, muiden kehittäjien julkaisemiin hylkäyksiin ja omiin projekteihini. Kokonaiskuvan hylkäyssyistä saat lukemalla, miksi Apple hylkää sovelluksen.
Mitä guideline 2.5.4 sanoo?
Sääntö mahtuu yhteen lauseeseen App Review Guidelinesin osiossa 2 "Performance", kohdassa 2.5 "Software Requirements": "Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc."
Selkokielellä: taustapalvelua saa käyttää vain siihen, mitä varten se on olemassa. Siitä otsikko "Guideline 2.5.4 - Performance - Software Requirements".
Oletuksena taustalle siirtynyt sovellus keskeytetään. Jatkaakseen toimintaa sen täytyy ilmoittaa yksi tai useampi tila Info.plistin UIBackgroundModes-avaimessa. Applen dokumentaatio taustatiloista pyytää käyttämään niitä säästeliäästi akun takia ja suosimaan muuta ratkaisua, jos sellainen on. Jokainen ilmoitettu tila on lupaus, jonka arvioija voi tarkistaa.
Taustatilat ja niiden tarkoitettu käyttö
| Tila | Avain | Tarkoitettu käyttö |
|---|---|---|
| Audio, AirPlay, PiP | audio | Kuuluva ääni taustalla |
| Sijainti | location | Jatkuva sijainti |
| Voice over IP | voip | Puhelut CallKitillä |
| Background fetch | fetch | Säännöllinen verkkosisältö |
| Background processing | processing | Ajastetut tehtävät |
| Etäilmoitukset | remote-notification | Push uudesta sisällöstä |
Taulukko tiivistää Applen sivun. Foorumeilla julkaistuissa hylkäyksissä audio, location ja voip toistuvat useimmin.
Mitä 2.5.4-hylkäysviesti tarkoittaa?
Viesti nimeää kyseisen tilan. Kaksi esimerkkiä, jotka kehittäjät ovat julkaisseet Applen foorumeilla:
- 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." Jatkossa tarkennetaan, että
audio-avain on tarkoitettu sovelluksille, jotka toistavat kuuluvaa sisältöä taustalla, kuten musiikkisoitin. Ulospääsyjä tarjotaan kaksi: lisää tällainen sisältö tai poista avain (foorumiketju). - Sijainti: joulukuun 2024 ketjussa Apple ei löytänyt muuta jatkuvaa sijaintia vaativaa toimintoa kuin työntekijöiden seurannan ja kirjoitti, ettei pelkkä tämä käyttö ole asianmukainen.
Oma tulkintani: arvioija ei lue koodiasi, hän etsii toimintoa. Hänen pitää pystyä käynnistämään se, siirtämään sovellus taustalle ja toteamaan, että se jatkaa toimintaansa.
Päinvastainenkin tapaus on olemassa. Toukokuun 2026 ketjussa ääneen lukeva sovellus, joka oikeasti käytti audio-tilaa, hylättiin useita kertoja: arvioija ei saanut ääntä käynnistymään. Toinen kehittäjä kirjoittaa siellä, että hänen mielestään liitetty video avasi hänen tapauksensa. Se on kokemus, ei Applen sääntö.
Mistä avain tulee, jos et lisännyt sitä?
Expossa konfiguraatiopluginit täyttävät Info.plistin prebuildissa. Taustatila voi siis päätyä binääriisi ilman, että päätit siitä.
expo-audio-plugin oletusasetuksilla
expo-audion dokumentaatio kertoo sen: enableBackgroundPlayback-asetus on oletuksena true ja lisää iOS:llä audio-tilan. Pelkkä pluginin lyhyt muoto "expo-audio" riittää siis ilmoittamaan tilan.
Juuri tämän löysin käydessäni TradaZenia läpi ennen sen ensimmäistä lähetystä: lyhyitä käyttöliittymä-ääniä etualalla, mutta plugin ilmoitettu lyhyessä muodossa. Korjaus mahtuu app.json-tiedostoon:
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
Muut paketit lisäävät tilan omalla tavallaan. expo-locationin isIosBackgroundLocationEnabled-asetus lisää location-tilan vain, jos otat sen käyttöön. expo-background-task taas lisää processing-tilan prebuildissa heti, kun se on asennettu.
ios/-kansio, joka säilyttää vanhan avaimen
Toinen ansa, koettu Solysissa heinäkuussa 2026. Olin poistanut audio-tilan app.json-tiedostosta, mutta avain jäi aiemmin generoituun ios/Solys/Info.plist-tiedostoon. Prebuild ilman --clean-valitsinta muokkaa tätä projektia sen sijaan, että loisi sen uudelleen, ja plugin lisää avaimen mutta ei koskaan poista sitä. Paikallinen build olisi ottanut sen mukaan. EAS-build pilvessä aloittaa puhtaalla prebuildilla, kun ios/ on gitin ohittama, ja niin minulla oli.
Ennen jokaista buildia tarkistan, mitä oikeasti lähtee:
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
Ensimmäinen listaa tilat, jotka prebuild kirjoittaa Info.plistiin. Toinen luo natiiviprojektin uudelleen paikallista buildia varten ja poistaa ios/-kansion. Solysissa ensimmäinen näyttää "UIBackgroundModes":["audio"], TradaZenissa ei mitään: molemmat ovat tarkoituksellisia.
Tilan lisääminen tai poistaminen muuttaa Info.plistiä eli binääriä: tarvitset uuden buildin, etäpäivitys ei riitä. EAS Updaten dokumentaatio luokittelee nämä muutokset niihin, jotka vaativat uuden binäärin, kuten ITMS-90683:n kohdalla.
Solys: ilmoitettu audio-tila oikealla syyllä
Solys on herätyskello, mutta audio-tila ei soita hälytystä: hälytys kulkee AlarmKitin kautta, Applen hälytyspalvelun, joka on saatavilla iOS 26:sta alkaen (AlarmKit-dokumentaatio). Järjestelmä soittaa, myös äänettömässä tilassa, ei sovellus.
Avaimen historia, koska päättely on tärkeämpää kuin itse rivi:
- Heinäkuun 2026 lopussa poistan sen. Mikään ei toistanut ääntä taustalla: minipelien ääniefektit pysyvät etualalla, eikä hälytys riipu sovelluksesta.
- Kaksi päivää myöhemmin lisään sen takaisin yökuuntelun myötä. Tämä valinnainen toiminto tallentaa yösi äänet mikrofonilla ja analysoi ne iPhonessa. Tallennuksen on jatkuttava näytön ollessa lukittuna, ja expo-audion dokumentaation mukaan taustatallennusasetus lisää sekin
audio-tilan.
Perustelun luonne muuttui: tila on tallentamista varten, ei toistamista. Kolme turvakaidetta, jotka näkyvät sovelluksessa:
- kuuntelu on oletuksena pois päältä oleva valinta, joka otetaan käyttöön asetuksista tai iltarutiinista;
- sillä on oma suostumusnäyttönsä, kuten sääntö 2.5.14 vaatii kaikelta tallennukselta, eikä mikään lähde puhelimesta;
- mikrofoni suljetaan kymmenen minuuttia ennen hälytystä, jotta kuuntelu ja hälytys eivät koskaan häiritse toisiaan.
En voi taata, että arvioija hyväksyy tämän ilmoituksen aina. Osaan kuitenkin kertoa jokaisesta osasta, mihin se on ja mistä sen näkee.
Herätyskellot, jotka pitivät sovelluksen hereillä
Ennen AlarmKitia kolmannen osapuolen herätyssovellus ei voinut soida kuten Applen hälytys. Jotkin kirjastot pitivät siksi sovelluksen hereillä: Flutter-paketin alarm2 dokumentaatio kuvaa äänetöntä soitinta, joka pyörii hälytykseen asti. Mykkä ääni ei kuitenkaan kuulu. iOS 26:sta lähtien AlarmKit tekee tästä kiertotiestä tarpeettoman.
Pitää vai poistaa tila: päätöstaulukko
| Tilanteesi | Mitä tehdä |
|---|---|
| Lyhyitä ääniä etualalla | Poista audio |
| Musiikki tai äänikirja | Pidä, näytä se |
| Pitkä tallennus | Pidä + suostumus |
| Herätys tai ajastin | AlarmKit (iOS 26) |
| Sijainti silloin tällöin | Merkittävät sijaintimuutokset |
| Synkronointi ilman kiirettä | fetch tai processing |
| Ääni- tai videopuhelut | voip CallKitin kanssa |
Sijainnin osalta Applen sivu mainitsee merkittävien sijaintimuutosten palvelun vaihtoehtona location-tilalle.
Kohdan 2.5 muut alakohdat: 2.5.1 ja 2.5.2
2.5.1: julkiset API:t ja frameworkit oikeassa käytössä
"Apps may only use public APIs and must run on the currently shipping OS." Sovellus käyttää vain julkisia API:ita, toimii järjestelmän nykyisellä versiolla ja luopuu vanhentuneesta. Kuten 2.5.4:ssä, jokainen framework palvelee tarkoitettua käyttöään, joka mainitaan kuvauksessa: HealthKit terveydelle, HomeKit älykodille. Jos kirjasto kutsuu yksityistä API:a, hylkäyksen saa sinun sovelluksesi.
2.5.2: ei ladattavaa koodia, joka muuttaa sovellusta
Sovelluksen on pysyttävä omavaraisena paketissaan. Se ei saa "download, install, or execute code which introduces or changes features or functionality of the app". Vain koodaamista opettavilla opetussovelluksilla on rajattu poikkeus, ja koodin on oltava käyttäjälle kokonaan näkyvää ja muokattavaa.
Expossa kysymys koskee EAS Updatea, jonka dokumentaatio muistuttaa, että päivitysten on noudatettava App Storen sääntöjä. Käytä etäpäivityksiä korjauksiin, älä koskaan toimittamaan toimintoa, jota arvioija ei ole nähnyt. Arviointiin liittyvä korjaus kulkee uuden buildin kautta, kuten selitän guideline 2.1 -oppaassa.
Miten vastata 2.5.4-hylkäykseen?
Keskustelu käydään sovelluksesi App Review -osiossa, jossa vastaat App Reviewn viestiin. Kaksi tapausta:
- Tila on turha: poista se, tee uusi build, tarkista introspektio ja vastaa kahdella lauseella.
- Tila palvelee oikeaa toimintoa: vastaa tarkalla polulla ja lyhyellä videolla, ja toista sama teksti jokaisen version arviointimuistiinpanoissa.
Pohja, jota käyttäisin, sovitettavaksi (poista hälytystä koskeva lause, jos sovelluksessasi ei ole sellaista):
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-tarkistuslista ennen lähetystä
- Expon introspektio näyttää vain tarkoitetut tilat, ja osaat nimetä kunkin toiminnon.
- Yhtään pluginia ei ole ilmoitettu lyhyessä muodossa, jos se lisää tilan oletuksena, kuten expo-audio.
- Paikallinen
ios/-kansiosi ei säilytä vanhoja avaimia, tai käännät puhtaasta prebuildista. - Toiminto käynnistyy nopeasti ilman piilotettuja asetuksia, ja arviointimuistiinpanot kertovat, mihin kukin tila on ja miten sitä testataan.
- Jokainen tallennus pyytää nimenomaisen suostumuksen ja näyttää näkyvän ilmaisimen. Lupapyyntöjen säännöt löytyvät guideline 5.1.1 -oppaasta.
- Herätyksessä hälytys kulkee AlarmKitin kautta, ei sovelluksesta toistettuna äänenä.
Tarkista kokonaisuus ennen lähetystä
Review Kit kokoaa tarkistuslistani ennen lähetystä, muistiinpanopohjat testaajalle ja Claude Code -skillejä, jotka käyvät projektisi läpi. Jos haluat ihmisen silmät, varaa tunti kanssani: luemme Applen viestin ja Info.plistisi yhdessä videopuhelussa. Koko prosessi on sivulla Applen hylkäämä sovellus.
Valmisteletko ensimmäistä julkaisuasi? Tee ilmainen diagnoosi: se laittaa vaiheet järjestykseen ja lähettää sinulle Applen hylkäysten vastaisen tarkistuslistani.
Kukaan ei voi taata, että Apple hyväksyy sovelluksesi. Hyvin perusteltu taustatila sen sijaan puolustetaan kolmessakymmenessä sekunnissa.
Usein kysytyt kysymykset
Mitä "Guideline 2.5.4 - Performance - Software Requirements" tarkoittaa?
Se on hylkäyksen otsikko, kun Apple katsoo, ettei jokin Info.plistisi taustatila palvele tarkoitettua käyttöään. Viesti nimeää tilan ja ehdottaa, että näytät sitä käyttävän toiminnon tai poistat avaimen.
Tarvitaanko uusi build 2.5.4-hylkäyksen jälkeen?
Jos poistat tai muutat tilaa, kyllä: avain on Info.plistissä eli binäärissä. Jos tila on perusteltu, vastaus tarkalla polulla ja videolla voi riittää.
Voiko audio-tilan pitää muutamaa käyttöliittymä-ääntä varten?
Ei. Etualalla toistetut lyhyet äänet eivät tarvitse sitä. Aseta Expossa expo-audio-pluginin enableBackgroundPlayback arvoon false.
Tarvitseeko herätyssovellus audio-tilaa?
Ei soimiseen, jos se käyttää AlarmKitia, joka on saatavilla iOS 26:sta alkaen: järjestelmä soittaa hälytyksen. Solysissa audio-tila palvelee yökuuntelua, joka tallentaa näytön ollessa lukittuna.
Miksi Apple viittaa 2.5.4:ään, vaikka en ilmoittanut mitään?
Plugin on ehkä tehnyt sen puolestasi: expo-audio lisää audio-tilan oletuksena, ja vanha ios/-kansio voi säilyttää konfiguraatiostasi poistetun avaimen. Tarkista komennolla npx expo config --type introspect.

