Guideline 2.5.1: API públicas y SDK actualizado con Expo
Por Mehdi Azizi
Publicado el , 9 min
Guideline 2.5.1: solo API públicas, app compatible con el iOS actual y frameworks para su uso previsto. Con Expo, revisa primero tus módulos nativos.
La guideline 2.5.1 plantea cuatro exigencias: usar solo API públicas, funcionar en la versión actual de iOS, abandonar lo que Apple declara obsoleto y usar cada framework para su propósito previsto. Con Expo, el riesgo rara vez viene de tu código JavaScript: viene de los módulos nativos que instalas y del SDK con el que compilas.
Publico Solys, TradaZen y Nolera con Expo SDK 57. Solys se apoya en la API Screen Time de Apple, un framework de uso restringido. Esta guía trata la regla de revisión. Para el error que recibes al enviar el build, lee la guía de ITMS-90338. Para los modos en segundo plano, que están en la misma sección, lee la de la guideline 2.5.4.
¿Qué dice la guideline 2.5.1?
La regla está en la sección 2.5, "Software Requirements", de las 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."
En pocas palabras, cuatro obligaciones:
- Solo API públicas, es decir, documentadas por Apple.
- Una app que funcione en la versión actual de iOS, iOS 27 desde septiembre de 2026.
- Nada obsoleto que vaya a desaparecer: reemplazas lo que Apple anuncia como fin de vida.
- Cada framework en su lugar, y mencionado en la descripción: HomeKit para la casa conectada, HealthKit para la salud y el deporte, vinculado a la app Salud.
De ahí el título del rechazo: "Guideline 2.5.1 - Performance - Software Requirements".
API públicas: dónde se esconde el riesgo en una app Expo
Una API privada es una función del sistema que Apple no documenta. Apple no garantiza ni su comportamiento ni que siga existiendo en la siguiente versión de iOS, de ahí la prohibición.
Tu código JavaScript nunca toca iOS directamente: pasa por módulos nativos. Los del SDK de Expo los mantiene el equipo de Expo. Los demás incluyen código que tú no escribiste, y Apple lo examina como si fuera tuyo. La guía de ITMS-90683 muestra el mismo mecanismo con los textos de permisos: Apple juzga el código presente en el build, no lo que hace la app.
En Solys, al 15 de octubre de 2026, 42 dependencias directas contienen código iOS nativo, de las cuales 14 están fuera del SDK de Expo. Entre ellas están RevenueCat, Sentry, AppsFlyer y react-native-device-activity, el puente hacia la API Screen Time.
Una API privada se puede detectar en dos momentos. Al enviar el build, el análisis automático de App Store Connect puede devolver el error ITMS-90338. Durante la revisión, el revisor cita la 2.5.1.
API obsoletas: de UIWebView a UIScene
El ejemplo más conocido es UIWebView, el antiguo componente para mostrar contenido web. Apple dejó de aceptarlo en las apps nuevas en abril de 2020, y luego en las actualizaciones en diciembre de 2020. Una biblioteca vieja que todavía lo mencionaba bloqueaba el envío. En Solys, la búsqueda de la checklist de abajo no encuentra ninguna referencia.
El próximo cambio ya está anunciado. La nota técnica TN3187 de Apple lo dice: "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." En pocas palabras, una app compilada con el SDK de iOS 27 sin el ciclo de vida basado en escenas no arranca.
Tres fechas que conectar:
- Desde abril de 2026, Apple exige Xcode 26: es el tema de la guía de ITMS-90725.
- En abril de 2027, la página de envío de Apple anuncia que el SDK de iOS 27 será obligatorio.
- El SDK 58 de Expo, en beta desde el 15 de septiembre de 2026, ya genera la gestión de escenas, según el anuncio de Expo.
Con el SDK 57 de Expo y Xcode 26, todavía compilas con el SDK de iOS 26: hoy no se rompe nada. Los módulos que modifican el AppDelegate tendrán que adaptarse antes de abril de 2027.
Frameworks usados fuera de su propósito previsto
El revisor comprueba que un framework sensible cumpla una función visible y que tu ficha lo mencione.
- HealthKit sirve para la salud y el deporte. Las recomendaciones de interfaz de Apple lo dicen: "If your app doesn't provide health and fitness functionality, don't request access to people's private health data."
- HomeKit sirve para la casa conectada, y para nada más.
- PushKit sirve para las llamadas de voz sobre IP. La documentación de PushKit es clara: "If you are unable to support CallKit in your app, you cannot use PushKit to handle push notifications." Una notificación VoIP que despierta la app sin una llamada es un uso indebido.
- Family Controls, la API Screen Time, exige un permiso especial. Su documentación lo precisa: "Before submitting your app to the App Store, you must request permission to use the entitlement."
Para Solys, pedí ese permiso de distribución el 23 de septiembre de 2026, y Apple lo concedió el mismo día. El uso encaja con el framework: el usuario elige las apps que quiere pausar, y Solys las bloquea durante 30, 45 o 60 minutos después de despertarse. La descripción de la ficha lo dice en una frase: "Solys usa el permiso Screen Time de Apple para pausar las apps seleccionadas." Es lo que pide el final de la 2.5.1: mencionar la integración en la descripción.
Versiones beta: TestFlight sí, App Store no
Las notas de versión de App Store Connect muestran la regla en la práctica. El 14 de octubre de 2026, los builds hechos con Xcode 27.2 beta 3 se aceptan "for internal and external testing", o sea, para TestFlight. El 5 de octubre, los de Xcode 27.1 RC se aceptan "for the App Store".
Un build compilado con una beta de Xcode va a TestFlight, nunca a revisión. Para enviarlo, necesitas una versión final, o una RC que Apple haya habilitado para el App Store.
Dos aclaraciones para una app Expo:
- Una beta de Expo no es una beta de Apple. Apple controla la versión de Xcode y del SDK de iOS, no la de Expo. El anuncio del SDK 58 añadía que las imágenes de EAS con Xcode 27 llegarían pronto.
- Probar en el iOS actual sigue siendo obligatorio, aunque compiles con el SDK de iOS 26. Abre la app en frío en un iPhone o un simulador actualizado.
Checklist: dependencias nativas antes del envío
Revísala antes de cada build de producción. Los comandos se ejecutan en la raíz del proyecto Expo:
npx expo-doctor
npx expo install --check
grep -rlw "UIWebView" node_modules --include='*.m' --include='*.mm' --include='*.swift' --include='*.h'
npx expo-doctorno reporta ningún fallo. En Solys, el 15 de octubre de 2026: 20 de 21 comprobaciones superadas. El fallo venía de 13 paquetes de Expo atrasados un parche, quenpx expo install --checkalinea.- Cada módulo fuera del SDK de Expo aparece en React Native Directory. Expo Doctor hace esta comprobación por defecto, como indica la documentación de Expo. Un paquete desconocido merece que leas su código iOS.
- Cada módulo nativo sigue tu versión de React Native. La tabla de versiones de Expo asocia el SDK 57 con React Native 0.86. Un módulo sin publicaciones desde hace varias versiones es una señal de alerta.
- La búsqueda de UIWebView no devuelve nada. Haz lo mismo con cualquier API que Apple anuncie como fin de vida.
- Cada framework sensible tiene su función visible: salud, Screen Time, llamadas, casa. La descripción la menciona, y el permiso especial está concedido.
- El build sale de un Xcode final. Verifica la versión en los logs de build de EAS.
- La app arranca en frío en la versión actual de iOS, con una cuenta nueva.
- Los módulos que tocan el AppDelegate anuncian compatibilidad con UIScene antes de que pases al SDK de iOS 27.
¿Cómo responder a un rechazo por la 2.5.1?
El mensaje suele nombrar la API o el framework en cuestión. Dos casos:
- El framework no cumple ninguna función visible: quita el módulo o la capacidad, haz un nuevo build y responde en dos frases.
- El framework cumple una función real: indica la ruta exacta, una captura o un video corto, y menciona la integración en la descripción de la ficha.
Quitar un módulo nativo modifica el binario: una actualización remota no basta. La guía de la guideline 2.1 explica por qué el revisor solo ve el código incluido en el build. Luego la conversación sigue en App Store Connect, como en la guía para responder a App Review.
Revisa tu proyecto antes del envío
El Review Kit reúne mi checklist antes del envío, mis rechazos corregidos y skills de Claude Code que revisan tu proyecto Expo. Si quieres una mirada humana, reserva una hora conmigo: leemos juntos el mensaje de Apple y tus dependencias. El proceso completo está en la página app rechazada por Apple.
¿Estás preparando tu primer lanzamiento? Haz tu diagnóstico gratuito: te envía mi checklist contra los rechazos de Apple.
Preguntas frecuentes
¿Qué significa "Guideline 2.5.1 - Performance - Software Requirements"?
Es el título del rechazo cuando Apple considera que tu app usa una API no pública, una tecnología obsoleta o un framework fuera de su propósito previsto. El mensaje suele nombrar el elemento en cuestión.
¿Qué diferencia hay entre la guideline 2.5.1 y el error ITMS-90338?
ITMS-90338 es un error automático que recibes al enviar el build, cuando el análisis detecta un símbolo no público. La 2.5.1 es la regla de revisión que aplica una persona, y también cubre los frameworks mal usados y las tecnologías obsoletas.
¿Se puede enviar una app compilada con una beta de Xcode?
No. App Store Connect acepta esos builds solo para TestFlight. Para la revisión, compila con una versión final de Xcode, o con una RC que Apple haya habilitado para el App Store en sus notas de versión.
¿Una app Expo puede usar una API privada sin saberlo?
Sí, a través de un módulo nativo de terceros. Tu código JavaScript no llama a iOS por sí mismo, pero cada paquete nativo incluye código Objective-C o Swift. Revisa la lista de módulos fuera del SDK de Expo antes de cada versión.
¿Hay que pasar al SDK 58 de Expo de inmediato?
No por la 2.5.1 al 15 de octubre de 2026: el SDK 57 compila con el SDK de iOS 26, que todavía se acepta. Planea la actualización antes de abril de 2027, cuando Apple exigirá el SDK de iOS 27 y el ciclo de vida basado en escenas.

