Guideline 2.5.4: achtergrondmodus afgewezen door Apple
Door Mehdi Azizi
Gepubliceerd op , 9 min
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.
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.
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: "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 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
audiobedoeld 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). - Locatie: in een thread van december 2024 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 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 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:
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
Andere pakketten voegen op hun eigen manier een modus toe. De optie isIosBackgroundLocationEnabled van expo-location voegt location alleen toe als je hem aanzet. expo-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:
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 rekent zulke wijzigingen tot de wijzigingen die een nieuwe binary vereisen, net als bij ITMS-90683.
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). 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:
- 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.
- 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
audiotoe.
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 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 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.
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. 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):
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.
- Bij een wekker gaat het alarm via AlarmKit, niet via geluid dat de app afspeelt.
Je dossier controleren voor het versturen
De Review Kit 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: 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.
Bereid je je eerste release voor? Doe je gratis diagnose: 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.

