# Guideline 2.5.4: achtergrondmodus afgewezen door Apple

> Apple wijst een achtergrondmodus af als geen functie hem gebruikt. Verwijder de sleutel of laat de reviewer het geluid, de locatie of de oproep zien.

Originele pagina: [Guideline 2.5.4: achtergrondmodus afgewezen door Apple](https://devoria.fr/nl/blog/guideline-2-5-4-achtergrondmodus-afgewezen-apple)
Auteur: [Mehdi Azizi](https://devoria.fr/nl/mehdi-azizi)
Publicatie: 2026-11-04
Laatste inhoudsrevisie: 2026-11-04


Guideline 2.5.4 beperkt achtergrondmodi tot hun bedoelde gebruik: geluid, locatie, VoIP-oproepen, het afronden van taken, lokale meldingen. De afwijzing komt als je Info.plist een van deze modi declareert en de reviewer geen enkele functie vindt die hem nodig heeft. **Verwijder de sleutel als niets hem gebruikt, en laat de reviewer anders de functie binnen dertig seconden zien.**

Ik publiceer mijn eigen iOS-apps met Expo. Solys, mijn wekker met minigames, declareert de audiomodus: ik heb hem verwijderd en later om een andere reden teruggezet. Deze gids is gebaseerd op de tekst van Apple, op afwijzingen die andere developers hebben gepubliceerd en op mijn eigen projecten. Voor het totaaloverzicht van de redenen lees je [waarom Apple een app afwijst](https://devoria.fr/nl/blog/app-afgewezen-door-apple-waarom).

## Wat zegt guideline 2.5.4?

De regel is één zin, in sectie 2 "Performance", onderdeel 2.5 "Software Requirements" van de [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."

Simpel gezegd: een achtergronddienst dient alleen waarvoor hij bestaat. Vandaar de titel "Guideline 2.5.4 - Performance - Software Requirements".

Standaard wordt een app die naar de achtergrond gaat gepauzeerd. Om door te blijven draaien declareert hij een of meer modi in de sleutel `UIBackgroundModes` van zijn Info.plist. De [documentatie van Apple over achtergrondmodi](https://developer.apple.com/documentation/xcode/configuring-background-execution-modes) vraagt om ze spaarzaam te gebruiken, vanwege de batterij, en een andere oplossing te kiezen als die bestaat. **Elke gedeclareerde modus is een belofte die de reviewer kan controleren.**

## De achtergrondmodi en hun bedoelde gebruik

| Modus               | Sleutel               | Bedoeld gebruik                   |
| ------------------- | --------------------- | --------------------------------- |
| Audio, AirPlay, PiP | `audio`               | Hoorbaar geluid op de achtergrond |
| Locatie             | `location`            | Doorlopende locatie               |
| Voice over IP       | `voip`                | Oproepen met CallKit              |
| Ophalen             | `fetch`               | Regelmatige netwerkcontent        |
| Verwerking          | `processing`          | Geplande taken                    |
| Externe meldingen   | `remote-notification` | Push van nieuwe content           |

Deze tabel vat de pagina van Apple samen. In de afwijzingen die op de forums staan, komen `audio`, `location` en `voip` het vaakst terug.

## Wat betekent de 2.5.4-afwijzing?

Het bericht noemt de betreffende modus. Twee voorbeelden die developers op de forums van Apple hebben gedeeld:

- **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." Verderop staat dat de sleutel `audio` bedoeld is voor apps die op de achtergrond content laten horen, zoals een muziekspeler. Er worden twee uitwegen voorgesteld: die content toevoegen of de sleutel verwijderen ([forumthread](https://developer.apple.com/forums/thread/95216)).
- **Locatie**: in een [thread van december 2024](https://developer.apple.com/forums/thread/771202) vond Apple geen enkele functie behalve het volgen van werknemers die een permanente locatie vraagt, en schrijft dat dit gebruik alleen niet gepast is.

Mijn lezing: **de reviewer leest je code niet, hij zoekt een functie.** Hij moet die kunnen starten, de app naar de achtergrond sturen en zien dat hij doorgaat.

Het omgekeerde komt ook voor. In een [thread van mei 2026](https://developer.apple.com/forums/thread/826849) werd een voorleesapp, die de modus `audio` echt gebruikte, meerdere keren afgewezen: de reviewer kreeg het geluid niet aan de praat. Een andere developer schrijft daar dat volgens hem een meegestuurde video zijn zaak heeft vlotgetrokken. Dat is een ervaring, geen regel van Apple.

## Waar komt de sleutel vandaan als jij hem niet hebt toegevoegd?

Met Expo vullen de configuratieplugins de Info.plist in tijdens de prebuild. **Een achtergrondmodus kan dus in je binary belanden zonder dat jij dat hebt besloten.**

### De expo-audio-plugin met standaardinstellingen

De [documentatie van expo-audio](https://docs.expo.dev/versions/latest/sdk/audio/) zegt het: de optie `enableBackgroundPlayback` staat standaard op `true` en voegt op iOS de modus `audio` toe. De plugin in zijn korte vorm declareren, `"expo-audio"`, is dus genoeg om de modus te declareren.

Dat vond ik toen ik TradaZen naliep vóór de eerste inzending: korte interfacegeluiden op de voorgrond, maar een plugin in korte vorm. De fix staat in `app.json`:

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

Andere pakketten voegen op hun eigen manier een modus toe. De optie `isIosBackgroundLocationEnabled` van [expo-location](https://docs.expo.dev/versions/latest/sdk/location/) voegt `location` alleen toe als je hem aanzet. [expo-background-task](https://docs.expo.dev/versions/latest/sdk/background-task/) voegt `processing` toe bij de prebuild zodra het geïnstalleerd is.

### De map ios/ die de oude sleutel bewaart

Tweede valkuil, meegemaakt met Solys in juli 2026. Ik had `audio` uit `app.json` gehaald, maar de sleutel stond nog in `ios/Solys/Info.plist`, eerder gegenereerd. Een prebuild zonder `--clean` past dat project aan in plaats van het opnieuw aan te maken, en de plugin voegt de sleutel toe zonder hem ooit te verwijderen. Een lokale build had hem meegenomen. Een EAS-build in de cloud begint met een verse prebuild als `ios/` door git wordt genegeerd, en dat was bij mij zo.

Voor elke build controleer ik wat er echt meegaat:

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

De eerste toont de modi die de prebuild in de Info.plist zal schrijven. De tweede maakt het native project opnieuw aan voor een lokale build en wist daarbij de map `ios/`. Bij Solys toont de eerste `"UIBackgroundModes":["audio"]`, bij TradaZen niets: allebei zoals bedoeld.

Een modus toevoegen of verwijderen wijzigt de Info.plist, dus de binary: **je hebt een nieuwe build nodig, een update op afstand is niet genoeg.** De [documentatie van EAS Update](https://docs.expo.dev/eas-update/introduction/) rekent zulke wijzigingen tot de wijzigingen die een nieuwe binary vereisen, net als bij [ITMS-90683](https://devoria.fr/nl/blog/itms-90683-missing-purpose-string-expo).

## Solys: een gedeclareerde audiomodus, met een echte reden

Solys is een wekker, maar de modus `audio` dient niet om het alarm te laten afgaan: **de wekker gaat af via AlarmKit**, de alarmdienst van Apple die beschikbaar is sinds iOS 26 ([AlarmKit-documentatie](https://developer.apple.com/documentation/alarmkit)). Het systeem laat het alarm afgaan, zelfs in stille modus, niet de app.

De geschiedenis van de sleutel, omdat de redenering belangrijker is dan de regel code:

1. **Eind juli 2026 haal ik hem weg.** Niets speelde geluid af op de achtergrond: de geluidseffecten van de minigames blijven op de voorgrond, en het alarm hangt niet van de app af.
2. **Twee dagen later zet ik hem terug**, met het nachtluisteren. Deze optie neemt de geluiden van je nacht op met de microfoon en analyseert ze op de iPhone. De opname moet doorgaan met vergrendeld scherm, en volgens de documentatie van expo-audio voegt de optie voor opnemen op de achtergrond ook de modus `audio` toe.

De rechtvaardiging is van aard veranderd: **de modus dient om op te nemen, niet om af te spelen.** Drie waarborgen, zichtbaar in de app:

- het luisteren is een optie die standaard uit staat en die je aanzet via de instellingen of het avondritueel;
- het heeft een eigen toestemmingsscherm, zoals [regel 2.5.14](https://developer.apple.com/app-store/review/guidelines/#2.5.14) voor elke opname vereist, en niets verlaat de telefoon;
- de microfoon gaat tien minuten voor het alarm dicht, zodat luisteren en het alarm elkaar nooit in de weg zitten.

Ik kan niet garanderen dat een reviewer deze declaratie altijd accepteert. Ik kan wel voor elk onderdeel zeggen waarvoor het dient en waar je het ziet.

### Wekkers die de app wakker hielden

Vóór AlarmKit kon een wekkerapp van derden niet afgaan zoals het alarm van Apple. Sommige bibliotheken hielden de app daarom wakker: de documentatie van het Flutter-pakket [alarm2](https://pub.dev/packages/alarm2) beschrijft een stille audiospeler die tot het alarm blijft draaien. Maar een stil geluid laat niets horen. **Sinds iOS 26 maakt AlarmKit die omweg overbodig.**

## Modus houden of verwijderen: de beslistabel

| Jouw situatie               | Wat te doen              |
| --------------------------- | ------------------------ |
| Korte geluiden op voorgrond | `audio` verwijderen      |
| Muziek of luisterboek       | Houden, laten zien       |
| Lange opname                | Houden + toestemming     |
| Wekker of timer             | AlarmKit (iOS 26)        |
| Af en toe een locatie       | Significante wijzigingen |
| Synchronisatie zonder haast | `fetch` of `processing`  |
| Audio- of video-oproepen    | `voip` met CallKit       |

Voor locatie noemt de pagina van Apple de dienst voor significante locatiewijzigingen als alternatief voor de modus `location`.

## De andere onderdelen van 2.5: 2.5.1 en 2.5.2

### 2.5.1: publieke API's en frameworks op hun plek

"Apps may only use public APIs and must run on the currently shipping OS." De app gebruikt alleen publieke API's, draait op de huidige systeemversie en laat verouderde onderdelen vallen. Net als bij 2.5.4 dient elk framework voor het bedoelde gebruik, vermeld in de beschrijving: HealthKit voor gezondheid, HomeKit voor het slimme huis. Als een bibliotheek een privé-API aanroept, is het jouw app die wordt afgewezen.

### 2.5.2: geen gedownloade code die de app verandert

De app blijft zelfstandig binnen zijn pakket. Hij mag geen "download, install, or execute code which introduces or changes features or functionality of the app". Alleen educatieve apps die leren programmeren hebben een beperkte uitzondering, met code die volledig zichtbaar is en door de gebruiker kan worden aangepast.

Met Expo raakt dit EAS Update, waarvan de documentatie eraan herinnert dat updates de regels van de App Store moeten volgen. **Gebruik updates op afstand om te repareren, nooit om een functie te leveren die de reviewer niet heeft gezien.** Een fix die met de review te maken heeft gaat via een nieuwe build, zoals ik uitleg in de gids over [guideline 2.1](https://devoria.fr/nl/blog/guideline-2-1-app-store-afwijzing-oplossen).

## Hoe reageer je op een 2.5.4-afwijzing?

Het gesprek vindt plaats in het onderdeel App Review van je app, waar je [antwoordt op het bericht van App Review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/reply-to-app-review-messages/). Twee gevallen:

- **De modus dient nergens voor**: verwijder hem, maak een nieuwe build, controleer de introspectie en antwoord in twee zinnen.
- **De modus dient een echte functie**: antwoord met het exacte pad en een korte video, en neem die tekst over in de review-notities van elke versie.

Het sjabloon dat ik zou gebruiken, pas het aan (haal de zin over het alarm weg als je app er geen heeft):

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

## De 2.5.4-checklist voor je inzending

- De Expo-introspectie toont alleen de gewenste modi, en je kunt voor elk de functie noemen.
- Geen enkele plugin staat in korte vorm gedeclareerd als hij standaard een modus toevoegt, zoals expo-audio.
- Je lokale map `ios/` bewaart geen oude sleutel, of je bouwt vanuit een schone prebuild.
- De functie start snel, zonder verborgen instelling, en de review-notities zeggen welke modus waarvoor dient en hoe je hem test.
- Elke opname vraagt expliciete toestemming en toont een zichtbare indicator. De regels voor toestemmingsverzoeken staan in de gids over [guideline 5.1.1](https://devoria.fr/nl/blog/guideline-5-1-1-app-store-afwijzing-oplossen).
- Bij een wekker gaat het alarm via AlarmKit, niet via geluid dat de app afspeelt.

## Je dossier controleren voor het versturen

De [Review Kit](https://devoria.fr/nl/kits/app-review) bundelt mijn checklist voor het versturen, sjablonen voor notities aan de tester en Claude Code-skills die je project nalopen. Wil je een menselijke blik, [boek dan een uur met mij](https://devoria.fr/nl/coaching): we lezen samen het bericht van Apple en je Info.plist door, via videobellen. De volledige aanpak staat op de pagina [app afgewezen door Apple](https://devoria.fr/nl/expertise/app-afgewezen-door-apple).

Bereid je je eerste release voor? [Doe je gratis diagnose](https://devoria.fr/nl/diagnostic): die zet de stappen op volgorde en stuurt je mijn checklist tegen afwijzingen door Apple.

Niemand kan garanderen dat Apple je app accepteert. Een goed onderbouwde achtergrondmodus verdedig je wel in dertig seconden.

## Veelgestelde vragen

### Wat betekent "Guideline 2.5.4 - Performance - Software Requirements"?

Dat is de titel van de afwijzing als Apple vindt dat een achtergrondmodus in je Info.plist niet voor het bedoelde gebruik dient. Het bericht noemt de modus en stelt voor de functie te laten zien die hem gebruikt of de sleutel te verwijderen.

### Heb je een nieuwe build nodig na een 2.5.4-afwijzing?

Als je een modus verwijdert of wijzigt, ja: de sleutel zit in de Info.plist, dus in de binary. Als de modus terecht is, kan een antwoord met het exacte pad en een video genoeg zijn.

### Mag je de audiomodus houden voor een paar interfacegeluiden?

Nee. Korte geluiden op de voorgrond hebben hem niet nodig. Zet met Expo `enableBackgroundPlayback` op `false` in de expo-audio-plugin.

### Heeft een wekkerapp de audiomodus nodig?

Niet om af te gaan, als hij AlarmKit gebruikt, beschikbaar sinds iOS 26: het systeem speelt het alarm af. Bij Solys dient de modus `audio` voor het nachtluisteren, dat opneemt met vergrendeld scherm.

### Waarom noemt Apple 2.5.4 terwijl ik niets heb gedeclareerd?

Misschien heeft een plugin het voor je gedaan: expo-audio voegt standaard de modus `audio` toe, en een oude map `ios/` kan een sleutel bewaren die uit je configuratie is verwijderd. Controleer het met `npx expo config --type introspect`.


## Je project

[Review Kit](https://devoria.fr/nl/kits/app-review): Mijn App Store-reviewchecklist, mijn opgeloste afwijzingen door Apple, die voor Google Play en drie Claude Code-skills. € 49.

[iOS & Android Kit](https://devoria.fr/nl/kits/ios): Bouw je iPhone- en Android-app met Claude Code: de startcode van mijn apps, de route naar de stores en alle kits. € 99.

[Diagnose: wat staat er tussen jou en je iPhone-app](https://devoria.fr/nl/diagnostic): 7 vragen, 60 seconden: je weet wat je echt tegenhoudt om je iPhone-app te publiceren, je traject in 4 stappen en de kit die bij je past.
