# Guideline 2.5.1: publieke API's en actuele SDK met Expo

> Guideline 2.5.1: alleen publieke API's, compatibel met de huidige iOS, frameworks voor hun bedoelde gebruik. Met Expo check je eerst je native modules.

Originele pagina: [Guideline 2.5.1: publieke API's en actuele SDK met Expo](https://devoria.fr/nl/blog/guideline-2-5-1-publieke-api-sdk-expo)
Auteur: [Mehdi Azizi](https://devoria.fr/nl/mehdi-azizi)
Publicatie: 2026-11-04
Laatste inhoudsrevisie: 2026-11-04


Guideline 2.5.1 stelt vier eisen: alleen publieke API's gebruiken, draaien op de huidige iOS-versie, afstappen van wat Apple als verouderd markeert en elk framework gebruiken waarvoor het bedoeld is. **Met Expo zit het risico zelden in je JavaScript-code: het zit in de native modules die je installeert en in de SDK waarmee je compileert.**

Ik publiceer Solys, TradaZen en Nolera met Expo SDK 57. Solys leunt op Apples Screen Time API, een framework met streng afgebakend gebruik. Deze gids gaat over de reviewregel. Voor de foutmelding die je krijgt bij het uploaden van de build lees je de gids over [ITMS-90338](https://devoria.fr/nl/blog/itms-90338-non-public-api-usage-expo). Voor achtergrondmodi, die in hetzelfde deel staan, lees je de gids over [guideline 2.5.4](https://devoria.fr/nl/blog/guideline-2-5-4-achtergrondmodus-afgewezen-apple).

## Wat zegt guideline 2.5.1?

De regel staat in deel 2.5, "Software Requirements", van de [App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/#2.5.1): "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."

Concreet zijn dat vier verplichtingen:

1. **Alleen publieke API's**, dus API's die Apple documenteert.
2. **Een app die draait op de huidige iOS-versie**, sinds september 2026 is dat iOS 27.
3. **Niets verouderds dat gaat verdwijnen**: je vervangt wat Apple als end-of-life aankondigt.
4. **Elk framework op zijn plek, en genoemd in de beschrijving**: HomeKit voor de slimme woning, HealthKit voor gezondheid en sport, gekoppeld aan de Gezondheid-app.

Vandaar de titel van de afwijzing: "Guideline 2.5.1 - Performance - Software Requirements".

## Publieke API's: waar het risico zit in een Expo-app

Een private API is een systeemfunctie die Apple niet documenteert. Apple garandeert niet hoe die zich gedraagt en ook niet dat hij in de volgende iOS-versie nog bestaat. Daarom is het verboden.

Je JavaScript-code raakt iOS nooit direct: alles loopt via native modules. Die van de Expo SDK worden onderhouden door het Expo-team. **De andere bevatten code die jij niet hebt geschreven, en Apple beoordeelt die net als je eigen code.** De gids over [ITMS-90683](https://devoria.fr/nl/blog/itms-90683-missing-purpose-string-expo) laat hetzelfde mechanisme zien met toestemmingsteksten: Apple beoordeelt de code die in de build zit, niet wat de app doet.

Bij Solys bevatten op 15 oktober 2026 42 directe dependencies native iOS-code, waarvan 14 buiten de Expo SDK. Daaronder RevenueCat, Sentry, AppsFlyer en `react-native-device-activity`, de brug naar de Screen Time API.

Een private API kan op twee momenten opvallen. Bij het uploaden kan de automatische analyse van App Store Connect de fout ITMS-90338 teruggeven. Tijdens de review noemt de reviewer guideline 2.5.1.

## Verouderde API's: van UIWebView naar UIScene

Het bekendste voorbeeld is UIWebView, het oude component om webcontent te tonen. Apple [accepteerde het niet meer](https://developer.apple.com/news/?id=12232019b) in nieuwe apps vanaf april 2020, en in updates vanaf december 2020. Een oude library die er nog naar verwees, blokkeerde de upload. Bij Solys vindt de zoekopdracht uit de checklist hieronder geen enkele verwijzing.

De volgende verandering is al aangekondigd. Apples technische notitie [TN3187](https://developer.apple.com/documentation/technotes/tn3187-migrating-to-the-uikit-scene-based-life-cycle) zegt het zo: "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." Kort gezegd: een app die je compileert met de iOS 27 SDK zonder scene-gebaseerde levenscyclus, start niet.

Drie data die met elkaar samenhangen:

- **Sinds april 2026** eist Apple Xcode 26: daarover gaat de gids over [ITMS-90725](https://devoria.fr/nl/blog/itms-90725-sdk-version-issue-expo).
- **In april 2027** wordt de iOS 27 SDK verplicht, volgens de [uploadpagina van Apple](https://developer.apple.com/app-store/submitting/).
- **Expo SDK 58**, in bèta sinds 15 september 2026, genereert al de scene-afhandeling, volgens de [aankondiging van Expo](https://expo.dev/changelog/sdk-58-beta).

Met Expo SDK 57 en Xcode 26 compileer je nog met de iOS 26 SDK: vandaag gaat er niets stuk. **Modules die de AppDelegate aanpassen, moeten vóór april 2027 mee.**

## Frameworks gebruikt buiten hun bedoelde doel

De reviewer controleert of een gevoelig framework een zichtbare functie dient, en of je productpagina die noemt.

- **HealthKit** is voor gezondheid en sport. Apples [interfacerichtlijnen](https://developer.apple.com/design/human-interface-guidelines/healthkit) zeggen het: "If your app doesn't provide health and fitness functionality, don't request access to people's private health data."
- **HomeKit** is voor de slimme woning, en voor niets anders.
- **PushKit** is voor bellen via voice over IP. De [documentatie van PushKit](https://developer.apple.com/documentation/pushkit/responding-to-voip-notifications-from-pushkit) is duidelijk: "If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications." Een VoIP-notificatie die de app wekt zonder gesprek is misbruik.
- **Family Controls**, de Screen Time API, vereist een speciale toestemming. De [documentatie](https://developer.apple.com/documentation/familycontrols) zegt: "Before submitting your app to the App Store, you must request permission to use the entitlement."

Voor Solys heb ik die distributietoestemming op 23 september 2026 aangevraagd, en Apple gaf hem dezelfde dag. Het gebruik past bij het framework: de gebruiker kiest welke apps gepauzeerd worden, en Solys blokkeert ze 30, 45 of 60 minuten na het wakker worden. De beschrijving op de productpagina zegt het in één zin: "Solys gebruikt Apples Screen Time-toestemming om de geselecteerde apps te pauzeren." **Dat is precies wat het einde van 2.5.1 vraagt: de integratie noemen in de beschrijving.**

## Bètaversies: TestFlight ja, App Store nee

De [release notes van App Store Connect](https://developer.apple.com/help/app-store-connect/release-notes/) laten de regel in de praktijk zien. Op 14 oktober 2026 worden builds gemaakt met Xcode 27.2 bèta 3 geaccepteerd "for internal and external testing", dus voor TestFlight. Op 5 oktober worden die van Xcode 27.1 RC geaccepteerd "for the App Store".

**Een build gecompileerd met een bèta van Xcode gaat naar TestFlight, nooit naar review.** Om in te dienen heb je een definitieve versie nodig, of een RC die Apple voor de App Store heeft opengezet.

Twee kanttekeningen voor een Expo-app:

- **Een bèta van Expo is geen bèta van Apple.** Apple controleert de versie van Xcode en de iOS SDK, niet die van Expo. De aankondiging van SDK 58 meldde wel dat EAS-images met Xcode 27 binnenkort zouden komen.
- **Testen op de huidige iOS blijft verplicht**, ook als je compileert met de iOS 26 SDK. Start de app koud op een bijgewerkte iPhone of simulator.

## Checklist: native dependencies vóór het indienen

Loop hem door vóór elke productiebuild. Je draait de commando's in de root van het Expo-project:

```bash
npx expo-doctor
npx expo install --check
grep -rlw "UIWebView" node_modules --include='*.m' --include='*.mm' --include='*.swift' --include='*.h'
```

1. **`npx expo-doctor` meldt geen fouten.** Bij Solys op 15 oktober 2026: 20 van de 21 checks geslaagd. De fout kwam door 13 Expo-pakketten die een patch achterliepen, en `npx expo install --check` trekt die gelijk.
2. **Elke module buiten de Expo SDK staat in React Native Directory.** Expo Doctor doet die check standaard, zoals de [documentatie van Expo](https://docs.expo.dev/versions/latest/config/package-json/) aangeeft. Bij een onbekend pakket is het de moeite waard om de iOS-code te lezen.
3. **Elke native module volgt jouw React Native-versie.** De [versietabel van Expo](https://docs.expo.dev/versions/latest/) koppelt SDK 57 aan React Native 0.86. Een module zonder release in meerdere versies is een signaal.
4. **De zoekopdracht naar UIWebView levert niets op.** Doe hetzelfde voor elke API die Apple als end-of-life aankondigt.
5. **Elk gevoelig framework heeft een zichtbare functie**: gezondheid, Screen Time, bellen, woning. De beschrijving noemt die, en de speciale toestemming is verleend.
6. **De build komt uit een definitieve Xcode.** Controleer de versie in de EAS-buildlogs.
7. **De app start koud op de huidige iOS-versie**, met een nieuw account.
8. **Modules die de AppDelegate raken, ondersteunen UIScene** voordat je overstapt op de iOS 27 SDK.

## Hoe reageer je op een afwijzing onder 2.5.1?

Het bericht noemt meestal de API of het framework in kwestie. Twee gevallen:

- **Het framework dient geen zichtbare functie**: verwijder de module of de capability, maak een nieuwe build en antwoord in twee zinnen.
- **Het framework dient een echte functie**: geef het exacte pad, een screenshot of een korte video, en noem de integratie in de beschrijving van de productpagina.

**Een native module verwijderen verandert de binary: een update op afstand is niet genoeg.** De gids over [guideline 2.1](https://devoria.fr/nl/blog/guideline-2-1-app-store-afwijzing-oplossen) legt uit waarom de reviewer alleen de meegeleverde code ziet. Het gesprek loopt daarna via App Store Connect, zoals in de gids om [te antwoorden aan App Review](https://devoria.fr/nl/blog/apple-resolution-center-reageren-afwijzing-app-review).

## Je project controleren vóór het uploaden

De [Review Kit](https://devoria.fr/nl/kits/app-review) bundelt mijn checklist voor het uploaden, mijn opgeloste afwijzingen en Claude Code-skills die je Expo-project nalopen. Wil je dat een mens meekijkt? [Boek een uur met mij](https://devoria.fr/nl/coaching): samen lezen we het bericht van Apple en je dependencies. 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): je krijgt mijn checklist tegen afwijzingen door Apple.

## Veelgestelde vragen

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

Dat is de titel van de afwijzing als Apple vindt dat je app een niet-publieke API, een verouderde technologie of een framework buiten het bedoelde gebruik inzet. Het bericht noemt meestal het onderdeel in kwestie.

### Wat is het verschil tussen guideline 2.5.1 en de fout ITMS-90338?

ITMS-90338 is een automatische fout die je krijgt bij het uploaden van de build, als de analyse een niet-publiek symbool vindt. 2.5.1 is de reviewregel die een mens toepast, en die ook misbruikte frameworks en verouderde technologieën dekt.

### Kun je een app indienen die met een bèta van Xcode is gecompileerd?

Nee. App Store Connect accepteert die builds alleen voor TestFlight. Voor de review compileer je met een definitieve Xcode-versie, of met een RC die Apple in zijn release notes voor de App Store heeft opengezet.

### Kan een Expo-app ongemerkt een private API gebruiken?

Ja, via een native module van derden. Je JavaScript-code roept iOS niet zelf aan, maar elk native pakket bevat Objective-C- of Swift-code. Bekijk de lijst met modules buiten de Expo SDK vóór elke versie.

### Moet je meteen overstappen op Expo SDK 58?

Niet voor 2.5.1 op 15 oktober 2026: SDK 57 compileert met de iOS 26 SDK, die nog geaccepteerd wordt. Plan de upgrade vóór april 2027, wanneer Apple de iOS 27 SDK en de scene-gebaseerde levenscyclus gaat eisen.


## 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.
