# Guideline 2.5.4: bakgrundsläge avvisat av Apple

> Apple avvisar ett bakgrundsläge som saknar en funktion som använder det. Ta bort nyckeln eller visa granskaren ljudet, positionen eller samtalet.

Originalsida: [Guideline 2.5.4: bakgrundsläge avvisat av Apple](https://devoria.fr/sv/blog/guideline-2-5-4-bakgrundslage-avvisat-apple)
Författare: [Mehdi Azizi](https://devoria.fr/sv/mehdi-azizi)
Publicerad: 2026-11-04
Innehållet senast granskat: 2026-11-04


Guideline 2.5.4 begränsar bakgrundslägena till det de är avsedda för: ljud, position, VoIP-samtal, slutförande av uppgifter och lokala notiser. Du får ett avslag när din Info.plist deklarerar något av de här lägena och granskaren inte hittar någon funktion som behöver det. **Ta bort nyckeln om inget använder den, annars visar du granskaren funktionen på trettio sekunder.**

Jag publicerar mina egna iOS-appar med Expo. Solys, min väckarklocka med minispel, deklarerar ljudläget. Jag tog bort det och lade sedan tillbaka det av ett annat skäl. Guiden bygger på Apples text, på avslag som andra utvecklare har publicerat och på mina egna projekt. Vill du ha en överblick över avslagsorsakerna kan du läsa [varför Apple avvisar en app](https://devoria.fr/sv/blog/apple-avvisade-appen-orsaker).

## Vad säger guideline 2.5.4?

Regeln är en enda mening i avsnitt 2 ”Performance”, del 2.5 ”Software Requirements”, i [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#2.5.4): ”Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc.”

Enkelt uttryckt: en bakgrundstjänst får bara användas till det den finns till för. Därav rubriken ”Guideline 2.5.4 - Performance - Software Requirements”.

Som standard pausas en app när den hamnar i bakgrunden. För att fortsätta köra måste den deklarera ett eller flera lägen i nyckeln `UIBackgroundModes` i sin Info.plist. [Apples dokumentation om bakgrundslägen](https://developer.apple.com/documentation/xcode/configuring-background-execution-modes) ber dig använda dem sparsamt, med tanke på batteriet, och välja en annan lösning när en sådan finns. **Varje deklarerat läge är ett löfte som granskaren kan kontrollera.**

## Bakgrundslägena och vad de är avsedda för

| Läge               | Nyckel                | Avsedd användning            |
| ------------------ | --------------------- | ---------------------------- |
| Ljud, AirPlay, PiP | `audio`               | Hörbart ljud i bakgrunden    |
| Position           | `location`            | Kontinuerlig position        |
| Röst över IP       | `voip`                | Samtal med CallKit           |
| Hämtning           | `fetch`               | Regelbundet nätverksinnehåll |
| Bearbetning        | `processing`          | Schemalagda uppgifter        |
| Fjärrnotiser       | `remote-notification` | Push om nytt innehåll        |

Tabellen sammanfattar Apples sida. I de avslag som publicerats på forumen är det `audio`, `location` och `voip` som dyker upp oftast.

## Vad betyder avslagsmeddelandet för 2.5.4?

Meddelandet nämner vilket läge det gäller. Två exempel som utvecklare har publicerat på Apples forum:

- **Ljud**: ”Your app still declares support for audio in the UIBackgroundModes key in your Info.plist but did not include features that require persistent audio.” Fortsättningen förklarar att nyckeln `audio` är till för appar som spelar upp hörbart innehåll i bakgrunden, som en musikspelare. Den föreslår två vägar ut: lägg till sådant innehåll eller ta bort nyckeln ([forumtråd](https://developer.apple.com/forums/thread/95216)).
- **Position**: i en [tråd från december 2024](https://developer.apple.com/forums/thread/771202) hittade Apple ingen annan funktion än spårning av anställda som krävde ständig position, och skrev att den användningen ensam inte är lämplig.

Min tolkning: **granskaren läser inte din kod, hen letar efter en funktion.** Hen ska kunna starta den, lägga appen i bakgrunden och se att den fortsätter.

Det omvända fallet finns också. I en [tråd från maj 2026](https://developer.apple.com/forums/thread/826849) avvisades en uppläsningsapp, som verkligen använde läget `audio`, flera gånger: granskaren lyckades inte få igång ljudet. En annan utvecklare skriver där att en bifogad video enligt hans mening löste hans fall. Det är ett vittnesmål, inte en regel från Apple.

## Var kommer nyckeln ifrån när du inte har lagt till den?

Med Expo är det konfigurationspluginsen som fyller i Info.plist vid prebuild. **Ett bakgrundsläge kan alltså hamna i din binär utan att du har bestämt det.**

### Pluginet expo-audio med standardinställningar

[Dokumentationen för expo-audio](https://docs.expo.dev/versions/latest/sdk/audio/) säger det rakt ut: alternativet `enableBackgroundPlayback` är `true` som standard och lägger på iOS till läget `audio`. Att deklarera pluginet i kortform, `"expo-audio"`, räcker alltså för att deklarera läget.

Det var det jag hittade när jag gick igenom TradaZen inför första inskickningen: korta gränssnittsljud i förgrunden, men ett plugin deklarerat i kortform. Fixen ryms i `app.json`:

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

Andra paket lägger till ett läge på sitt eget sätt. Alternativet `isIosBackgroundLocationEnabled` i [expo-location](https://docs.expo.dev/versions/latest/sdk/location/) lägger bara till `location` om du aktiverar det. [expo-background-task](https://docs.expo.dev/versions/latest/sdk/background-task/) lägger däremot till `processing` vid prebuild så fort det är installerat.

### Mappen ios/ som behåller den gamla nyckeln

Den andra fällan gick jag själv i med Solys i juli 2026. Jag hade tagit bort `audio` från `app.json`, men nyckeln låg kvar i `ios/Solys/Info.plist`, som genererats tidigare. En prebuild utan `--clean` ändrar det projektet i stället för att skapa om det, och pluginet lägger till nyckeln men tar aldrig bort den. Ett lokalt bygge hade fått med den. Ett EAS-bygge i molnet utgår från en ny prebuild när `ios/` ignoreras av git, vilket var fallet för mig.

Före varje bygge kontrollerar jag vad som faktiskt kommer att skickas:

```bash
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
```

Det första kommandot listar lägena som prebuild kommer att skriva i Info.plist. Det andra skapar om det nativa projektet för ett lokalt bygge och raderar mappen `ios/`. På Solys visar det första `"UIBackgroundModes":["audio"]`, på TradaZen ingenting: båda är avsiktliga.

Att lägga till eller ta bort ett läge ändrar Info.plist, alltså binären: **du behöver ett nytt bygge, en fjärruppdatering räcker inte.** [Dokumentationen för EAS Update](https://docs.expo.dev/eas-update/introduction/) räknar sådana ändringar till dem som kräver en ny binär, precis som för [ITMS-90683](https://devoria.fr/sv/blog/itms-90683-missing-purpose-string-expo).

## Solys: ett deklarerat ljudläge, med ett riktigt skäl

Solys är en väckarklocka, men läget `audio` används inte för att larmet ska ringa: **larmsignalen går via AlarmKit**, Apples larmtjänst som finns sedan iOS 26 ([AlarmKit-dokumentation](https://developer.apple.com/documentation/alarmkit)). Det är systemet som ringer, även i tyst läge, inte appen.

Här är nyckelns historik, eftersom resonemanget betyder mer än raden:

1. **I slutet av juli 2026 tar jag bort den.** Inget spelade ljud i bakgrunden: minispelens ljudeffekter stannar i förgrunden och larmet är inte beroende av appen.
2. **Två dagar senare lägger jag tillbaka den**, för nattlyssningen. Funktionen spelar in ljuden under din natt med mikrofonen och analyserar dem på iPhonen. Inspelningen måste fortsätta när skärmen är låst, och dokumentationen för expo-audio anger att alternativet för inspelning i bakgrunden också lägger till läget `audio`.

Motiveringen har bytt karaktär: **läget används för att spela in, inte för att spela upp.** Tre skyddsräcken, synliga i appen:

- lyssningen är ett tillval som är avstängt som standard och slås på i inställningarna eller i kvällsrutinen;
- den har en egen samtyckesskärm, som [regel 2.5.14](https://developer.apple.com/app-store/review/guidelines/#2.5.14) kräver för all inspelning, och ingenting lämnar telefonen;
- mikrofonen stängs tio minuter före larmet, så att lyssning och larmsignal aldrig krockar.

Jag kan inte garantera att en granskare alltid godkänner den här deklarationen. Men jag kan säga, för varje del, vad den är till för och var man ser den.

### Väckarklockorna som höll appen vaken

Före AlarmKit kunde en tredjepartsapp för väckning inte ringa som Apples larm. Vissa bibliotek höll därför appen vaken: dokumentationen för Flutter-paketet [alarm2](https://pub.dev/packages/alarm2) beskriver en tyst ljudspelare som körs fram till larmet. Men ett tyst ljud hörs inte. **Sedan iOS 26 gör AlarmKit den omvägen onödig.**

## Behålla eller ta bort läget: beslutstabellen

| Din situation            | Vad du gör                 |
| ------------------------ | -------------------------- |
| Korta ljud i förgrunden  | Ta bort `audio`            |
| Musik eller ljudbok      | Behåll, visa den           |
| Lång inspelning          | Behåll + samtycke          |
| Väckarklocka eller timer | AlarmKit (iOS 26)          |
| Position då och då       | Betydande förändringar     |
| Synk utan brådska        | `fetch` eller `processing` |
| Ljud- eller videosamtal  | `voip` med CallKit         |

För position nämner Apples sida tjänsten för betydande platsförändringar som alternativ till läget `location`.

## De andra punkterna i 2.5: 2.5.1 och 2.5.2

### 2.5.1: publika API:er och ramverk på rätt plats

”Apps may only use public APIs and must run on the currently shipping OS.” Appen använder bara publika API:er, körs på systemets aktuella version och slutar använda det som är föråldrat. Precis som för 2.5.4 ska varje ramverk användas till det det är avsett för, och det ska nämnas i beskrivningen: HealthKit för hälsa, HomeKit för det uppkopplade hemmet. Om ett bibliotek anropar ett privat API är det din app som får avslaget.

### 2.5.2: ingen nedladdad kod som ändrar appen

Appen ska vara självständig i sitt paket. Den får inte ”download, install, or execute code which introduces or changes features or functionality of the app”. Bara utbildningsappar som lär ut programmering har ett begränsat undantag, med kod som är helt synlig och kan ändras av användaren.

Med Expo rör frågan EAS Update, vars dokumentation påminner om att uppdateringar måste följa App Stores regler. **Använd fjärruppdateringar för att rätta fel, aldrig för att leverera en funktion som granskaren inte har sett.** En rättning kopplad till granskningen går via ett nytt bygge, som jag förklarar i guiden om [guideline 2.1](https://devoria.fr/sv/blog/guideline-2-1-app-store-avslag-app-completeness).

## Hur svarar du på ett avslag enligt 2.5.4?

Konversationen förs i avsnittet App Review för din app, där du [svarar på meddelandet från App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/). Två fall:

- **Läget används inte till något**: ta bort det, bygg om, kontrollera introspektionen och svara sedan med två meningar.
- **Läget används av en riktig funktion**: svara med exakt sökväg och en kort video, och ta sedan med samma text i granskningsanteckningarna för varje version.

Mallen jag skulle använda, anpassa den (ta bort meningen om larmet om din app inte har något):

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

## Checklistan för 2.5.4 före inskickning

- Expos introspektion visar bara de lägen du vill ha, och du kan namnge funktionen bakom vart och ett.
- Inget plugin deklareras i kortform om det lägger till ett läge som standard, som expo-audio.
- Din lokala `ios/`-mapp har inga gamla nycklar kvar, eller så bygger du från en ren prebuild.
- Funktionen startar snabbt, utan dolda inställningar, och granskningsanteckningarna säger vilket läge som används till vad och hur det testas.
- All inspelning kräver uttryckligt samtycke och visar en synlig indikator. Reglerna för behörighetsförfrågningar finns i guiden om [guideline 5.1.1](https://devoria.fr/sv/blog/guideline-5-1-1-app-store-avslag).
- För en väckarklocka går larmsignalen via AlarmKit, inte via ett ljud som spelas från appen.

## Kontrollera ditt underlag före inskickning

[Review Kit](https://devoria.fr/sv/kits/app-review) samlar min checklista inför inskickning, mallar för anteckningar till testaren och Claude Code-skills som går igenom ditt projekt. Vill du ha ett mänskligt öga, [boka en timme med mig](https://devoria.fr/sv/coaching): vi läser Apples meddelande och din Info.plist tillsammans, via videosamtal. Hela tillvägagångssättet finns på sidan [app avvisad av Apple](https://devoria.fr/sv/expertise/app-nekad-av-apple).

Förbereder du din första lansering? [Gör din gratis diagnostik](https://devoria.fr/sv/diagnostic): den sätter stegen i rätt ordning och skickar dig min checklista mot avslag från Apple.

Ingen kan garantera att Apple godkänner din app. Men ett väl motiverat bakgrundsläge går att försvara på trettio sekunder.

## Vanliga frågor

### Vad betyder ”Guideline 2.5.4 - Performance - Software Requirements”?

Det är rubriken på avslaget när Apple anser att ett bakgrundsläge i din Info.plist inte används till det det är avsett för. Meddelandet nämner läget och föreslår att du visar funktionen som använder det eller tar bort nyckeln.

### Behövs ett nytt bygge efter ett avslag enligt 2.5.4?

Om du tar bort eller ändrar ett läge, ja: nyckeln ligger i Info.plist och alltså i binären. Om läget är motiverat kan det räcka med ett svar med exakt sökväg och en video.

### Kan man behålla ljudläget för några gränssnittsljud?

Nej. Korta ljud som spelas i förgrunden behöver det inte. Med Expo sätter du `enableBackgroundPlayback` till `false` i pluginet expo-audio.

### Behöver en väckarklocka-app ljudläget?

Inte för att ringa, om den bygger på AlarmKit, som finns sedan iOS 26: det är systemet som spelar larmet. I Solys används läget `audio` för nattlyssningen, som spelar in när skärmen är låst.

### Varför hänvisar Apple till 2.5.4 när jag inte har deklarerat något?

Ett plugin kan ha gjort det åt dig: expo-audio lägger till läget `audio` som standard, och en gammal `ios/`-mapp kan behålla en nyckel som du har tagit bort ur din konfiguration. Kontrollera med `npx expo config --type introspect`.


## Ditt projekt

[Review Kit](https://devoria.fr/sv/kits/app-review): Min checklista för App Store-granskningen, mina avslag från Apple och hur jag fixade dem, en för Google Play och tre Claude Code-skills. 549 kr.

[iOS & Android Kit](https://devoria.fr/sv/kits/ios): Bygg din app för iPhone och Android med Claude Code: startkoden från mina appar, hela vägen till butikerna och alla kit. 1 099 kr.

[Diagnos: det som skiljer dig från din iPhone-app](https://devoria.fr/sv/diagnostic): 7 frågor, 60 sekunder: du får veta vad som egentligen hindrar dig från att publicera din iPhone-app, din väg i 4 steg och kitet som passar dig.
