Guideline 2.5.1: API pubbliche e SDK aggiornati con Expo
Di Mehdi Azizi
Pubblicato il , 9 min
Guideline 2.5.1: solo API pubbliche, app compatibile con l'iOS attuale, framework usati per lo scopo previsto. Con Expo controlla prima i moduli nativi.
La guideline 2.5.1 pone quattro requisiti: usare solo API pubbliche, funzionare sulla versione attuale di iOS, abbandonare ciò che Apple depreca e usare ogni framework per lo scopo previsto. Con Expo il rischio arriva di rado dal tuo codice JavaScript: arriva dai moduli nativi che installi e dall'SDK con cui compili.
Pubblico Solys, TradaZen e Nolera con Expo SDK 57. Solys si appoggia all'API Screen Time di Apple, un framework con un uso regolamentato. Questa guida tratta la regola di revisione. Per l'errore ricevuto all'invio della build, leggi la guida ITMS-90338. Per le modalità in background, che stanno nella stessa sezione, leggi quella sulla guideline 2.5.4.
Cosa dice la guideline 2.5.1?
La regola si trova nella sezione 2.5, "Software Requirements", delle App Review Guidelines: "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."
In parole semplici, quattro obblighi:
- Solo API pubbliche, cioè documentate da Apple.
- Un'app che funziona sulla versione attuale di iOS, iOS 27 da settembre 2026.
- Niente di deprecato che sta per sparire: sostituisci ciò che Apple annuncia a fine vita.
- Ogni framework al suo posto, e citato nella descrizione: HomeKit per la casa connessa, HealthKit per salute e sport, collegato all'app Salute.
Da qui il titolo del rifiuto: "Guideline 2.5.1 - Performance - Software Requirements".
API pubbliche: dove si nasconde il rischio in un'app Expo
Un'API privata è una funzione del sistema che Apple non documenta. Apple non ne garantisce né il comportamento né la presenza nella versione successiva di iOS, da qui il divieto.
Il tuo codice JavaScript non tocca mai iOS direttamente: passa dai moduli nativi. Quelli dell'SDK Expo sono mantenuti dal team di Expo. Gli altri includono codice che non hai scritto tu, e Apple lo esamina come se fosse tuo. La guida ITMS-90683 mostra lo stesso meccanismo con le frasi di autorizzazione: Apple giudica il codice presente nella build, non quello che l'app fa.
Su Solys, al 15 ottobre 2026, 42 dipendenze dirette contengono codice iOS nativo, di cui 14 fuori dall'SDK Expo. Tra queste ci sono RevenueCat, Sentry, AppsFlyer e react-native-device-activity, il ponte verso l'API Screen Time.
Un'API privata può essere individuata in due momenti. All'invio, l'analisi automatica di App Store Connect può restituire l'errore ITMS-90338. Durante la revisione, il reviewer cita la 2.5.1.
API deprecate: da UIWebView a UIScene
L'esempio più noto è UIWebView, il vecchio componente per mostrare contenuti web. Apple ha smesso di accettarlo nelle nuove app ad aprile 2020, poi negli aggiornamenti a dicembre 2020. Una vecchia libreria che lo citava ancora bloccava l'invio. Su Solys, la ricerca della checklist più sotto non trova nessun riferimento.
Il prossimo cambiamento è già annunciato. La nota tecnica TN3187 di Apple lo scrive: "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." In parole semplici, un'app compilata con l'SDK di iOS 27 senza il ciclo di vita basato sulle scene non si avvia.
Tre date da collegare:
- Da aprile 2026, Apple richiede Xcode 26: è l'argomento della guida ITMS-90725.
- Ad aprile 2027, la pagina di invio di Apple annuncia l'SDK di iOS 27 obbligatorio.
- L'SDK Expo 58, in beta dal 15 settembre 2026, genera già la gestione delle scene, secondo l'annuncio di Expo.
Con l'SDK Expo 57 e Xcode 26 compili ancora con l'SDK di iOS 26: oggi non si rompe niente. I moduli che modificano l'AppDelegate dovranno adeguarsi prima di aprile 2027.
Framework usati al di fuori del loro scopo previsto
Il reviewer verifica che un framework sensibile serva a una funzione visibile, e che la tua scheda lo menzioni.
- HealthKit serve per salute e sport. Le linee guida di interfaccia di Apple lo dicono: "If your app doesn't provide health and fitness functionality, don't request access to people's private health data."
- HomeKit serve per la casa connessa, e basta.
- PushKit serve per le chiamate voice over IP. La documentazione di PushKit è chiara: "If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications." Una notifica VoIP che risveglia l'app senza una chiamata è un uso improprio.
- Family Controls, l'API Screen Time, richiede un'autorizzazione speciale. La sua documentazione precisa: "Before submitting your app to the App Store, you must request permission to use the entitlement."
Per Solys ho chiesto questa autorizzazione di distribuzione il 23 settembre 2026, e Apple l'ha concessa lo stesso giorno. L'uso corrisponde al framework: l'utente sceglie le app da mettere in pausa, e Solys le blocca per 30, 45 o 60 minuti dopo il risveglio. La descrizione della scheda lo dice in una frase: "Solys usa l'autorizzazione Screen Time di Apple per mettere in pausa le app selezionate." È ciò che chiede la parte finale della 2.5.1: citare l'integrazione nella descrizione.
Versioni beta: TestFlight sì, App Store no
Le note di rilascio di App Store Connect mostrano la regola in pratica. Il 14 ottobre 2026, le build fatte con Xcode 27.2 beta 3 sono accettate "for internal and external testing", quindi per TestFlight. Il 5 ottobre, quelle di Xcode 27.1 RC sono accettate "for the App Store".
Una build compilata con una beta di Xcode va su TestFlight, mai in revisione. Per inviarla in revisione ti serve una versione finale, oppure una RC che Apple ha aperto all'App Store.
Due precisazioni per un'app Expo:
- Una beta di Expo non è una beta di Apple. Apple controlla la versione di Xcode e dell'SDK iOS, non quella di Expo. L'annuncio dell'SDK 58 aggiungeva che le immagini EAS con Xcode 27 sarebbero arrivate a breve.
- Testare sull'iOS attuale resta obbligatorio, anche se compili con l'SDK di iOS 26. Avvia l'app a freddo su un iPhone o un simulatore aggiornato.
Checklist: dipendenze native prima dell'invio
Passala prima di ogni build di produzione. I comandi vanno lanciati dalla radice del progetto Expo:
npx expo-doctor
npx expo install --check
grep -rlw "UIWebView" node_modules --include='*.m' --include='*.mm' --include='*.swift' --include='*.h'
npx expo-doctornon segnala nessun errore. Su Solys, il 15 ottobre 2026: 20 controlli superati su 21. L'errore veniva da 13 pacchetti Expo indietro di una patch, chenpx expo install --checkallinea.- Ogni modulo fuori dall'SDK Expo è presente in React Native Directory. Expo Doctor fa questo controllo di default, come indica la documentazione di Expo. Un pacchetto sconosciuto merita una lettura del suo codice iOS.
- Ogni modulo nativo segue la tua versione di React Native. La tabella delle versioni di Expo associa l'SDK 57 a React Native 0.86. Un modulo senza rilasci da diverse versioni è un campanello d'allarme.
- La ricerca di UIWebView non restituisce niente. Fai lo stesso per ogni API che Apple annuncia a fine vita.
- Ogni framework sensibile ha la sua funzione visibile: salute, Screen Time, chiamate, casa. La descrizione la cita, e l'autorizzazione speciale è stata concessa.
- La build esce da un Xcode finale. Controlla la versione nei log di build EAS.
- L'app si avvia a freddo sulla versione attuale di iOS, con un account nuovo.
- I moduli che toccano l'AppDelegate dichiarano il supporto a UIScene prima del tuo passaggio all'SDK di iOS 27.
Come rispondere a un rifiuto 2.5.1?
Il messaggio di solito indica l'API o il framework in questione. Due casi:
- Il framework non serve a niente di visibile: rimuovi il modulo o la capability, rifai una build, poi rispondi in due frasi.
- Il framework serve a una vera funzione: indica il percorso esatto, uno screenshot o un breve video, e cita l'integrazione nella descrizione della scheda.
Rimuovere un modulo nativo modifica il binario: un aggiornamento da remoto non basta. La guida sulla guideline 2.1 spiega perché il reviewer vede solo il codice incluso nella build. La conversazione prosegue poi in App Store Connect, come nella guida per rispondere ad App Review.
Verificare il tuo progetto prima dell'invio
Il Review Kit riunisce la mia checklist pre-invio, i miei rifiuti corretti e delle skill di Claude Code che rileggono il tuo progetto Expo. Se vuoi un occhio umano, prenota un'ora con me: leggiamo insieme il messaggio di Apple e le tue dipendenze. Il percorso completo è nella pagina app rifiutata da Apple.
Stai preparando la tua prima uscita? Fai il tuo diagnostic gratuito: ti invia la mia checklist anti-rifiuto Apple.
Domande frequenti
Cosa significa "Guideline 2.5.1 - Performance - Software Requirements"?
È il titolo del rifiuto quando Apple ritiene che la tua app usi un'API non pubblica, una tecnologia deprecata o un framework al di fuori del suo scopo previsto. Il messaggio di solito indica l'elemento in questione.
Che differenza c'è tra la guideline 2.5.1 e l'errore ITMS-90338?
ITMS-90338 è un errore automatico che ricevi all'invio della build, quando l'analisi individua un simbolo non pubblico. La 2.5.1 è la regola di revisione applicata da una persona, che copre anche i framework usati impropriamente e le tecnologie deprecate.
Si può inviare un'app compilata con una beta di Xcode?
No. App Store Connect accetta queste build solo per TestFlight. Per la revisione, compila con una versione finale di Xcode, oppure con una RC che Apple ha aperto all'App Store nelle sue note di rilascio.
Un'app Expo può usare un'API privata senza saperlo?
Sì, tramite un modulo nativo di terze parti. Il tuo codice JavaScript non chiama iOS direttamente, ma ogni pacchetto nativo include codice Objective-C o Swift. Rileggi l'elenco dei moduli fuori dall'SDK Expo prima di ogni versione.
Bisogna passare subito all'SDK Expo 58?
Non per la 2.5.1 al 15 ottobre 2026: l'SDK 57 compila con l'SDK di iOS 26, ancora accettato. Pianifica l'aggiornamento prima di aprile 2027, quando Apple richiederà l'SDK di iOS 27 e il ciclo di vita basato sulle scene.

