# Guideline 2.5.4: Apple hylkäsi taustatilan

> Guideline 2.5.4: Apple hylkää taustatilan, jota mikään toiminto ei käytä. Poista avain tai näytä arvioijalle ääni, sijainti tai puhelu.

Alkuperäinen sivu: [Guideline 2.5.4: Apple hylkäsi taustatilan](https://devoria.fr/fi/blog/guideline-2-5-4-apple-hylkasi-taustatilan)
Kirjoittaja: [Mehdi Azizi](https://devoria.fr/fi/mehdi-azizi)
Julkaistu: 2026-11-04
Sisältö tarkistettu viimeksi: 2026-11-04


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](https://devoria.fr/fi/blog/apple-hylkasi-sovelluksen-syyt).

## Mitä guideline 2.5.4 sanoo?

Sääntö mahtuu yhteen lauseeseen [App Review Guidelinesin](https://developer.apple.com/app-store/review/guidelines/#2.5.4) 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](https://developer.apple.com/documentation/xcode/configuring-background-execution-modes) 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](https://developer.apple.com/forums/thread/95216)).
- **Sijainti**: [joulukuun 2024 ketjussa](https://developer.apple.com/forums/thread/771202) 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](https://developer.apple.com/forums/thread/826849) ää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](https://docs.expo.dev/versions/latest/sdk/audio/) 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:

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

Muut paketit lisäävät tilan omalla tavallaan. [expo-locationin](https://docs.expo.dev/versions/latest/sdk/location/) `isIosBackgroundLocationEnabled`-asetus lisää `location`-tilan vain, jos otat sen käyttöön. [expo-background-task](https://docs.expo.dev/versions/latest/sdk/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:

```bash
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](https://docs.expo.dev/eas-update/introduction/) luokittelee nämä muutokset niihin, jotka vaativat uuden binäärin, kuten [ITMS-90683](https://devoria.fr/fi/blog/itms-90683-missing-purpose-string-expo):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](https://developer.apple.com/documentation/alarmkit)). Järjestelmä soittaa, myös äänettömässä tilassa, ei sovellus.

Avaimen historia, koska päättely on tärkeämpää kuin itse rivi:

1. **Heinäkuun 2026 lopussa poistan sen.** Mikään ei toistanut ääntä taustalla: minipelien ääniefektit pysyvät etualalla, eikä hälytys riipu sovelluksesta.
2. **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](https://developer.apple.com/app-store/review/guidelines/#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](https://pub.dev/packages/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](https://devoria.fr/fi/blog/guideline-2-1-app-store-hylkays-korjaus) -oppaassa.

## Miten vastata 2.5.4-hylkäykseen?

Keskustelu käydään sovelluksesi App Review -osiossa, jossa [vastaat App Reviewn viestiin](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/). 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):

```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,
```

## 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](https://devoria.fr/fi/blog/guideline-5-1-1-app-store-hylkays-korjaus) -oppaasta.
- Herätyksessä hälytys kulkee AlarmKitin kautta, ei sovelluksesta toistettuna äänenä.

## Tarkista kokonaisuus ennen lähetystä

[Review Kit](https://devoria.fr/fi/kits/app-review) 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](https://devoria.fr/fi/coaching): luemme Applen viestin ja Info.plistisi yhdessä videopuhelussa. Koko prosessi on sivulla [Applen hylkäämä sovellus](https://devoria.fr/fi/expertise/apple-hylkasi-sovelluksen).

Valmisteletko ensimmäistä julkaisuasi? [Tee ilmainen diagnoosi](https://devoria.fr/fi/diagnostic): 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`.


## Projektisi

[Review Kit](https://devoria.fr/fi/kits/app-review): App Store -tarkastuksen tarkistuslistani, korjatut Applen hylkäykseni, Google Playn lista ja kolme Claude Code -skilliä. 49 €.

[iOS & Android Kit](https://devoria.fr/fi/kits/ios): Tee iPhone- ja Android-sovelluksesi Claude Codella: sovellusteni pohjakoodi, polku kauppoihin asti ja kaikki kitit. 99 €.

[Diagnoosi: mikä erottaa sinut omasta iPhone-sovelluksestasi](https://devoria.fr/fi/diagnostic): 7 kysymystä, 60 sekuntia: tiedät, mikä oikeasti estää sinua julkaisemasta iPhone-sovellustasi, saat 4 vaiheen polkusi ja sinulle sopivan kitin.
