Guideline 2.5.4: bakgrunnsmodus avvist av Apple
Av Mehdi Azizi
Publisert , 9 min
Guideline 2.5.4: Apple avviser en bakgrunnsmodus uten funksjon som bruker den. Fjern nøkkelen, eller vis revieweren lyden, posisjonen eller samtalen.
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.
Hva sier guideline 2.5.4?
Regelen er én setning, i seksjon 2 «Performance», del 2.5 «Software Requirements», i App Review Guidelines: «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 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
audioer 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). - Posisjon: I en tråd fra desember 2024 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 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 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:
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
Andre pakker legger til en modus på sin egen måte. Alternativet isIosBackgroundLocationEnabled i expo-location legger bare til location hvis du slår det på. expo-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:
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 regner slike endringer blant dem som krever en ny binærfil, som for ITMS-90683.
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). Det er systemet som ringer, også i lydløs modus, ikke appen.
Historikken til nøkkelen, fordi resonnementet betyr mer enn linjen:
- 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.
- 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 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 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.
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. 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):
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.
- For en vekkerklokke går ringingen gjennom AlarmKit, ikke gjennom en lyd spilt av appen.
Sjekk innsendingen før du sender
Review Kit 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: Vi leser Apples melding og Info.plist-filen din sammen, på video. Hele fremgangsmåten finner du på siden app avvist av Apple.
Forbereder du din første lansering? Ta den gratis diagnosen: 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.

