Missing Compliance en TestFlight: cómo solucionarlo
Por Mehdi Azizi
Publicado el , 9 min
Missing Compliance significa que Apple espera tu declaración de cifrado. Desbloquea el build en App Store Connect y configura la clave para no volver a verlo.
Missing Compliance no es un error: es un build que espera tu respuesta sobre el cifrado. Mientras no respondas, el build queda bloqueado para tus testers. Para ese build, respondes las preguntas en la pestaña TestFlight de App Store Connect. Para los siguientes, agregas la clave ITSAppUsesNonExemptEncryption en tu Info.plist, o ios.config.usesNonExemptEncryption en tu app.json con Expo, y el estado ya no vuelve a aparecer.
Mis apps iOS están hechas con Expo. En el app.json de Solys, la clave vale false y está puesta dos veces: en ios.config y en ios.infoPlist. Esta guía sigue las páginas de Apple sobre los estados de build y sobre el cumplimiento de exportación de los builds beta, revisadas el 6 de noviembre de 2026.
Qué significa Missing Compliance
La lista de estados de build de Apple lo define en una frase: falta la documentación de cumplimiento de exportación y se espera una acción de tu parte. Apple lo muestra en amarillo, el color de un proceso en curso que depende de ti o de Apple, y su descripción precisa que se espera una acción de tu parte.
¿Por qué Apple hace la pregunta? La página sobre las reglas de exportación del cifrado lo explica: cuando envías un build a TestFlight o al App Store, lo envías a un servidor en Estados Unidos. Si tu app se distribuye fuera de Estados Unidos y Canadá, queda sujeta a la ley estadounidense de exportación, sin importar el país de tu empresa. Y en cuanto una app usa, contiene o integra cifrado, Apple considera que se trata de una exportación de software de cifrado.
Resultado: con cada nueva versión, App Store Connect te hace las preguntas de cumplimiento, salvo que tu Info.plist ya las responda. Por eso un primer build de Expo casi siempre llega en Missing Compliance.
Desbloquear el build que está esperando
Los pasos vienen de la página de Apple sobre el cumplimiento de exportación de los builds beta. Necesitas el rol Account Holder, Admin o App Manager.
- En Apps, abre tu app y luego la pestaña TestFlight.
- En la barra lateral, en Builds, elige la plataforma.
- En la columna Build, haz clic en el ícono o el número del build en cuestión.
- Haz clic en Provide Export Compliance Information y responde las preguntas.
- Si Apple te pide documentación, haz clic en Go to App Encryption Page para enviarla. Si no, haz clic en Save.
Apple también describe el atajo: junto al build, el enlace Manage abre las mismas preguntas, y Choose File permite adjuntar una documentación ya aprobada. Una vez guardado, el build pasa a Ready to Submit, o directamente a Testing si va a un grupo interno. Ready to Test solo llega después de la revisión beta de los testers externos.
¿El enlace Manage no se puede hacer clic? Revisa primero tu rol en el equipo: Apple reserva la respuesta a los roles Account Holder, Admin y App Manager; una cuenta Developer o Marketing no puede responder. Apple no documenta otra causa. Si acabas de enviar el build, espera el correo de fin de procesamiento, explicado en la guía sobre el número de build y la versión, y luego recarga la página.
No volver a responder nunca: la clave en tu proyecto
Apple lo dice en la página de los builds beta: puedes indicar en el Info.plist que tu app no usa cifrado, o que está exenta, y ya no tienes que responder en cada envío. La clave se llama ITSAppUsesNonExemptEncryption. Xcode la muestra con el nombre App Uses Non-Exempt Encryption.
| Tu herramienta | Archivo | Dónde | Valor |
|---|---|---|---|
| Expo (EAS Build) | app.json | expo.ios.config | false |
| Expo, otra vía | app.json | expo.ios.infoPlist | false |
| React Native puro | Info.plist | App Uses Non-Exempt Encryption | NO |
| Xcode, Swift | Info.plist | App Uses Non-Exempt Encryption | NO |
Con Expo, la clave se llama usesNonExemptEncryption, y la referencia de configuración precisa que escribe la clave de Apple en el Info.plist del build, y que ios.config sirve solo para el build: no aparece en el manifiesto de producción.
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Con Expo, ios.infoPlist también acepta la clave con su nombre de Apple y el mismo valor: es la segunda línea del app.json de Solys. En un proyecto nativo, la misma declaración cabe en una línea del Info.plist: la clave App Uses Non-Exempt Encryption, que es el nombre que muestra Xcode, con el valor NO. El valor es un booleano, no una cadena.
La clave surte efecto en el siguiente build. El build ya enviado sigue en Missing Compliance mientras no respondas en App Store Connect: las dos acciones no se reemplazan, se complementan.
false o true: cómo decidir
Apple define el valor NO así: tu app, incluidas las bibliotecas de terceros, no usa ningún cifrado, o solo un cifrado exento de las obligaciones de documentación. Si no, es YES.
Lo que en general está exento, según la página sobre las reglas de exportación: el cifrado integrado en el sistema, como las conexiones HTTPS con URLSession. Lo que no lo está: un cifrado propietario, que hayas escrito o incluido tú. La visión general del cumplimiento de exportación agrega un recordatorio importante: tú eres responsable de la interpretación, y de sus consecuencias, si reclamas una exención por error.
Para una app de Expo que llama a una API por HTTPS, guarda preferencias y vende una suscripción, false es la respuesta habitual. Para una app que cifra por sí misma mensajes, archivos o una bóveda, la respuesta es true, y Apple espera documentación.
No pongas
falsepor reflejo. Revisa tus dependencias: una biblioteca de cifrado de extremo a extremo o un almacenamiento cifrado hecho en casa te pasa al lado de la documentación.
Si tu app usa un cifrado no exento
La página sobre la documentación de cifrado describe el proceso. En App Information, junto a App Encryption Documentation, el botón de agregar abre las preguntas, luego Choose File para el documento y después Save. Apple pide haber completado antes la descripción de la app y configurado su disponibilidad, para evaluar si la documentación es suficiente. Apunta a unos dos días hábiles cuando el expediente está completo.
Una vez aprobada la documentación, Apple te da un valor para poner en la clave ITSEncryptionExportComplianceCode de tu Info.plist. Con ella, se acaban las preguntas en cada envío. Durante la revisión, tu build muestra Waiting for Export Compliance Review o In Compliance Review: no se espera ninguna acción de tu parte.
Dos puntos que señala Apple, uno en la página de las reglas de exportación y el otro en la visión general del cumplimiento:
- Incluso con un cifrado exento, se puede exigir un informe anual de autoclasificación ante el gobierno de Estados Unidos. No se exige si usas un cifrado no exento y entregaste la documentación a Apple.
- Francia también controla la importación y exportación de apps de cifrado. La visión general de Apple cita el almacenamiento seguro, las comunicaciones seguras y los antivirus como áreas afectadas, con exenciones para las apps bancarias y médicas, y remite a la ANSSI.
Qué pasa después en TestFlight
El build desbloqueado sigue la vida normal de un build de TestFlight, descrita en la guía TestFlight para probar tu app de iPhone: testers internos de inmediato, testers externos después de la revisión beta, y vencimiento a los 90 días, según la lista de estados de build. Los otros bloqueos posibles de un envío con Expo, como un número de build ya usado o un archivo rechazado, están en los errores de envío de EAS a App Store Connect, y el proceso completo en publicar una app de Expo en el App Store con EAS.
El iOS & Android Kit contiene mi código base de Expo, con esta clave ya configurada, y el recorrido que va del primer build a la ficha del App Store. Si quieres saber qué sigue bloqueando tu publicación, el diagnóstico gratuito te responde en unas pocas preguntas y te envía mi checklist contra los rechazos de Apple. Los pasos completos están en publicar una aplicación en el App Store.
Preguntas frecuentes
¿Qué significa Missing Compliance en TestFlight?
El build espera tu declaración de cumplimiento de exportación, es decir, tu respuesta sobre el uso de cifrado. Apple lo clasifica entre los estados que requieren una acción de tu parte. El build no llega a los testers mientras no respondas.
¿Por qué no puedo hacer clic en el enlace Manage de Missing Compliance?
Revisa tu rol: Apple reserva la respuesta a los roles Account Holder, Admin y App Manager. Apple no documenta otra causa. Si el build acaba de llegar, recarga la página después del correo de fin de procesamiento.
Mi app solo usa HTTPS, ¿debo responder que sí al cifrado?
Apple indica que el cifrado integrado en el sistema, como las conexiones HTTPS con URLSession, en general está exento de las obligaciones de documentación. En ese caso, la clave ITSAppUsesNonExemptEncryption vale NO, siempre que ninguna biblioteca de terceros agregue un cifrado propietario.
¿Hay que responder las preguntas de cifrado en cada build?
Sí, mientras tu Info.plist no contenga la clave ITSAppUsesNonExemptEncryption. Con ella, App Store Connect ya no hace las preguntas. Con Expo, se configura en app.json con ios.config.usesNonExemptEncryption.
¿Dónde declaro el cifrado en app.json con Expo?
En app.json, dentro de expo.ios.config, con "usesNonExemptEncryption": false si tu app no usa ningún cifrado no exento. EAS Build escribe la clave en el Info.plist del build. Surte efecto en el siguiente build, no en el que ya enviaste.
¿Missing Compliance también bloquea el envío al App Store?
Las preguntas de cumplimiento de exportación aparecen en toda nueva versión, beta o App Store. Un build que no las haya respondido no se puede distribuir. La clave en el Info.plist resuelve los dos casos a la vez.
¿Debo hacer un informe anual de autoclasificación?
Apple señala que usar un cifrado exento puede igualmente obligarte a presentar un informe anual de autoclasificación ante el gobierno de Estados Unidos, y remite al procedimiento oficial. Si tu app usa un cifrado no exento y entregaste la documentación a Apple, ese informe no es necesario.

