# Guideline 2.5.1: javni API-ji in posodobljen SDK z Expo

> Guideline 2.5.1: samo javni API-ji, app mora delovati na trenutnem iOS-u, ogrodja le za predvideni namen. Z Expo najprej preveri native module.

Izvirna stran: [Guideline 2.5.1: javni API-ji in posodobljen SDK z Expo](https://devoria.fr/sl/blog/guideline-2-5-1-javni-api-sdk-expo)
Avtor: [Mehdi Azizi](https://devoria.fr/sl/mehdi-azizi)
Objava: 2026-11-04
Zadnja revizija vsebine: 2026-11-04


Guideline 2.5.1 postavlja štiri zahteve: uporabljaj samo javne API-je, app mora delovati na trenutni različici iOS-a, opusti, kar Apple označi kot zastarelo, in vsako ogrodje uporabljaj za njegov predvideni namen. **Z Expo tveganje redko pride iz tvoje JavaScript kode: pride iz native modulov, ki jih namestiš, in iz SDK-ja, s katerim prevajaš.**

Solys, TradaZen in Nolera objavljam z Expo SDK 57. Solys se opira na Applov API Screen Time, ogrodje z omejeno uporabo. Ta vodnik obravnava pravilo pregleda. Za napako, ki jo dobiš ob pošiljanju builda, preberi vodnik [ITMS-90338](https://devoria.fr/sl/blog/itms-90338-non-public-api-usage-expo). Za načine delovanja v ozadju, ki so v istem delu smernic, preberi vodnik za [guideline 2.5.4](https://devoria.fr/sl/blog/guideline-2-5-4-nacin-delovanja-v-ozadju-zavrnitev).

## Kaj pravi guideline 2.5.1?

Pravilo je v delu 2.5, „Software Requirements“, v [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.“

Po domače, štiri obveznosti:

1. **Samo javni API-ji**, torej taki, ki jih Apple dokumentira.
2. **App, ki deluje na trenutni različici iOS-a**, od septembra 2026 je to iOS 27.
3. **Nič zastarelega, kar bo izginilo**: zamenjaš, kar Apple napove kot konec življenjske dobe.
4. **Vsako ogrodje na svojem mestu in omenjeno v opisu**: HomeKit za pametni dom, HealthKit za zdravje in šport, povezan z aplikacijo Health.

Od tod naslov zavrnitve: „Guideline 2.5.1 - Performance - Software Requirements“.

## Javni API-ji: kje se skriva tveganje v Expo appu

Zasebni API je sistemska funkcija, ki je Apple ne dokumentira. Apple ne jamči ne za njeno delovanje ne za to, da bo obstajala v naslednji različici iOS-a, zato je prepovedana.

Tvoja JavaScript koda se iOS-a nikoli ne dotakne neposredno: gre prek native modulov. Tiste iz Expo SDK-ja vzdržuje ekipa Expo. **Drugi vsebujejo kodo, ki je nisi napisal ti, in Apple jo pregleda enako kot tvojo.** Vodnik [ITMS-90683](https://devoria.fr/sl/blog/itms-90683-missing-purpose-string-expo) pokaže isti mehanizem pri besedilih za dovoljenja: Apple presoja kodo, ki je v buildu, ne tega, kar app dela.

Na Solysu ima na dan 15. oktobra 2026 native iOS kodo 42 neposrednih odvisnosti, od tega 14 zunaj Expo SDK-ja. Med njimi so RevenueCat, Sentry, AppsFlyer in `react-native-device-activity`, most do API-ja Screen Time.

Zasebni API se lahko odkrije v dveh trenutkih. Ob pošiljanju lahko samodejna analiza App Store Connect vrne napako ITMS-90338. Med pregledom pa reviewer navede 2.5.1.

## Zastareli API-ji: od UIWebView do UIScene

Najbolj znan primer je UIWebView, stara komponenta za prikaz spletnih vsebin. Apple jo je [nehal sprejemati](https://developer.apple.com/news/?id=12232019b) v novih appih aprila 2020, nato v posodobitvah decembra 2020. Stara knjižnica, ki se je še sklicevala nanjo, je blokirala pošiljanje. Na Solysu iskanje iz spodnjega seznama ne najde nobenega sklica.

Naslednja sprememba je že napovedana. Applova tehnična opomba [TN3187](https://developer.apple.com/documentation/technotes/tn3187-migrating-to-the-uikit-scene-based-life-cycle) pravi: „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.“ Po domače: app, preveden s SDK-jem za iOS 27 brez življenjskega cikla s scenami, se ne zažene.

Trije datumi, ki jih je treba povezati:

- **Od aprila 2026** Apple zahteva Xcode 26: o tem govori vodnik [ITMS-90725](https://devoria.fr/sl/blog/itms-90725-sdk-version-issue-expo).
- **Aprila 2027** bo po [Applovi strani za pošiljanje](https://developer.apple.com/app-store/submitting/) SDK za iOS 27 obvezen.
- **Expo SDK 58**, v beti od 15. septembra 2026, že generira upravljanje scen, piše v [objavi Expo](https://expo.dev/changelog/sdk-58-beta).

Z Expo SDK 57 in Xcode 26 še vedno prevajaš s SDK-jem za iOS 26: danes se nič ne pokvari. **Moduli, ki spreminjajo AppDelegate, bodo morali slediti pred aprilom 2027.**

## Ogrodja, uporabljena zunaj predvidenega namena

Reviewer preveri, ali občutljivo ogrodje služi vidni funkciji in ali jo tvoja stran v trgovini omenja.

- **HealthKit** je za zdravje in šport. [Applova priporočila za vmesnik](https://developer.apple.com/design/human-interface-guidelines/healthkit) pravijo: „If your app doesn't provide health and fitness functionality, don't request access to people's private health data.“
- **HomeKit** je za pametni dom in za nič drugega.
- **PushKit** je za klice prek interneta (VoIP). [Dokumentacija PushKit](https://developer.apple.com/documentation/pushkit/responding-to-voip-notifications-from-pushkit) je jasna: „If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications.“ VoIP obvestilo, ki zbudi app brez klica, je zloraba.
- **Family Controls**, API Screen Time, zahteva posebno dovoljenje. Njegova [dokumentacija](https://developer.apple.com/documentation/familycontrols) pojasnjuje: „Before submitting your app to the App Store, you must request permission to use the entitlement.“

Za Solys sem to dovoljenje za distribucijo zaprosil 23. septembra 2026 in Apple ga je odobril isti dan. Uporaba se ujema z ogrodjem: uporabnik izbere appe, ki jih želi začasno ustaviti, in Solys jih blokira za 30, 45 ali 60 minut po bujenju. Opis v trgovini to pove v enem stavku: „Solys uporablja Applovo dovoljenje Screen Time za začasno ustavitev izbranih appov.“ **Prav to zahteva konec smernice 2.5.1: integracijo omeni v opisu.**

## Beta različice: TestFlight da, App Store ne

[Opombe ob izdaji App Store Connect](https://developer.apple.com/help/app-store-connect/release-notes/) pokažejo pravilo v praksi. 14. oktobra 2026 so buildi, narejeni z Xcode 27.2 beta 3, sprejeti „for internal and external testing“, torej za TestFlight. 5. oktobra so bili buildi iz Xcode 27.1 RC sprejeti „for the App Store“.

**Build, preveden z beta različico Xcode, gre v TestFlight, nikoli v pregled.** Za oddajo potrebuješ končno različico ali RC, ki ga je Apple odprl za App Store.

Dve pojasnili za Expo app:

- **Beta Expo ni beta Appla.** Apple preverja različico Xcode in iOS SDK-ja, ne različice Expo. Objava SDK 58 je dodala, da EAS slike z Xcode 27 prihajajo kmalu.
- **Testiranje na trenutnem iOS-u ostaja obvezno**, tudi če prevajaš s SDK-jem za iOS 26. Zaženi app iz hladnega zagona na posodobljenem iPhonu ali simulatorju.

## Kontrolni seznam: native odvisnosti pred oddajo

Preglej ga pred vsakim produkcijskim buildom. Ukaze zaženeš v korenu Expo projekta:

```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` ne javi nobene napake.** Na Solysu 15. oktobra 2026: 20 od 21 preverjanj uspešnih. Napaka je prišla iz 13 Expo paketov, ki so zaostajali za en popravek, in `npx expo install --check` jih uskladi.
2. **Vsak modul zunaj Expo SDK-ja je v React Native Directory.** Expo Doctor to privzeto preveri, kot piše v [dokumentaciji Expo](https://docs.expo.dev/versions/latest/config/package-json/). Pri neznanem paketu si preberi njegovo iOS kodo.
3. **Vsak native modul sledi tvoji različici React Native.** [Tabela različic Expo](https://docs.expo.dev/versions/latest/) povezuje SDK 57 z React Native 0.86. Modul brez izdaje že več različic je opozorilni znak.
4. **Iskanje UIWebView ne vrne ničesar.** Enako naredi za vsak API, ki mu Apple napove konec.
5. **Vsako občutljivo ogrodje ima svojo vidno funkcijo**: zdravje, Screen Time, klici, dom. Opis jo omenja in posebno dovoljenje je odobreno.
6. **Build pride iz končne različice Xcode.** Različico preveri v dnevnikih EAS builda.
7. **App se zažene iz hladnega zagona na trenutni različici iOS-a**, z novim računom.
8. **Moduli, ki posegajo v AppDelegate, napovedujejo podporo za UIScene**, preden preideš na SDK za iOS 27.

## Kako odgovoriti na zavrnitev 2.5.1?

Sporočilo običajno navede sporni API ali ogrodje. Dva primera:

- **Ogrodje ne služi ničemur vidnemu**: odstrani modul ali zmožnost, naredi nov build in odgovori v dveh stavkih.
- **Ogrodje služi pravi funkciji**: podaj natančno pot, posnetek zaslona ali kratek video in integracijo omeni v opisu v trgovini.

**Odstranitev native modula spremeni binarno datoteko: posodobitev na daljavo ne zadošča.** Vodnik za [guideline 2.1](https://devoria.fr/sl/blog/smernica-2-1-app-store-zavrnitev) razloži, zakaj reviewer vidi samo vgrajeno kodo. Pogovor nato poteka v App Store Connect, kot v vodniku, kako [odgovoriti App Review](https://devoria.fr/sl/blog/apple-resolution-center-odgovor-zavrnitev-app-review).

## Preveri svoj projekt pred pošiljanjem

[Review Kit](https://devoria.fr/sl/kits/app-review) združuje moj kontrolni seznam pred pošiljanjem, moje popravljene zavrnitve in skille za Claude Code, ki pregledajo tvoj Expo projekt. Če želiš človeški pogled, [rezerviraj uro z mano](https://devoria.fr/sl/coaching): skupaj prebereva Applovo sporočilo in tvoje odvisnosti. Celoten postopek je na strani [app, ki ga je Apple zavrnil](https://devoria.fr/sl/expertise/apple-zavrnil-aplikacijo).

Pripravljaš svojo prvo izdajo? [Naredi brezplačno diagnozo](https://devoria.fr/sl/diagnostic): poslala ti bo moj kontrolni seznam proti Applovim zavrnitvam.

## Pogosta vprašanja

### Kaj pomeni „Guideline 2.5.1 - Performance - Software Requirements“?

To je naslov zavrnitve, ko Apple meni, da tvoj app uporablja nejavni API, zastarelo tehnologijo ali ogrodje zunaj predvidenega namena. Sporočilo običajno navede sporni element.

### Kakšna je razlika med smernico 2.5.1 in napako ITMS-90338?

ITMS-90338 je samodejna napaka ob pošiljanju builda, ko analiza zazna nejavni simbol. 2.5.1 je pravilo pregleda, ki ga uporablja človek, in pokriva tudi zlorabljena ogrodja in zastarele tehnologije.

### Ali lahko oddaš app, preveden z beta različico Xcode?

Ne. App Store Connect take builde sprejme samo za TestFlight. Za pregled prevajaj s končno različico Xcode ali z RC, ki ga je Apple v opombah ob izdaji odprl za App Store.

### Ali lahko Expo app uporablja zasebni API, ne da bi vedel?

Da, prek native modula tretje osebe. Tvoja JavaScript koda sama ne kliče iOS-a, vendar vsak native paket vsebuje kodo v Objective-C ali Swiftu. Pred vsako različico preglej seznam modulov zunaj Expo SDK-ja.

### Ali moraš takoj preiti na Expo SDK 58?

Za 2.5.1 na dan 15. oktobra 2026 ne: SDK 57 prevaja s SDK-jem za iOS 26, ki je še sprejet. Prehod načrtuj pred aprilom 2027, ko bo Apple zahteval SDK za iOS 27 in življenjski cikel s scenami.


## Tvoj projekt

[Review Kit](https://devoria.fr/sl/kits/app-review): Moj kontrolni seznam za pregled v App Store, moje popravljene zavrnitve Applea, seznam za Google Play in trije skilli za Claude Code. 49 €.

[iOS & Android Kit](https://devoria.fr/sl/kits/ios): Ustvari svojo aplikacijo za iPhone in Android s Claude Code: začetna koda mojih aplikacij, pot do trgovin in vsi kompleti. 99 €.

[Diagnoza: kaj te loči od tvoje aplikacije za iPhone](https://devoria.fr/sl/diagnostic): 7 vprašanj, 60 sekund: izveš, kaj te zares ovira pri objavi aplikacije za iPhone, dobiš pot v 4 korakih in komplet, ki ti ustreza.
