# Guideline 2.5.4: bakgrunnsmodus avvist av Apple

> Guideline 2.5.4: Apple avviser en bakgrunnsmodus uten funksjon som bruker den. Fjern nøkkelen, eller vis revieweren lyden, posisjonen eller samtalen.

Opprinnelig side: [Guideline 2.5.4: bakgrunnsmodus avvist av Apple](https://devoria.fr/no/blog/guideline-2-5-4-bakgrunnsmodus-avvist-apple)
Forfatter: [Mehdi Azizi](https://devoria.fr/no/mehdi-azizi)
Publisert: 2026-11-04
Innhold sist revidert: 2026-11-04


Guideline 2.5.4 begrenser bakgrunnsmodusene til det de er ment for: lyd, posisjon, VoIP-samtaler, fullføring av oppgaver, lokale varsler. Avvisningen kommer når Info.plist-filen din deklarerer en av disse modusene, og revieweren ikke finner noen funksjon som trenger den. **Fjern nøkkelen hvis ingenting bruker den, ellers vis revieweren funksjonen på tretti sekunder.**

Jeg publiserer mine egne iOS-apper med Expo. Solys, vekkerklokken min med minispill, deklarerer audio-modusen: Jeg fjernet den, og la den så inn igjen av en annen grunn. Denne guiden bygger på Apples tekst, på avvisninger publisert av andre utviklere og på mine egne prosjekter. For et overblikk over avvisningsgrunnene, les [hvorfor Apple avviser en app](https://devoria.fr/no/blog/avvist-av-apple-hvorfor-appen-blir-avvist).

## Hva sier guideline 2.5.4?

Regelen er én setning, i seksjon 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 sagt: En bakgrunnstjeneste skal bare brukes til det den finnes for. Derav tittelen «Guideline 2.5.4 - Performance - Software Requirements».

Som standard blir en app som går i bakgrunnen, satt på pause. For å fortsette å kjøre deklarerer den én eller flere moduser i nøkkelen `UIBackgroundModes` i Info.plist. [Apples dokumentasjon om bakgrunnsmoduser](https://developer.apple.com/documentation/xcode/configuring-background-execution-modes) ber deg bruke dem sparsomt, på grunn av batteriet, og velge en annen løsning når den finnes. **Hver modus du deklarerer, er et løfte revieweren kan sjekke.**

## Bakgrunnsmodusene og hva de er ment for

| Modus               | Nøkkel                | Tiltenkt bruk              |
| ------------------- | --------------------- | -------------------------- |
| Audio, AirPlay, PiP | `audio`               | Hørbar lyd i bakgrunnen    |
| Posisjon            | `location`            | Kontinuerlig posisjon      |
| Voice over IP       | `voip`                | Samtaler med CallKit       |
| Henting             | `fetch`               | Jevnlig innhold fra nettet |
| Prosessering        | `processing`          | Planlagte oppgaver         |
| Eksterne varsler    | `remote-notification` | Push om nytt innhold       |

Tabellen oppsummerer Apples side. I avvisningene som er publisert på forumene, går `audio`, `location` og `voip` igjen oftest.

## Hva betyr avvisningsmeldingen for 2.5.4?

Meldingen nevner modusen det gjelder. To eksempler publisert av utviklere på Apples forumer:

- **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.» Videre presiseres det at nøkkelen `audio` er laget for apper som spiller av innhold i bakgrunnen, som en musikkspiller. Den foreslår to utveier: legge til slikt innhold eller fjerne nøkkelen ([forumtråd](https://developer.apple.com/forums/thread/95216)).
- **Posisjon**: I en [tråd fra desember 2024](https://developer.apple.com/forums/thread/771202) fant ikke Apple noen funksjon utover sporing av ansatte som krever permanent posisjon, og skrev at denne bruken alene ikke er passende.

Min tolkning: **Revieweren leser ikke koden din, hen leter etter en funksjon.** Hen må kunne starte den, sende appen i bakgrunnen og se at den fortsetter.

Det motsatte tilfellet finnes også. I en [tråd fra mai 2026](https://developer.apple.com/forums/thread/826849) ble en opplesningsapp, som faktisk brukte `audio`-modusen, avvist flere ganger: Revieweren klarte ikke å utløse lyden. En annen utvikler skriver der at en vedlagt video etter hans mening løste saken hans. Det er et vitnesbyrd, ikke en regel fra Apple.

## Hvor kommer nøkkelen fra når du ikke har lagt den til?

Med Expo er det konfigurasjonspluginene som fyller ut Info.plist ved prebuild. **En bakgrunnsmodus kan altså havne i binærfilen din uten at du har bestemt det.**

### expo-audio-pluginen, med standardinnstillinger

[Dokumentasjonen til expo-audio](https://docs.expo.dev/versions/latest/sdk/audio/) sier det: Alternativet `enableBackgroundPlayback` er `true` som standard og legger til `audio`-modusen på iOS. Å deklarere pluginen i kortform, `"expo-audio"`, er altså nok til å deklarere modusen.

Det var det jeg fant da jeg gikk gjennom TradaZen før første innsending: korte grensesnittlyder i forgrunnen, men en plugin deklarert i kortform. Rettelsen ligger i `app.json`:

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

Andre pakker legger til en modus på sin egen måte. Alternativet `isIosBackgroundLocationEnabled` i [expo-location](https://docs.expo.dev/versions/latest/sdk/location/) legger bare til `location` hvis du slår det på. [expo-background-task](https://docs.expo.dev/versions/latest/sdk/background-task/) legger derimot til `processing` ved prebuild så snart den er installert.

### ios/-mappen som beholder den gamle nøkkelen

Den andre fellen opplevde jeg på Solys i juli 2026. Jeg hadde fjernet `audio` fra `app.json`, men nøkkelen lå fortsatt i `ios/Solys/Info.plist`, som var generert tidligere. En prebuild uten `--clean` endrer dette prosjektet i stedet for å lage det på nytt, og pluginen legger til nøkkelen uten noen gang å fjerne den. Et lokalt bygg ville tatt den med. Et EAS-bygg i skyen starter fra en ny prebuild når `ios/` er ignorert av git, og det var tilfellet hos meg.

Før hvert bygg sjekker jeg hva som faktisk blir sendt:

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

Den første viser modusene prebuild vil skrive i Info.plist. Den andre lager det native prosjektet på nytt for et lokalt bygg, og sletter `ios/`-mappen. På Solys viser den første `"UIBackgroundModes":["audio"]`, på TradaZen ingenting: Begge deler er tilsiktet.

Å legge til eller fjerne en modus endrer Info.plist, og dermed binærfilen: **Du trenger et nytt bygg, en ekstern oppdatering er ikke nok.** [Dokumentasjonen til EAS Update](https://docs.expo.dev/eas-update/introduction/) regner slike endringer blant dem som krever en ny binærfil, som for [ITMS-90683](https://devoria.fr/no/blog/itms-90683-missing-purpose-string-expo).

## Solys: en deklarert audio-modus, med en reell grunn

Solys er en vekkerklokke, men `audio`-modusen brukes ikke til å la alarmen ringe: **Ringingen går gjennom AlarmKit**, Apples alarmtjeneste som er tilgjengelig fra iOS 26 ([AlarmKit-dokumentasjon](https://developer.apple.com/documentation/alarmkit)). Det er systemet som ringer, også i lydløs modus, ikke appen.

Historikken til nøkkelen, fordi resonnementet betyr mer enn linjen:

1. **I slutten av juli 2026 fjerner jeg den.** Ingenting spilte lyd i bakgrunnen: Lydeffektene i minispillene holder seg i forgrunnen, og alarmen er ikke avhengig av appen.
2. **To dager senere legger jeg den inn igjen**, sammen med nattlyttingen. Denne funksjonen tar opp lydene fra natten din med mikrofonen og analyserer dem på iPhonen. Opptaket må fortsette med låst skjerm, og dokumentasjonen til expo-audio sier at alternativet for opptak i bakgrunnen også legger til `audio`-modusen.

Begrunnelsen har endret karakter: **Modusen brukes til å ta opp, ikke til å spille av.** Tre sikkerhetstiltak, synlige i appen:

- lyttingen er en funksjon som er av som standard, og som slås på fra innstillingene eller kveldsrutinen;
- den har sin egen samtykkeskjerm, slik [regel 2.5.14](https://developer.apple.com/app-store/review/guidelines/#2.5.14) krever for alle opptak, og ingenting forlater telefonen;
- mikrofonen slås av ti minutter før alarmen, slik at lyttingen og ringingen aldri kommer i veien for hverandre.

Jeg kan ikke garantere at en reviewer alltid godtar denne deklarasjonen. Men jeg kan si, for hvert element, hva det brukes til og hvor man ser det.

### Vekkerklokkene som holdt appen våken

Før AlarmKit kunne ikke en tredjeparts vekkerklokke-app ringe som Apples alarm. Noen biblioteker holdt derfor appen våken: Dokumentasjonen til Flutter-pakken [alarm2](https://pub.dev/packages/alarm2) beskriver en lydløs lydspiller som kjører frem til alarmen. Men en stum lyd lar deg ikke høre noe. **Fra og med iOS 26 gjør AlarmKit denne omveien unødvendig.**

## Beholde eller fjerne modusen: beslutningstabellen

| Din situasjon                | Hva du gjør                |
| ---------------------------- | -------------------------- |
| Korte lyder i forgrunnen     | Fjern `audio`              |
| Musikk eller lydbok          | Behold, vis det frem       |
| Langt opptak                 | Behold + samtykke          |
| Vekkerklokke eller timer     | AlarmKit (iOS 26)          |
| Posisjon av og til           | Betydelige endringer       |
| Synkronisering uten hastverk | `fetch` eller `processing` |
| Lyd- eller videosamtaler     | `voip` med CallKit         |

For posisjon nevner Apples side tjenesten for betydelige posisjonsendringer som alternativ til `location`-modusen.

## De andre punktene i 2.5: 2.5.1 og 2.5.2

### 2.5.1: offentlige API-er og rammeverk brukt riktig

«Apps may only use public APIs and must run on the currently shipping OS.» Appen bruker bare offentlige API-er, kjører på gjeldende systemversjon og slutter å bruke det som er utfaset. Som for 2.5.4 skal hvert rammeverk brukes til det det er ment for, og nevnes i beskrivelsen: HealthKit for helse, HomeKit for smarthjem. Hvis et bibliotek kaller et privat API, er det appen din som får avvisningen.

### 2.5.2: ingen nedlastet kode som endrer appen

Appen skal være selvstendig i pakken sin. Den kan ikke «download, install, or execute code which introduces or changes features or functionality of the app». Bare pedagogiske apper som lærer bort programmering har et begrenset unntak, med kode som er helt synlig og redigerbar for brukeren.

Med Expo berører dette EAS Update, og dokumentasjonen minner om at oppdateringene må følge App Store-reglene. **Bruk eksterne oppdateringer til å fikse feil, aldri til å levere en funksjon revieweren ikke har sett.** En rettelse knyttet til gjennomgangen går via et nytt bygg, slik jeg forklarer i guiden om [guideline 2.1](https://devoria.fr/no/blog/guideline-2-1-app-store-avvisning).

## Hvordan svarer du på en 2.5.4-avvisning?

Samtalen foregår i App Review-delen for appen din, der du [svarer på meldingen fra App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/). To tilfeller:

- **Modusen brukes ikke til noe**: Fjern den, lag et nytt bygg, sjekk introspeksjonen og svar med to setninger.
- **Modusen brukes av en reell funksjon**: Svar med den nøyaktige veien og en kort video, og gjenta teksten i review-notatene for hver versjon.

Malen jeg ville brukt, tilpass den (fjern setningen om alarmen hvis appen din ikke har en):

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

## Sjekkliste for 2.5.4 før innsending

- Expo-introspeksjonen viser bare modusene du vil ha, og du kan navngi funksjonen til hver av dem.
- Ingen plugin er deklarert i kortform hvis den legger til en modus som standard, som expo-audio.
- Den lokale `ios/`-mappen din har ingen gammel nøkkel igjen, eller du bygger fra en ren prebuild.
- Funksjonen utløses raskt, uten skjulte innstillinger, og review-notatene sier hvilken modus som brukes til hva og hvordan den testes.
- Alle opptak krever eksplisitt samtykke og viser en synlig indikator. Reglene for tillatelsesforespørsler står i guiden om [guideline 5.1.1](https://devoria.fr/no/blog/guideline-5-1-1-app-store-avvisning).
- For en vekkerklokke går ringingen gjennom AlarmKit, ikke gjennom en lyd spilt av appen.

## Sjekk innsendingen før du sender

[Review Kit](https://devoria.fr/no/kits/app-review) samler sjekklisten min før innsending, maler for notater til testeren og Claude Code-skills som går gjennom prosjektet ditt. Vil du ha et menneskelig blikk, [book en time med meg](https://devoria.fr/no/coaching): Vi leser Apples melding og Info.plist-filen din sammen, på video. Hele fremgangsmåten finner du på siden [app avvist av Apple](https://devoria.fr/no/expertise/app-avvist-av-apple).

Forbereder du din første lansering? [Ta den gratis diagnosen](https://devoria.fr/no/diagnostic): Den setter stegene i riktig rekkefølge og sender deg sjekklisten min mot avvisninger fra Apple.

Ingen kan garantere at Apple godtar appen din. Men en godt begrunnet bakgrunnsmodus kan forsvares på tretti sekunder.

## Ofte stilte spørsmål

### Hva betyr «Guideline 2.5.4 - Performance - Software Requirements»?

Det er tittelen på avvisningen når Apple mener at en bakgrunnsmodus i Info.plist-filen din ikke brukes til det den er ment for. Meldingen nevner modusen og foreslår at du viser funksjonen som bruker den, eller fjerner nøkkelen.

### Trenger jeg et nytt bygg etter en 2.5.4-avvisning?

Hvis du fjerner eller endrer en modus, ja: Nøkkelen ligger i Info.plist, altså i binærfilen. Hvis modusen er begrunnet, kan et svar med den nøyaktige veien og en video være nok.

### Kan jeg beholde audio-modusen for noen grensesnittlyder?

Nei. Korte lyder spilt i forgrunnen trenger den ikke. Med Expo setter du `enableBackgroundPlayback` til `false` i expo-audio-pluginen.

### Trenger en vekkerklokke-app audio-modusen?

Ikke for å ringe, hvis den bruker AlarmKit, som er tilgjengelig fra iOS 26: Det er systemet som spiller alarmen. På Solys brukes `audio`-modusen til nattlyttingen, som tar opp med låst skjerm.

### Hvorfor viser Apple til 2.5.4 når jeg ikke har deklarert noe?

Kanskje en plugin har gjort det for deg: expo-audio legger til `audio`-modusen som standard, og en gammel `ios/`-mappe kan beholde en nøkkel du har fjernet fra konfigurasjonen. Sjekk med `npx expo config --type introspect`.


## Prosjektet ditt

[Review Kit](https://devoria.fr/no/kits/app-review): Sjekklisten min for App Store-gjennomgang, Apples avslag på appene mine med rettelser, sjekklisten for Google Play og tre Claude Code-skills. 499 kr.

[iOS & Android Kit](https://devoria.fr/no/kits/ios): Lag din iPhone- og Android-app med Claude Code: startkoden fra appene mine, veien helt til butikkene og alle kitene. 999 kr.

[Diagnose: dette står mellom deg og iPhone-appen din](https://devoria.fr/no/diagnostic): 7 spørsmål, 60 sekunder: du får vite hva som egentlig hindrer deg i å publisere iPhone-appen din, veien din i 4 steg og kitet som passer deg.
