# Guideline 2.5.1: API publice și SDK la zi cu Expo

> Guideline 2.5.1: doar API publice, aplicație compatibilă cu iOS-ul actual, framework-uri folosite în scopul lor. Cu Expo, verifică întâi modulele native.

Pagina originală: [Guideline 2.5.1: API publice și SDK la zi cu Expo](https://devoria.fr/ro/blog/guideline-2-5-1-api-publice-sdk-expo)
Autor: [Mehdi Azizi](https://devoria.fr/ro/mehdi-azizi)
Publicare: 2026-11-04
Ultima revizuire a conținutului: 2026-11-04


Guideline 2.5.1 impune patru cerințe: să folosești doar API publice, să rulezi pe versiunea actuală de iOS, să renunți la ce depreciază Apple și să folosești fiecare framework în scopul pentru care a fost creat. **Cu Expo, riscul vine rar din codul tău JavaScript: vine din modulele native pe care le instalezi și din SDK-ul cu care compilezi.**

Public Solys, TradaZen și Nolera cu Expo SDK 57. Solys se bazează pe API-ul Screen Time de la Apple, un framework cu utilizare strict reglementată. Ghidul ăsta tratează regula de review. Pentru eroarea primită la trimiterea build-ului, citește ghidul [ITMS-90338](https://devoria.fr/ro/blog/itms-90338-non-public-api-usage-expo). Pentru modurile de background, vecine în aceeași secțiune, citește ghidul despre [guideline 2.5.4](https://devoria.fr/ro/blog/guideline-2-5-4-mod-fundal-respins-apple).

## Ce spune guideline 2.5.1?

Regula se află în secțiunea 2.5, „Software Requirements”, din [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.”

Pe scurt, patru obligații:

1. **Doar API publice**, adică documentate de Apple.
2. **O aplicație care rulează pe versiunea curentă de iOS**, iOS 27 din septembrie 2026.
3. **Nimic depreciat care urmează să dispară**: înlocuiești ce anunță Apple că ajunge la final de viață.
4. **Fiecare framework la locul lui, și menționat în descriere**: HomeKit pentru casa inteligentă, HealthKit pentru sănătate și sport, conectat la aplicația Health.

De aici și titlul respingerii: „Guideline 2.5.1 - Performance - Software Requirements”.

## API publice: unde se ascunde riscul într-o aplicație Expo

Un API privat e o funcție a sistemului pe care Apple n-o documentează. Apple nu garantează nici comportamentul ei, nici prezența ei în următoarea versiune de iOS, de aici interdicția.

Codul tău JavaScript nu atinge niciodată iOS direct: trece prin module native. Cele din SDK-ul Expo sunt întreținute de echipa Expo. **Celelalte includ cod pe care nu l-ai scris tu, iar Apple îl examinează ca pe al tău.** Ghidul [ITMS-90683](https://devoria.fr/ro/blog/itms-90683-missing-purpose-string-expo) arată același mecanism cu textele de permisiune: Apple judecă codul prezent în build, nu ce face aplicația.

Pe Solys, la 15 octombrie 2026, 42 de dependențe directe conțin cod iOS nativ, dintre care 14 în afara SDK-ului Expo. Printre ele: RevenueCat, Sentry, AppsFlyer și `react-native-device-activity`, puntea către API-ul Screen Time.

Un API privat poate fi detectat în două momente. La trimitere, analiza automată din App Store Connect poate returna eroarea ITMS-90338. În timpul review-ului, reviewer-ul citează 2.5.1.

## API depreciate: de la UIWebView la UIScene

Cel mai cunoscut exemplu e UIWebView, vechea componentă pentru afișarea conținutului web. Apple a [încetat să-l mai accepte](https://developer.apple.com/news/?id=12232019b) în aplicațiile noi în aprilie 2020, apoi în actualizări în decembrie 2020. O bibliotecă veche care încă făcea referire la el bloca trimiterea. Pe Solys, căutarea din checklist-ul de mai jos nu găsește nicio referință.

Următoarea schimbare e deja anunțată. Nota tehnică [TN3187](https://developer.apple.com/documentation/technotes/tn3187-migrating-to-the-uikit-scene-based-life-cycle) de la Apple o spune: „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.” Pe scurt, o aplicație compilată cu SDK-ul iOS 27 fără ciclul de viață bazat pe scene nu pornește.

Trei date de legat între ele:

- **Din aprilie 2026**, Apple cere Xcode 26: e subiectul ghidului [ITMS-90725](https://devoria.fr/ro/blog/itms-90725-sdk-version-issue-expo).
- **În aprilie 2027**, [pagina de trimitere a Apple](https://developer.apple.com/app-store/submitting/) anunță SDK-ul iOS 27 obligatoriu.
- **SDK-ul Expo 58**, în beta din 15 septembrie 2026, generează deja gestionarea scenelor, conform [anunțului Expo](https://expo.dev/changelog/sdk-58-beta).

Cu SDK-ul Expo 57 și Xcode 26, încă compilezi cu SDK-ul iOS 26: nimic nu se strică azi. **Modulele care modifică AppDelegate vor trebui să se adapteze înainte de aprilie 2027.**

## Framework-uri folosite în afara scopului lor

Reviewer-ul verifică dacă un framework sensibil servește o funcție vizibilă și dacă pagina ta din App Store o menționează.

- **HealthKit** e pentru sănătate și sport. [Recomandările de interfață ale Apple](https://developer.apple.com/design/human-interface-guidelines/healthkit) o spun: „If your app doesn't provide health and fitness functionality, don't request access to people's private health data.”
- **HomeKit** e pentru casa inteligentă și nimic altceva.
- **PushKit** e pentru apelurile voice over IP. [Documentația PushKit](https://developer.apple.com/documentation/pushkit/responding-to-voip-notifications-from-pushkit) e clară: „If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications.” O notificare VoIP care trezește aplicația fără apel e o deturnare.
- **Family Controls**, API-ul Screen Time, cere o autorizare specială. [Documentația](https://developer.apple.com/documentation/familycontrols) lui precizează: „Before submitting your app to the App Store, you must request permission to use the entitlement.”

Pentru Solys, am cerut această autorizare de distribuție pe 23 septembrie 2026, iar Apple a acordat-o în aceeași zi. Utilizarea se potrivește cu framework-ul: utilizatorul alege aplicațiile de pus pe pauză, iar Solys le blochează timp de 30, 45 sau 60 de minute după trezire. Descrierea din App Store o spune într-o frază: „Solys folosește autorizarea Screen Time de la Apple pentru a pune pe pauză aplicațiile selectate.” **Exact asta cere finalul lui 2.5.1: să menționezi integrarea în descriere.**

## Versiuni beta: TestFlight da, App Store nu

[Notele de versiune din App Store Connect](https://developer.apple.com/help/app-store-connect/release-notes/) arată regula în practică. Pe 14 octombrie 2026, build-urile făcute cu Xcode 27.2 beta 3 sunt acceptate „for internal and external testing”, deci pentru TestFlight. Pe 5 octombrie, cele din Xcode 27.1 RC sunt acceptate „for the App Store”.

**Un build compilat cu o beta de Xcode merge în TestFlight, niciodată în review.** Ca să trimiți, ai nevoie de o versiune finală sau de un RC pe care Apple l-a deschis pentru App Store.

Două precizări pentru o aplicație Expo:

- **O beta Expo nu e o beta Apple.** Apple controlează versiunea de Xcode și de SDK iOS, nu pe cea de Expo. Anunțul SDK 58 adăuga că imaginile EAS cu Xcode 27 vin în curând.
- **Testarea pe iOS-ul actual rămâne obligatorie**, chiar dacă compilezi cu SDK-ul iOS 26. Pornește aplicația la rece pe un iPhone sau un simulator actualizat.

## Checklist: dependențe native înainte de trimitere

Parcurge-l înainte de fiecare build de producție. Comenzile se rulează din rădăcina proiectului Expo:

```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` nu semnalează niciun eșec.** Pe Solys, la 15 octombrie 2026: 20 de verificări din 21 trecute. Eșecul venea de la 13 pachete Expo rămase în urmă cu un patch, pe care `npx expo install --check` le aliniază.
2. **Fiecare modul din afara SDK-ului Expo apare în React Native Directory.** Expo Doctor face implicit această verificare, așa cum arată [documentația Expo](https://docs.expo.dev/versions/latest/config/package-json/). Un pachet necunoscut merită o citire a codului său iOS.
3. **Fiecare modul nativ ține pasul cu versiunea ta de React Native.** [Tabelul versiunilor Expo](https://docs.expo.dev/versions/latest/) asociază SDK 57 cu React Native 0.86. Un modul fără nicio publicare de mai multe versiuni e un semnal.
4. **Căutarea UIWebView nu returnează nimic.** Fă la fel pentru orice API pe care Apple îl anunță la final de viață.
5. **Fiecare framework sensibil are funcția lui vizibilă**: sănătate, Screen Time, apeluri, casă. Descrierea o menționează, iar autorizarea specială e acordată.
6. **Build-ul iese dintr-un Xcode final.** Verifică versiunea în logurile de build EAS.
7. **Aplicația pornește la rece pe versiunea actuală de iOS**, cu un cont nou.
8. **Modulele care ating AppDelegate anunță suport pentru UIScene** înainte să treci la SDK-ul iOS 27.

## Cum răspunzi la o respingere 2.5.1?

Mesajul numește în general API-ul sau framework-ul în cauză. Două cazuri:

- **Framework-ul nu servește nimic vizibil**: scoate modulul sau capability-ul, refă build-ul, apoi răspunde în două fraze.
- **Framework-ul servește o funcție reală**: dă calea exactă, o captură sau un video scurt și menționează integrarea în descrierea din App Store.

**Eliminarea unui modul nativ modifică binarul: o actualizare la distanță nu e suficientă.** Ghidul despre [guideline 2.1](https://devoria.fr/ro/blog/guideline-2-1-app-store-respingere) explică de ce reviewer-ul vede doar codul inclus. Conversația continuă apoi în App Store Connect, ca în ghidul despre cum să [răspunzi la App Review](https://devoria.fr/ro/blog/resolution-center-apple-raspuns-refuz-app-review).

## Verifică-ți proiectul înainte de trimitere

[Review Kit](https://devoria.fr/ro/kits/app-review) adună checklist-ul meu dinainte de trimitere, respingerile mele rezolvate și skill-uri Claude Code care îți verifică proiectul Expo. Pentru o privire umană, [rezervă o oră cu mine](https://devoria.fr/ro/coaching): citim împreună mesajul de la Apple și dependențele tale. Tot procesul e pe pagina [aplicație respinsă de Apple](https://devoria.fr/ro/expertise/aplicatie-respinsa-de-apple).

Îți pregătești prima lansare? [Fă diagnosticul gratuit](https://devoria.fr/ro/diagnostic): îți trimite checklist-ul meu anti-respingere Apple.

## Întrebări frecvente

### Ce înseamnă „Guideline 2.5.1 - Performance - Software Requirements”?

E titlul respingerii când Apple consideră că aplicația ta folosește un API nepublic, o tehnologie depreciată sau un framework în afara scopului său. Mesajul numește în general elementul în cauză.

### Care e diferența dintre guideline 2.5.1 și eroarea ITMS-90338?

ITMS-90338 e o eroare automată primită la trimiterea build-ului, când analiza detectează un simbol nepublic. 2.5.1 e regula de review aplicată de o persoană, care acoperă și framework-urile deturnate și tehnologiile depreciate.

### Poți trimite o aplicație compilată cu o beta de Xcode?

Nu. App Store Connect acceptă aceste build-uri doar pentru TestFlight. Pentru review, compilează cu o versiune finală de Xcode sau cu un RC pe care Apple l-a deschis pentru App Store în notele sale de versiune.

### Poate o aplicație Expo să folosească un API privat fără să știi?

Da, printr-un modul nativ terț. Codul tău JavaScript nu apelează iOS direct, dar fiecare pachet nativ include cod Objective-C sau Swift. Citește lista modulelor din afara SDK-ului Expo înainte de fiecare versiune.

### Trebuie să treci imediat la SDK-ul Expo 58?

Nu pentru 2.5.1, la 15 octombrie 2026: SDK 57 compilează cu SDK-ul iOS 26, încă acceptat. Planifică upgrade-ul înainte de aprilie 2027, când Apple va cere SDK-ul iOS 27 și ciclul de viață bazat pe scene.


## Proiectul tău

[Review Kit](https://devoria.fr/ro/kits/app-review): Checklistul meu de review App Store, respingerile mele de la Apple rezolvate, checklistul pentru Google Play și trei skilluri Claude Code. 259 RON.

[iOS & Android Kit](https://devoria.fr/ro/kits/ios): Creează-ți aplicația de iPhone și Android cu Claude Code: codul de pornire al aplicațiilor mele, drumul până în store-uri și toate kiturile. 529 RON.

[Diagnostic: ce te desparte de aplicația ta de iPhone](https://devoria.fr/ro/diagnostic): 7 întrebări, 60 de secunde: afli ce te blochează de fapt să-ți publici aplicația de iPhone, traseul tău în 4 etape și kitul potrivit pentru tine.
