Guideline 2.5.4: Apple lehnt Hintergrundmodus ab
Von Mehdi Azizi
Veröffentlicht am , 9 Min.
Guideline 2.5.4: Apple lehnt einen Hintergrundmodus ohne passende Funktion ab. Entferne den Schlüssel oder zeig dem Reviewer Ton, Standort oder Anruf.
Die Guideline 2.5.4 beschränkt Hintergrundmodi auf ihren vorgesehenen Zweck: Ton, Standort, VoIP-Anrufe, Abschluss von Aufgaben, lokale Benachrichtigungen. Die Ablehnung kommt, wenn deine Info.plist einen dieser Modi deklariert und der Reviewer keine Funktion findet, die ihn braucht. Entferne den Schlüssel, wenn nichts ihn nutzt, sonst zeig dem Reviewer die Funktion in dreißig Sekunden.
Ich veröffentliche meine eigenen iOS-Apps mit Expo. Solys, mein Wecker mit Minispielen, deklariert den Audiomodus: Ich habe ihn entfernt und dann aus einem anderen Grund wieder hinzugefügt. Dieser Guide stützt sich auf Apples Text, auf veröffentlichte Ablehnungen anderer Entwickler und auf meine Projekte. Den Überblick über alle Ablehnungsgründe findest du unter warum Apple eine App ablehnt.
Was sagt die Guideline 2.5.4?
Die Regel passt in einen Satz, in Abschnitt 2 „Performance“, Teil 2.5 „Software Requirements“ der App Review Guidelines: „Multitasking apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc.“
Im Klartext: Ein Hintergrunddienst dient nur dem, wofür er existiert. Daher der Titel „Guideline 2.5.4 - Performance - Software Requirements“.
Standardmäßig wird eine App im Hintergrund angehalten. Um weiterzulaufen, deklariert sie einen oder mehrere Modi im Schlüssel UIBackgroundModes ihrer Info.plist. Die Dokumentation von Apple zu Hintergrundmodi verlangt, sie wegen des Akkus sparsam einzusetzen und eine andere Lösung zu bevorzugen, wenn es eine gibt. Jeder deklarierte Modus ist ein Versprechen, das der Reviewer überprüfen kann.
Die Hintergrundmodi und ihr vorgesehener Zweck
| Modus | Schlüssel | Vorgesehener Zweck |
|---|---|---|
| Audio, AirPlay, PiP | audio | Hörbarer Ton im Hintergrund |
| Standort | location | Kontinuierlicher Standort |
| Voice over IP | voip | Anrufe mit CallKit |
| Abruf | fetch | Regelmäßige Netzinhalte |
| Verarbeitung | processing | Geplante Aufgaben |
| Remote-Benachrichtigungen | remote-notification | Push für neue Inhalte |
Diese Tabelle fasst Apples Seite zusammen. In den Ablehnungen, die in Foren veröffentlicht werden, tauchen audio, location und voip am häufigsten auf.
Was bedeutet die Ablehnungsnachricht 2.5.4?
Die Nachricht nennt den betroffenen Modus. Zwei Beispiele, die Entwickler in Apples Foren veröffentlicht haben:
- 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.“ Weiter heißt es, dass der Schlüssel
audiofür Apps gedacht ist, die im Hintergrund Inhalte hörbar abspielen, etwa einen Musikplayer. Es gibt zwei Auswege: diesen Inhalt hinzufügen oder den Schlüssel entfernen (Forenthread). - Standort: In einem Thread vom Dezember 2024 fand Apple außer der Mitarbeiterverfolgung keine Funktion, die einen dauerhaften Standort braucht, und schrieb, dass diese Nutzung allein nicht angemessen ist.
Meine Lesart: Der Reviewer liest nicht deinen Code, er sucht eine Funktion. Er muss sie starten, die App in den Hintergrund schicken und sehen können, dass sie weiterläuft.
Den umgekehrten Fall gibt es auch. In einem Thread vom Mai 2026 wurde eine Vorlese-App, die den Modus audio wirklich nutzte, mehrfach abgelehnt: Der Reviewer schaffte es nicht, den Ton auszulösen. Ein anderer Entwickler schreibt dort, seiner Meinung nach habe ein angehängtes Video seinen Fall gelöst. Das ist ein Erfahrungsbericht, keine Regel von Apple.
Woher kommt der Schlüssel, wenn du ihn nicht hinzugefügt hast?
Bei Expo füllen die Config-Plugins die Info.plist beim Prebuild. Ein Hintergrundmodus kann also in dein Binary gelangen, ohne dass du es entschieden hast.
Das Plugin expo-audio mit Standardeinstellung
Die Dokumentation von expo-audio sagt es: Die Option enableBackgroundPlayback steht standardmäßig auf true und fügt unter iOS den Modus audio hinzu. Das Plugin in seiner Kurzform "expo-audio" zu deklarieren reicht also schon, um den Modus zu deklarieren.
Genau das habe ich gefunden, als ich TradaZen vor der ersten Einreichung durchgesehen habe: kurze UI-Sounds im Vordergrund, aber ein Plugin in Kurzform. Die Korrektur steckt in app.json:
{
"expo": {
"plugins": [["expo-audio", { "enableBackgroundPlayback": false }]]
}
}
Andere Pakete fügen auf ihre Weise einen Modus hinzu. Die Option isIosBackgroundLocationEnabled von expo-location fügt location nur hinzu, wenn du sie aktivierst. expo-background-task dagegen fügt processing beim Prebuild hinzu, sobald es installiert ist.
Der Ordner ios/, der den alten Schlüssel behält
Die zweite Falle habe ich im Juli 2026 bei Solys erlebt. Ich hatte audio aus app.json entfernt, aber der Schlüssel blieb in ios/Solys/Info.plist, das vorher generiert worden war. Ein Prebuild ohne --clean ändert dieses Projekt, statt es neu zu erstellen, und das Plugin fügt den Schlüssel hinzu, ohne ihn je zu entfernen. Ein lokaler Build hätte ihn mitgenommen. Ein EAS-Build in der Cloud startet mit einem frischen Prebuild, wenn ios/ von git ignoriert wird, und das war bei mir der Fall.
Vor jedem Build prüfe ich, was wirklich rausgeht:
npx expo config --type introspect --json | grep -o '"UIBackgroundModes":\[[^]]*\]'
npx expo prebuild --clean --platform ios
Der erste Befehl listet die Modi, die der Prebuild in die Info.plist schreibt. Der zweite erstellt das native Projekt für einen lokalen Build neu und löscht dabei den Ordner ios/. Bei Solys zeigt der erste "UIBackgroundModes":["audio"] an, bei TradaZen nichts: Beides ist so gewollt.
Einen Modus hinzuzufügen oder zu entfernen ändert die Info.plist, also das Binary: Du brauchst einen neuen Build, ein Remote-Update reicht nicht. Die Dokumentation von EAS Update zählt diese Änderungen zu denen, die ein neues Binary erfordern, genau wie bei ITMS-90683.
Solys: ein deklarierter Audiomodus mit echtem Grund
Solys ist ein Wecker, aber der Modus audio dient nicht dazu, den Alarm klingeln zu lassen: Der Klingelton läuft über AlarmKit, Apples Alarmdienst, verfügbar seit iOS 26 (AlarmKit-Dokumentation). Es klingelt das System, auch im Lautlos-Modus, nicht die App.
Die Geschichte des Schlüssels, weil die Überlegung mehr zählt als die Zeile:
- Ende Juli 2026 entferne ich ihn. Nichts spielte im Hintergrund Ton ab: Die Soundeffekte der Minispiele bleiben im Vordergrund, und der Alarm hängt nicht von der App ab.
- Zwei Tage später füge ich ihn wieder hinzu, mit der Nachtaufnahme. Diese Option nimmt die Geräusche deiner Nacht mit dem Mikrofon auf und analysiert sie auf dem iPhone. Die Aufnahme muss bei gesperrtem Bildschirm weiterlaufen, und laut der Dokumentation von expo-audio fügt auch die Option für Aufnahmen im Hintergrund den Modus
audiohinzu.
Die Begründung hat sich grundlegend geändert: Der Modus dient zum Aufnehmen, nicht zum Abspielen. Drei Schutzmaßnahmen, sichtbar in der App:
- Die Aufnahme ist eine Option, standardmäßig aus, die man in den Einstellungen oder im Abendritual aktiviert;
- sie hat einen eigenen Einwilligungsbildschirm, wie es die Regel 2.5.14 für jede Aufnahme verlangt, und nichts verlässt das Handy;
- das Mikrofon schließt sich zehn Minuten vor dem Alarm, damit sich Aufnahme und Klingelton nie in die Quere kommen.
Ich kann nicht garantieren, dass ein Reviewer diese Deklaration immer akzeptiert. Ich kann für jedes Element sagen, wozu es dient und wo man es sieht.
Wecker, die die App wach hielten
Vor AlarmKit konnte eine Wecker-App von Drittanbietern nicht wie Apples Alarm klingeln. Manche Bibliotheken hielten die App deshalb wach: Die Dokumentation des Flutter-Pakets alarm2 beschreibt einen stillen Audioplayer, der bis zum Alarm läuft. Ein stummer Ton ist aber nicht hörbar. Seit iOS 26 macht AlarmKit diesen Umweg überflüssig.
Modus behalten oder entfernen: die Entscheidungstabelle
| Deine Situation | Was tun |
|---|---|
| Kurze Sounds im Vordergrund | audio entfernen |
| Musik oder Hörbuch | Behalten, zeigen |
| Lange Aufnahme | Behalten + Einwilligung |
| Wecker oder Timer | AlarmKit (iOS 26) |
| Gelegentlicher Standort | Signifikante Standortänderungen |
| Sync ohne Eile | fetch oder processing |
| Audio- oder Videoanrufe | voip mit CallKit |
Für den Standort nennt Apples Seite den Dienst für signifikante Standortänderungen als Alternative zum Modus location.
Die anderen Absätze von 2.5: 2.5.1 und 2.5.2
2.5.1: öffentliche APIs und Frameworks am richtigen Platz
„Apps may only use public APIs and must run on the currently shipping OS.“ Die App nutzt nur öffentliche APIs, läuft auf der aktuellen Systemversion und verzichtet auf Veraltetes. Wie bei 2.5.4 dient jedes Framework seinem vorgesehenen Zweck, der in der Beschreibung erwähnt wird: HealthKit für Gesundheit, HomeKit für das Smart Home. Wenn eine Bibliothek eine private API aufruft, bekommt deine App die Ablehnung.
2.5.2: kein heruntergeladener Code, der die App verändert
Die App bleibt in ihrem Paket eigenständig. Sie darf keinen Code „download, install, or execute code which introduces or changes features or functionality of the app“. Nur Lern-Apps, die Programmieren beibringen, haben eine begrenzte Ausnahme, mit Code, den der Nutzer vollständig sehen und ändern kann.
Bei Expo betrifft das EAS Update, dessen Dokumentation daran erinnert, dass Updates die App-Store-Regeln einhalten müssen. Nutze Remote-Updates zum Korrigieren, nie um eine Funktion auszuliefern, die der Reviewer nicht gesehen hat. Eine Korrektur im Zusammenhang mit dem Review läuft über einen neuen Build, wie ich im Guide zur Guideline 2.1 erkläre.
Wie antwortest du auf eine Ablehnung nach 2.5.4?
Die Unterhaltung findet im Bereich App Review deiner App statt, wo du auf die Nachricht von App Review antwortest. Zwei Fälle:
- Der Modus wird nicht gebraucht: Entferne ihn, mach einen neuen Build, prüfe die Introspektion und antworte dann in zwei Sätzen.
- Der Modus dient einer echten Funktion: Antworte mit dem genauen Weg und einem kurzen Video und übernimm diesen Text in die Review-Notizen jeder Version.
Die Vorlage, die ich verwenden würde, zum Anpassen (streich den Satz zum Alarm, wenn deine App keinen hat):
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,
Die Checkliste 2.5.4 vor der Einreichung
- Die Expo-Introspektion zeigt nur die gewollten Modi, und du kannst für jeden die Funktion nennen.
- Kein Plugin ist in Kurzform deklariert, wenn es standardmäßig einen Modus hinzufügt, wie expo-audio.
- Dein lokaler Ordner
ios/enthält keinen alten Schlüssel mehr, oder du baust aus einem sauberen Prebuild. - Die Funktion lässt sich schnell auslösen, ohne versteckte Einstellung, und die Review-Notizen sagen, welcher Modus wozu dient und wie man ihn testet.
- Jede Aufnahme verlangt eine ausdrückliche Einwilligung und zeigt einen sichtbaren Hinweis. Die Regeln zu Berechtigungsanfragen stehen im Guide zur Guideline 5.1.1.
- Bei einem Wecker läuft der Klingelton über AlarmKit, nicht über einen Ton, den die App abspielt.
Deine Unterlagen vor dem Einreichen prüfen
Das Review Kit enthält meine Checkliste vor dem Einreichen, Vorlagen für Notizen an den Tester und Claude-Code-Skills, die dein Projekt durchsehen. Wenn du einen menschlichen Blick willst, buch eine Stunde mit mir: Wir lesen Apples Nachricht und deine Info.plist gemeinsam per Videocall. Das komplette Vorgehen steht auf der Seite von Apple abgelehnte App.
Du bereitest deine erste Veröffentlichung vor? Mach deine kostenlose Diagnose: Sie bringt die Schritte in die richtige Reihenfolge und schickt dir meine Checkliste gegen Apple-Ablehnungen.
Niemand kann garantieren, dass Apple deine App akzeptiert. Ein gut begründeter Hintergrundmodus lässt sich aber in dreißig Sekunden verteidigen.
Häufige Fragen
Was bedeutet „Guideline 2.5.4 - Performance - Software Requirements“?
Das ist der Titel der Ablehnung, wenn Apple meint, dass ein Hintergrundmodus in deiner Info.plist nicht seinem vorgesehenen Zweck dient. Die Nachricht nennt den Modus und schlägt vor, die Funktion zu zeigen, die ihn nutzt, oder den Schlüssel zu entfernen.
Brauche ich nach einer Ablehnung nach 2.5.4 einen neuen Build?
Wenn du einen Modus entfernst oder änderst, ja: Der Schlüssel steht in der Info.plist, also im Binary. Wenn der Modus begründet ist, kann eine Antwort mit dem genauen Weg und einem Video reichen.
Kann ich den Audiomodus für ein paar UI-Sounds behalten?
Nein. Kurze Sounds im Vordergrund brauchen ihn nicht. Setz bei Expo enableBackgroundPlayback im Plugin expo-audio auf false.
Braucht eine Wecker-App den Audiomodus?
Nicht zum Klingeln, wenn sie auf AlarmKit setzt, verfügbar seit iOS 26: Das System spielt den Alarm ab. Bei Solys dient der Modus audio der Nachtaufnahme, die bei gesperrtem Bildschirm aufnimmt.
Warum nennt Apple 2.5.4, obwohl ich nichts deklariert habe?
Vielleicht hat ein Plugin das für dich erledigt: expo-audio fügt standardmäßig den Modus audio hinzu, und ein alter Ordner ios/ kann einen Schlüssel behalten, den du aus deiner Konfiguration entfernt hast. Prüf es mit npx expo config --type introspect.

