Guideline 2.5.1: öffentliche APIs und aktuelles SDK mit Expo
Von Mehdi Azizi
Veröffentlicht am , 9 Min.
Guideline 2.5.1: nur öffentliche APIs, App läuft auf dem aktuellen iOS, Frameworks nur für ihren Zweck. Mit Expo prüfst du zuerst deine nativen Module.
Die Guideline 2.5.1 stellt vier Anforderungen: nur öffentliche APIs verwenden, auf der aktuellen iOS-Version laufen, aufgeben, was Apple als veraltet markiert, und jedes Framework für seinen vorgesehenen Zweck einsetzen. Mit Expo kommt das Risiko selten aus deinem JavaScript-Code: Es kommt von den nativen Modulen, die du installierst, und vom SDK, mit dem du kompilierst.
Ich veröffentliche Solys, TradaZen und Nolera mit Expo SDK 57. Solys baut auf Apples Screen Time API auf, einem Framework mit streng geregeltem Einsatz. Dieser Guide behandelt die Review-Regel. Für den Fehler, den du beim Hochladen des Builds bekommst, lies den Guide zu ITMS-90338. Für die Hintergrundmodi, die im selben Abschnitt stehen, lies den zur Guideline 2.5.4.
Was besagt die Guideline 2.5.1?
Die Regel steht in Abschnitt 2.5, „Software Requirements“, der App Review Guidelines: „Apps may only use public APIs and must run on the currently shipping OS. Keep your apps up-to-date and make sure you phase out any deprecated features, frameworks or technologies that will no longer be supported in future versions of an OS. Apps should use APIs and frameworks for their intended purposes and indicate that integration in their app description.“
Im Klartext vier Pflichten:
- Nur öffentliche APIs, also solche, die Apple dokumentiert.
- Eine App, die auf der aktuellen iOS-Version läuft, seit September 2026 iOS 27.
- Nichts Veraltetes, das verschwinden wird: Du ersetzt, was Apple als auslaufend ankündigt.
- Jedes Framework an seinem Platz, und in der Beschreibung erwähnt: HomeKit fürs Smart Home, HealthKit für Gesundheit und Sport, verbunden mit der Health-App.
Daher der Titel der Ablehnung: „Guideline 2.5.1 - Performance - Software Requirements“.
Öffentliche APIs: Wo das Risiko in einer Expo-App steckt
Eine private API ist eine Systemfunktion, die Apple nicht dokumentiert. Apple garantiert weder ihr Verhalten noch, dass es sie in der nächsten iOS-Version noch gibt. Deshalb das Verbot.
Dein JavaScript-Code greift nie direkt auf iOS zu: Er läuft über native Module. Die aus dem Expo SDK pflegt das Expo-Team. Die anderen bringen Code mit, den du nicht geschrieben hast, und Apple prüft ihn genauso wie deinen. Der Guide zu ITMS-90683 zeigt denselben Mechanismus bei den Berechtigungstexten: Apple bewertet den Code, der im Build steckt, nicht das, was die App tut.
Bei Solys enthalten am 15. Oktober 2026 42 direkte Abhängigkeiten nativen iOS-Code, davon 14 außerhalb des Expo SDK. Darunter sind RevenueCat, Sentry, AppsFlyer und react-native-device-activity, die Brücke zur Screen Time API.
Eine private API kann zu zwei Zeitpunkten auffallen. Beim Hochladen kann die automatische Analyse von App Store Connect den Fehler ITMS-90338 zurückgeben. Während der Review zitiert der Reviewer die 2.5.1.
Veraltete APIs: von UIWebView bis UIScene
Das bekannteste Beispiel ist UIWebView, die alte Komponente zum Anzeigen von Webinhalten. Apple hat aufgehört, sie zu akzeptieren: bei neuen Apps im April 2020, bei Updates im Dezember 2020. Eine alte Bibliothek, die noch darauf verwies, blockierte den Upload. Bei Solys findet die Suche aus der Checkliste weiter unten keinen Treffer.
Die nächste Änderung ist schon angekündigt. Apples technische Notiz TN3187 schreibt: „In the next major release following iOS 26, UIScene lifecycle will be required when building with the latest SDK; otherwise, your app won't launch.“ Im Klartext: Eine App, die mit dem iOS-27-SDK ohne szenenbasierten Lebenszyklus kompiliert wird, startet nicht.
Drei Daten, die zusammengehören:
- Seit April 2026 verlangt Apple Xcode 26: Darum geht es im Guide zu ITMS-90725.
- Im April 2027 wird laut Apples Upload-Seite das iOS-27-SDK Pflicht.
- Das Expo SDK 58, seit dem 15. September 2026 in der Beta, erzeugt laut Expos Ankündigung bereits die Szenenverwaltung.
Mit Expo SDK 57 und Xcode 26 kompilierst du noch mit dem iOS-26-SDK: Heute geht nichts kaputt. Module, die das AppDelegate verändern, müssen bis April 2027 nachziehen.
Frameworks außerhalb ihres vorgesehenen Zwecks
Der Reviewer prüft, ob ein sensibles Framework einer sichtbaren Funktion dient und ob dein Store-Eintrag sie erwähnt.
- HealthKit ist für Gesundheit und Sport da. Apples Human Interface Guidelines sagen es so: „If your app doesn't provide health and fitness functionality, don't request access to people's private health data.“
- HomeKit ist fürs Smart Home da, für nichts anderes.
- PushKit ist für VoIP-Anrufe da. Die PushKit-Dokumentation ist eindeutig: „If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications.“ Eine VoIP-Benachrichtigung, die die App ohne Anruf aufweckt, ist Zweckentfremdung.
- Family Controls, die Screen Time API, erfordert eine Sonderberechtigung. Ihre Dokumentation stellt klar: „Before submitting your app to the App Store, you must request permission to use the entitlement.“
Für Solys habe ich diese Distributionsberechtigung am 23. September 2026 beantragt, und Apple hat sie noch am selben Tag erteilt. Die Nutzung passt zum Framework: Der Nutzer wählt die Apps aus, die pausiert werden sollen, und Solys sperrt sie nach dem Aufwachen für 30, 45 oder 60 Minuten. Die Beschreibung im Store-Eintrag sagt das in einem Satz: „Solys nutzt Apples Screen-Time-Berechtigung, um die ausgewählten Apps zu pausieren.“ Genau das verlangt das Ende der 2.5.1: die Integration in der Beschreibung erwähnen.
Beta-Versionen: TestFlight ja, App Store nein
Die Release Notes von App Store Connect zeigen die Regel in der Praxis. Am 14. Oktober 2026 werden Builds mit Xcode 27.2 Beta 3 „for internal and external testing“ akzeptiert, also für TestFlight. Am 5. Oktober werden die mit Xcode 27.1 RC „for the App Store“ akzeptiert.
Ein mit einer Xcode-Beta kompilierter Build geht zu TestFlight, nie in die Review. Zum Einreichen brauchst du eine finale Version oder einen RC, den Apple für den App Store freigegeben hat.
Zwei Hinweise für eine Expo-App:
- Eine Expo-Beta ist keine Apple-Beta. Apple prüft die Version von Xcode und dem iOS-SDK, nicht die von Expo. Die Ankündigung des SDK 58 ergänzte, dass EAS-Images mit Xcode 27 bald kommen.
- Testen auf dem aktuellen iOS bleibt Pflicht, auch wenn du mit dem iOS-26-SDK kompilierst. Starte die App per Kaltstart auf einem aktuellen iPhone oder Simulator.
Checkliste: native Abhängigkeiten vor dem Einreichen
Geh sie vor jedem Produktions-Build durch. Die Befehle laufen im Stammverzeichnis des Expo-Projekts:
npx expo-doctor
npx expo install --check
grep -rlw "UIWebView" node_modules --include='*.m' --include='*.mm' --include='*.swift' --include='*.h'
npx expo-doctormeldet keinen Fehlschlag. Bei Solys am 15. Oktober 2026: 20 von 21 Prüfungen bestanden. Der Fehlschlag kam von 13 Expo-Paketen, die einen Patch hinterherhinkten, undnpx expo install --checkgleicht sie an.- Jedes Modul außerhalb des Expo SDK steht im React Native Directory. Expo Doctor macht diese Prüfung standardmäßig, wie die Expo-Dokumentation angibt. Bei einem unbekannten Paket lohnt sich ein Blick in seinen iOS-Code.
- Jedes native Modul hält mit deiner React-Native-Version Schritt. Die Versionstabelle von Expo ordnet SDK 57 React Native 0.86 zu. Ein Modul ohne Release seit mehreren Versionen ist ein Warnsignal.
- Die Suche nach UIWebView liefert nichts. Mach dasselbe für jede API, die Apple als auslaufend ankündigt.
- Jedes sensible Framework hat seine sichtbare Funktion: Gesundheit, Bildschirmzeit, Anrufe, Smart Home. Die Beschreibung erwähnt sie, und die Sonderberechtigung ist erteilt.
- Der Build stammt aus einem finalen Xcode. Prüf die Version in den EAS-Build-Logs.
- Die App startet per Kaltstart auf der aktuellen iOS-Version, mit einem neuen Konto.
- Module, die das AppDelegate anfassen, kündigen UIScene-Unterstützung an, bevor du auf das iOS-27-SDK umsteigst.
Wie antwortest du auf eine 2.5.1-Ablehnung?
Die Nachricht nennt in der Regel die betroffene API oder das Framework. Zwei Fälle:
- Das Framework dient nichts Sichtbarem: Entferne das Modul oder die Capability, erstelle einen neuen Build und antworte in zwei Sätzen.
- Das Framework dient einer echten Funktion: Gib den genauen Weg an, einen Screenshot oder ein kurzes Video, und erwähne die Integration in der Beschreibung des Store-Eintrags.
Ein natives Modul zu entfernen ändert das Binary: Ein Over-the-Air-Update reicht nicht. Der Guide zur Guideline 2.1 erklärt, warum der Reviewer nur den eingebetteten Code sieht. Das Gespräch läuft dann in App Store Connect weiter, wie im Guide zum Antworten an App Review.
Dein Projekt vor dem Hochladen prüfen
Das Review Kit bündelt meine Checkliste vor dem Hochladen, meine behobenen Ablehnungen und Claude-Code-Skills, die dein Expo-Projekt durchsehen. Wenn du einen menschlichen Blick willst, buch eine Stunde mit mir: Wir lesen gemeinsam Apples Nachricht und deine Abhängigkeiten. Das komplette Vorgehen steht auf der Seite App von Apple abgelehnt.
Du bereitest deinen ersten Release vor? Mach deine kostenlose Diagnose: Sie schickt dir meine Checkliste gegen Apple-Ablehnungen.
Häufige Fragen
Was bedeutet „Guideline 2.5.1 - Performance - Software Requirements“?
Das ist der Titel der Ablehnung, wenn Apple der Ansicht ist, dass deine App eine nicht öffentliche API, eine veraltete Technologie oder ein Framework außerhalb seines vorgesehenen Zwecks verwendet. Die Nachricht nennt in der Regel das betroffene Element.
Was ist der Unterschied zwischen der Guideline 2.5.1 und dem Fehler ITMS-90338?
ITMS-90338 ist ein automatischer Fehler beim Hochladen des Builds, wenn die Analyse ein nicht öffentliches Symbol findet. Die 2.5.1 ist die Review-Regel, die ein Mensch anwendet, und sie umfasst auch zweckentfremdete Frameworks und veraltete Technologien.
Kann man eine mit einer Xcode-Beta kompilierte App einreichen?
Nein. App Store Connect akzeptiert diese Builds nur für TestFlight. Für die Review kompilierst du mit einer finalen Xcode-Version oder einem RC, den Apple in seinen Release Notes für den App Store freigegeben hat.
Kann eine Expo-App unwissentlich eine private API verwenden?
Ja, über ein natives Drittanbieter-Modul. Dein JavaScript-Code ruft iOS nicht selbst auf, aber jedes native Paket bringt Objective-C- oder Swift-Code mit. Geh vor jeder Version die Liste der Module außerhalb des Expo SDK durch.
Muss man sofort auf das Expo SDK 58 umsteigen?
Für die 2.5.1 am 15. Oktober 2026 nicht: SDK 57 kompiliert mit dem iOS-26-SDK, das noch akzeptiert wird. Plane das Upgrade vor April 2027 ein, wenn Apple das iOS-27-SDK und den szenenbasierten Lebenszyklus verlangt.

