# Guideline 2.5.1: offentlige API-er og ny SDK med Expo

> Guideline 2.5.1: bare offentlige API-er, støtte for gjeldende iOS og rammeverk brukt riktig. Med Expo sjekker du native-modulene først.

Opprinnelig side: [Guideline 2.5.1: offentlige API-er og ny SDK med Expo](https://devoria.fr/no/blog/guideline-2-5-1-offentlige-api-sdk-expo)
Forfatter: [Mehdi Azizi](https://devoria.fr/no/mehdi-azizi)
Publisert: 2026-11-04
Innhold sist revidert: 2026-11-04


Guideline 2.5.1 stiller fire krav: bruk bare offentlige API-er, kjør på gjeldende iOS-versjon, fas ut det Apple avvikler, og bruk hvert rammeverk til det det er ment for. **Med Expo kommer risikoen sjelden fra JavaScript-koden din: den kommer fra native-modulene du installerer og SDK-en du bygger med.**

Jeg publiserer Solys, TradaZen og Nolera med Expo SDK 57. Solys bygger på Apples Screen Time-API, et rammeverk med regulert bruk. Denne guiden handler om review-regelen. For feilen du får når du sender inn builden, les guiden om [ITMS-90338](https://devoria.fr/no/blog/itms-90338-non-public-api-usage-expo). For bakgrunnsmoduser, som hører til samme del, les guiden om [guideline 2.5.4](https://devoria.fr/no/blog/guideline-2-5-4-bakgrunnsmodus-avvist-apple).

## Hva sier guideline 2.5.1?

Regelen står i del 2.5, «Software Requirements», i [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.»

Kort sagt, fire krav:

1. **Bare offentlige API-er**, altså de Apple dokumenterer.
2. **En app som kjører på gjeldende iOS-versjon**, iOS 27 siden september 2026.
3. **Ingenting avviklet som snart forsvinner**: du erstatter det Apple melder at går ut.
4. **Hvert rammeverk på rett plass, og nevnt i beskrivelsen**: HomeKit for smarthjem, HealthKit for helse og trening, koblet til Helse-appen.

Derav tittelen på avvisningen: «Guideline 2.5.1 - Performance - Software Requirements».

## Offentlige API-er: hvor risikoen gjemmer seg i en Expo-app

Et privat API er en systemfunksjon Apple ikke dokumenterer. Apple garanterer verken hvordan den oppfører seg eller at den finnes i neste iOS-versjon, derfor forbudet.

JavaScript-koden din rører aldri iOS direkte: den går via native-moduler. Modulene i Expo SDK vedlikeholdes av Expo-teamet. **De andre inneholder kode du ikke har skrevet, og Apple vurderer den som om den var din.** Guiden om [ITMS-90683](https://devoria.fr/no/blog/itms-90683-missing-purpose-string-expo) viser samme mekanisme med tillatelsestekster: Apple vurderer koden som ligger i builden, ikke hva appen gjør.

I Solys inneholder 42 direkte avhengigheter native iOS-kode per 15. oktober 2026, og 14 av dem er utenfor Expo SDK. Blant dem finner du RevenueCat, Sentry, AppsFlyer og `react-native-device-activity`, broen til Screen Time-API-et.

Et privat API kan oppdages på to tidspunkter. Ved innsending kan den automatiske analysen i App Store Connect gi feilen ITMS-90338. Under review viser revieweren til 2.5.1.

## Avviklede API-er: fra UIWebView til UIScene

Det mest kjente eksempelet er UIWebView, den gamle komponenten for å vise nettinnhold. Apple [sluttet å godta den](https://developer.apple.com/news/?id=12232019b) i nye apper i april 2020, og deretter i oppdateringer i desember 2020. Et gammelt bibliotek som fortsatt refererte til den, blokkerte innsendingen. I Solys finner søket i sjekklisten lenger ned ingen referanser.

Neste endring er allerede varslet. Apples tekniske notat [TN3187](https://developer.apple.com/documentation/technotes/tn3187-migrating-to-the-uikit-scene-based-life-cycle) sier det rett ut: «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 sagt: en app bygget med iOS 27-SDK-en uten scenebasert livssyklus starter ikke.

Tre datoer å koble sammen:

- **Siden april 2026** krever Apple Xcode 26: det er temaet i guiden om [ITMS-90725](https://devoria.fr/no/blog/itms-90725-sdk-version-issue-expo).
- **I april 2027** blir iOS 27-SDK-en obligatorisk, ifølge [Apples innsendingsside](https://developer.apple.com/app-store/submitting/).
- **Expo SDK 58**, i beta siden 15. september 2026, genererer allerede scenehåndteringen, ifølge [Expos kunngjøring](https://expo.dev/changelog/sdk-58-beta).

Med Expo SDK 57 og Xcode 26 bygger du fortsatt med iOS 26-SDK-en: ingenting knekker i dag. **Moduler som endrer AppDelegate, må følge etter før april 2027.**

## Rammeverk brukt til noe annet enn tiltenkt

Revieweren sjekker at et sensitivt rammeverk brukes til en synlig funksjon, og at App Store-siden din nevner den.

- **HealthKit** er for helse og trening. [Apples grensesnittretningslinjer](https://developer.apple.com/design/human-interface-guidelines/healthkit) sier det: «If your app doesn't provide health and fitness functionality, don't request access to people's private health data.»
- **HomeKit** er for smarthjem, og ingenting annet.
- **PushKit** er for taleanrop over IP. [Dokumentasjonen for PushKit](https://developer.apple.com/documentation/pushkit/responding-to-voip-notifications-from-pushkit) er klar: «If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications.» En VoIP-varsling som vekker appen uten et anrop, er misbruk.
- **Family Controls**, Screen Time-API-et, krever en spesiell tillatelse. [Dokumentasjonen](https://developer.apple.com/documentation/familycontrols) presiserer: «Before submitting your app to the App Store, you must request permission to use the entitlement.»

For Solys søkte jeg om denne distribusjonstillatelsen 23. september 2026, og Apple innvilget den samme dag. Bruken passer rammeverket: brukeren velger hvilke apper som skal settes på pause, og Solys blokkerer dem i 30, 45 eller 60 minutter etter at man har våknet. Beskrivelsen på App Store-siden sier det i én setning: «Solys bruker Apples Screen Time-tillatelse til å sette valgte apper på pause.» **Det er dette slutten av 2.5.1 krever: at integrasjonen nevnes i beskrivelsen.**

## Betaversjoner: TestFlight ja, App Store nei

[Utgivelsesnotatene for App Store Connect](https://developer.apple.com/help/app-store-connect/release-notes/) viser regelen i praksis. 14. oktober 2026 godtas builds laget med Xcode 27.2 beta 3 «for internal and external testing», altså for TestFlight. 5. oktober godtas builds fra Xcode 27.1 RC «for the App Store».

**En build laget med en Xcode-beta går til TestFlight, aldri til review.** For å sende inn trenger du en endelig versjon, eller en RC som Apple har åpnet for App Store.

To presiseringer for en Expo-app:

- **En Expo-beta er ikke en Apple-beta.** Apple kontrollerer versjonen av Xcode og iOS-SDK-en, ikke Expo-versjonen. Kunngjøringen av SDK 58 la til at EAS-images med Xcode 27 kommer snart.
- **Testing på gjeldende iOS er fortsatt obligatorisk**, selv om du bygger med iOS 26-SDK-en. Kaldstart appen på en oppdatert iPhone eller simulator.

## Sjekkliste: native avhengigheter før innsending

Gå gjennom den før hver produksjonsbuild. Kommandoene kjøres fra rotmappen til Expo-prosjektet:

```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` melder ingen feil.** I Solys 15. oktober 2026: 20 av 21 kontroller bestått. Feilen kom fra 13 Expo-pakker som lå én patch bak, og som `npx expo install --check` retter opp.
2. **Hver modul utenfor Expo SDK står i React Native Directory.** Expo Doctor gjør denne kontrollen som standard, ifølge [Expos dokumentasjon](https://docs.expo.dev/versions/latest/config/package-json/). En ukjent pakke fortjener en gjennomlesning av iOS-koden.
3. **Hver native-modul følger React Native-versjonen din.** [Expos versjonstabell](https://docs.expo.dev/versions/latest/) knytter SDK 57 til React Native 0.86. En modul uten ny utgivelse på flere versjoner er et varseltegn.
4. **Søket etter UIWebView gir ingen treff.** Gjør det samme for alle API-er Apple melder at går ut.
5. **Hvert sensitivt rammeverk har sin synlige funksjon**: helse, Screen Time, anrop, hjem. Beskrivelsen nevner den, og den spesielle tillatelsen er innvilget.
6. **Builden kommer fra en endelig Xcode.** Sjekk versjonen i EAS-byggeloggene.
7. **Appen kaldstarter på gjeldende iOS-versjon**, med en ny konto.
8. **Moduler som berører AppDelegate, melder støtte for UIScene** før du går over til iOS 27-SDK-en.

## Hvordan svarer du på en 2.5.1-avvisning?

Meldingen nevner som regel API-et eller rammeverket det gjelder. To tilfeller:

- **Rammeverket brukes ikke til noe synlig**: fjern modulen eller capability-en, lag en ny build, og svar med to setninger.
- **Rammeverket brukes til en ekte funksjon**: oppgi nøyaktig vei dit, et skjermbilde eller en kort video, og nevn integrasjonen i beskrivelsen på App Store-siden.

**Å fjerne en native-modul endrer binærfilen: en fjernoppdatering er ikke nok.** Guiden om [guideline 2.1](https://devoria.fr/no/blog/guideline-2-1-app-store-avvisning) forklarer hvorfor revieweren bare ser koden som er bygget inn. Samtalen foregår deretter i App Store Connect, som i guiden om å [svare App Review](https://devoria.fr/no/blog/resolution-center-apple-svar-avslag-app-review).

## Sjekk prosjektet ditt før innsending

[Review Kit](https://devoria.fr/no/kits/app-review) samler sjekklisten min før innsending, avvisningene jeg har rettet, og Claude Code-skills som går gjennom Expo-prosjektet ditt. Vil du ha et menneskelig blikk, [book en time med meg](https://devoria.fr/no/coaching): vi leser Apples melding og avhengighetene dine sammen. Hele fremgangsmåten finner du på siden [app avvist av Apple](https://devoria.fr/no/expertise/app-avvist-av-apple).

Forbereder du din første lansering? [Ta den gratis diagnosen](https://devoria.fr/no/diagnostic): den sender deg sjekklisten min mot avvisninger fra Apple.

## Ofte stilte spørsmål

### Hva betyr «Guideline 2.5.1 - Performance - Software Requirements»?

Det er tittelen på avvisningen når Apple mener at appen din bruker et ikke-offentlig API, en avviklet teknologi eller et rammeverk til noe annet enn tiltenkt. Meldingen nevner som regel hva det gjelder.

### Hva er forskjellen på guideline 2.5.1 og feilen ITMS-90338?

ITMS-90338 er en automatisk feil du får når du sender inn builden, når analysen finner et ikke-offentlig symbol. 2.5.1 er review-regelen som håndheves av et menneske, og som også dekker misbrukte rammeverk og avviklede teknologier.

### Kan du sende inn en app bygget med en Xcode-beta?

Nei. App Store Connect godtar slike builds bare for TestFlight. For review bygger du med en endelig Xcode-versjon, eller en RC som Apple har åpnet for App Store i utgivelsesnotatene sine.

### Kan en Expo-app bruke et privat API uten at du vet det?

Ja, via en tredjeparts native-modul. JavaScript-koden din kaller ikke iOS selv, men hver native-pakke inneholder Objective-C- eller Swift-kode. Gå gjennom listen over moduler utenfor Expo SDK før hver versjon.

### Bør du gå over til Expo SDK 58 med en gang?

Ikke for 2.5.1 per 15. oktober 2026: SDK 57 bygger med iOS 26-SDK-en, som fortsatt godtas. Planlegg oppgraderingen før april 2027, når Apple krever iOS 27-SDK-en og scenebasert livssyklus.


## Prosjektet ditt

[Review Kit](https://devoria.fr/no/kits/app-review): Sjekklisten min for App Store-gjennomgang, Apples avslag på appene mine med rettelser, sjekklisten for Google Play og tre Claude Code-skills. 499 kr.

[iOS & Android Kit](https://devoria.fr/no/kits/ios): Lag din iPhone- og Android-app med Claude Code: startkoden fra appene mine, veien helt til butikkene og alle kitene. 999 kr.

[Diagnose: dette står mellom deg og iPhone-appen din](https://devoria.fr/no/diagnostic): 7 spørsmål, 60 sekunder: du får vite hva som egentlig hindrer deg i å publisere iPhone-appen din, veien din i 4 steg og kitet som passer deg.
