# Guideline 2.5.1: offentlige API'er og opdateret SDK med Expo

> Guideline 2.5.1 kræver offentlige API'er, en app til den aktuelle iOS og frameworks brugt efter hensigten. Med Expo tjekker du først dine native moduler.

Original side: [Guideline 2.5.1: offentlige API'er og opdateret SDK med Expo](https://devoria.fr/da/blog/guideline-2-5-1-offentlige-api-sdk-expo)
Forfatter: [Mehdi Azizi](https://devoria.fr/da/mehdi-azizi)
Udgivet: 2026-11-04
Indhold senest revideret: 2026-11-04


Guideline 2.5.1 stiller fire krav: brug kun offentlige API'er, kør på den aktuelle iOS-version, udfas det, Apple udfaser, og brug hvert framework til det, det er beregnet til. **Med Expo kommer risikoen sjældent fra din JavaScript-kode: den kommer fra de native moduler, du installerer, og fra det SDK, du bygger med.**

Jeg udgiver Solys, TradaZen og Nolera med Expo SDK 57. Solys bygger på Apples Screen Time-API, et framework med begrænset brug. Denne guide handler om review-reglen. Fejlen, du får, når du sender buildet, er beskrevet i guiden om [ITMS-90338](https://devoria.fr/da/blog/itms-90338-non-public-api-usage-expo). Baggrundstilstande, som ligger i samme afsnit, er beskrevet i guiden om [guideline 2.5.4](https://devoria.fr/da/blog/guideline-2-5-4-baggrundstilstand-afvist-apple).

## Hvad siger guideline 2.5.1?

Reglen står i afsnit 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. **Kun offentlige API'er**, altså dem Apple dokumenterer.
2. **En app, der kører på den aktuelle iOS-version**, iOS 27 siden september 2026.
3. **Intet forældet, der er på vej ud**: du erstatter det, Apple melder udfaset.
4. **Hvert framework på sin plads og nævnt i beskrivelsen**: HomeKit til smart home, HealthKit til sundhed og træning, koblet til Sundhed-appen.

Derfor lyder afvisningens titel: "Guideline 2.5.1 - Performance - Software Requirements".

## Offentlige API'er: hvor risikoen gemmer sig i en Expo-app

En privat API er en systemfunktion, som Apple ikke dokumenterer. Apple garanterer hverken dens opførsel eller at den findes i næste iOS-version, derfor forbuddet.

Din JavaScript-kode rører aldrig iOS direkte: den går gennem native moduler. Dem i Expo SDK vedligeholdes af Expo-teamet. **De andre indeholder kode, du ikke selv har skrevet, og Apple gennemgår den som din egen.** Guiden om [ITMS-90683](https://devoria.fr/da/blog/itms-90683-missing-purpose-string-expo) viser samme mekanisme med tilladelsestekster: Apple vurderer den kode, der ligger i buildet, ikke hvad appen gør.

I Solys indeholder 42 direkte afhængigheder native iOS-kode pr. 15. oktober 2026, heraf 14 uden for Expo SDK. Blandt dem er RevenueCat, Sentry, AppsFlyer og `react-native-device-activity`, broen til Screen Time-API'en.

En privat API kan opdages på to tidspunkter. Ved upload kan App Store Connects automatiske analyse returnere fejlen ITMS-90338. Under review henviser revieweren til 2.5.1.

## Forældede API'er: fra UIWebView til UIScene

Det mest kendte eksempel er UIWebView, den gamle komponent til at vise webindhold. Apple [holdt op med at acceptere den](https://developer.apple.com/news/?id=12232019b) i nye apps i april 2020 og i opdateringer i december 2020. Et gammelt bibliotek, der stadig refererede til den, blokerede uploadet. I Solys finder søgningen fra tjeklisten længere nede ingen referencer.

Næste ændring er allerede annonceret. Apples tekniske note [TN3187](https://developer.apple.com/documentation/technotes/tn3187-migrating-to-the-uikit-scene-based-life-cycle) skriver: "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'et uden scenebaseret livscyklus starter ikke.

Tre datoer, der hænger sammen:

- **Siden april 2026** kræver Apple Xcode 26: det er emnet i guiden om [ITMS-90725](https://devoria.fr/da/blog/itms-90725-sdk-version-issue-expo).
- **I april 2027** bliver iOS 27-SDK'et obligatorisk ifølge [Apples side om indsendelse](https://developer.apple.com/app-store/submitting/).
- **Expo SDK 58**, i beta siden 15. september 2026, genererer allerede scenehåndteringen ifølge [Expos annoncering](https://expo.dev/changelog/sdk-58-beta).

Med Expo SDK 57 og Xcode 26 bygger du stadig med iOS 26-SDK'et: intet går i stykker i dag. **Moduler, der ændrer AppDelegate, skal følge med inden april 2027.**

## Frameworks brugt uden for deres formål

Revieweren tjekker, at et følsomt framework tjener en synlig funktion, og at din App Store-side nævner det.

- **HealthKit** er til sundhed og træning. [Apples retningslinjer for brugerflader](https://developer.apple.com/design/human-interface-guidelines/healthkit) siger det: "If your app doesn't provide health and fitness functionality, don't request access to people's private health data."
- **HomeKit** er til smart home og intet andet.
- **PushKit** er til opkald via IP-telefoni. [PushKit-dokumentationen](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-notifikation, der vækker appen uden et opkald, er misbrug.
- **Family Controls**, Screen Time-API'en, kræver en særlig tilladelse. [Dokumentationen](https://developer.apple.com/documentation/familycontrols) præciserer: "Before submitting your app to the App Store, you must request permission to use the entitlement."

Til Solys anmodede jeg om denne distributionstilladelse den 23. september 2026, og Apple gav den samme dag. Brugen passer til frameworket: brugeren vælger de apps, der skal sættes på pause, og Solys blokerer dem i 30, 45 eller 60 minutter efter vækning. Beskrivelsen på App Store-siden siger det i én sætning: "Solys bruger Apples Screen Time-tilladelse til at sætte de valgte apps på pause." **Det er, hvad slutningen af 2.5.1 kræver: nævn integrationen i beskrivelsen.**

## Betaversioner: TestFlight ja, App Store nej

[Release notes for App Store Connect](https://developer.apple.com/help/app-store-connect/release-notes/) viser reglen i praksis. Den 14. oktober 2026 accepteres builds lavet med Xcode 27.2 beta 3 "for internal and external testing", altså til TestFlight. Den 5. oktober accepteres builds fra Xcode 27.1 RC "for the App Store".

**Et build lavet med en beta af Xcode går til TestFlight, aldrig til review.** For at indsende skal du bruge en endelig version eller en RC, som Apple har åbnet for App Store.

To præciseringer for en Expo-app:

- **En Expo-beta er ikke en Apple-beta.** Apple tjekker versionen af Xcode og iOS-SDK'et, ikke Expos. Annonceringen af SDK 58 tilføjede, at EAS-images med Xcode 27 snart kom.
- **Test på den aktuelle iOS er stadig obligatorisk**, selv hvis du bygger med iOS 26-SDK'et. Kaldstart appen på en opdateret iPhone eller simulator.

## Tjekliste: native afhængigheder før indsendelse

Kør den før hvert produktionsbuild. Kommandoerne køres i roden af Expo-projektet:

```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 fejl.** I Solys den 15. oktober 2026: 20 ud af 21 tjek bestået. Fejlen skyldtes 13 Expo-pakker, der manglede en patch, som `npx expo install --check` retter.
2. **Hvert modul uden for Expo SDK står i React Native Directory.** Expo Doctor laver dette tjek som standard, ifølge [Expos dokumentation](https://docs.expo.dev/versions/latest/config/package-json/). En ukendt pakke fortjener en gennemlæsning af sin iOS-kode.
3. **Hvert native modul følger din React Native-version.** [Expos versionstabel](https://docs.expo.dev/versions/latest/) parrer SDK 57 med React Native 0.86. Et modul uden udgivelser i flere versioner er et advarselstegn.
4. **Søgningen efter UIWebView giver intet.** Gør det samme for enhver API, Apple melder udfaset.
5. **Hvert følsomt framework har sin synlige funktion**: sundhed, Screen Time, opkald, hjem. Beskrivelsen nævner den, og den særlige tilladelse er givet.
6. **Buildet kommer fra en endelig Xcode.** Tjek versionen i EAS-buildloggene.
7. **Appen kaldstarter på den aktuelle iOS-version** med en ny konto.
8. **Moduler, der rører AppDelegate, understøtter UIScene**, før du skifter til iOS 27-SDK'et.

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

Beskeden nævner som regel den API eller det framework, det drejer sig om. To situationer:

- **Frameworket bruges ikke til noget synligt**: fjern modulet eller capabilityen, lav et nyt build, og svar med to sætninger.
- **Frameworket tjener en reel funktion**: angiv den præcise vej, et screenshot eller en kort video, og nævn integrationen i beskrivelsen på App Store-siden.

**At fjerne et native modul ændrer binæren: en fjernopdatering er ikke nok.** Guiden om [guideline 2.1](https://devoria.fr/da/blog/guideline-2-1-app-store-afvisning) forklarer, hvorfor revieweren kun ser den indbyggede kode. Samtalen foregår derefter i App Store Connect, som i guiden om at [svare App Review](https://devoria.fr/da/blog/apple-resolution-center-svar-paa-afslag-app-review).

## Tjek dit projekt før upload

[Review Kit](https://devoria.fr/da/kits/app-review) samler min tjekliste før upload, mine rettede afvisninger og Claude Code-skills, der gennemgår dit Expo-projekt. Vil du have et menneskeligt blik, så [book en time med mig](https://devoria.fr/da/coaching): vi læser Apples besked og dine afhængigheder sammen. Hele fremgangsmåden står på siden om [app afvist af Apple](https://devoria.fr/da/expertise/app-afvist-af-apple).

Forbereder du din første udgivelse? [Tag din gratis diagnose](https://devoria.fr/da/diagnostic): den sender dig min tjekliste mod afvisninger fra Apple.

## Ofte stillede spørgsmål

### Hvad betyder "Guideline 2.5.1 - Performance - Software Requirements"?

Det er afvisningens titel, når Apple mener, at din app bruger en ikke-offentlig API, en forældet teknologi eller et framework uden for dets formål. Beskeden nævner som regel det konkrete element.

### Hvad er forskellen på guideline 2.5.1 og fejlen ITMS-90338?

ITMS-90338 er en automatisk fejl, du får ved upload af buildet, når analysen finder et ikke-offentligt symbol. 2.5.1 er review-reglen, som en person anvender, og den dækker også misbrugte frameworks og forældede teknologier.

### Kan man indsende en app bygget med en beta af Xcode?

Nej. App Store Connect accepterer kun disse builds til TestFlight. Til review skal du bygge med en endelig Xcode-version eller en RC, som Apple har åbnet for App Store i sine release notes.

### Kan en Expo-app bruge en privat API uden at vide det?

Ja, via et tredjeparts native modul. Din JavaScript-kode kalder ikke selv iOS, men hver native pakke indeholder Objective-C- eller Swift-kode. Gennemgå listen over moduler uden for Expo SDK før hver version.

### Skal man skifte til Expo SDK 58 med det samme?

Ikke for 2.5.1's skyld pr. 15. oktober 2026: SDK 57 bygger med iOS 26-SDK'et, som stadig accepteres. Planlæg opgraderingen inden april 2027, hvor Apple kræver iOS 27-SDK'et og den scenebaserede livscyklus.


## Dit projekt

[Review Kit](https://devoria.fr/da/kits/app-review): Min tjekliste til App Store-review, mine afvisninger fra Apple og hvordan jeg rettede dem, tjeklisten til Google Play og tre Claude Code-skills. 369 kr..

[iOS & Android Kit](https://devoria.fr/da/kits/ios): Byg din iPhone- og Android-app med Claude Code: startkoden fra mine apps, vejen helt ud i butikkerne og alle kits. 739 kr..

[Diagnose: det, der skiller dig fra din iPhone-app](https://devoria.fr/da/diagnostic): 7 spørgsmål, 60 sekunder: du finder ud af, hvad der reelt holder dig tilbage fra at udgive din iPhone-app, får din vej i 4 trin og det kit, der passer til dig.
