Tu build de iOS fue rechazada. Arréglala y súbela de nuevo sin Mac
Apple te envió un email, o tu subida falló, y no tienes Mac. Primero comprueba si el arreglo necesita de verdad una build nueva. Algunos no la necesitan. Para los que sí, esta página da el arreglo y los comandos para archivar, exportar y subir de nuevo en un día.
¿Hace falta una build nueva?
No todo problema obliga a recompilar. Estos arreglos se hacen en App Store Connect, desde cualquier navegador:
- Las capturas, la descripción y otros textos de la página del producto.
- Las respuestas de cumplimiento de exportación de una build marcada como Missing Compliance.
- Tus respuestas de App Privacy en App Store Connect.
Otros arreglos necesitan una build nueva, así que necesitan Xcode en un Mac. Eso incluye un Xcode o SDK antiguo, un manifiesto de privacidad, textos de Info.plist y cambios de código o de SDK. Cada subida nueva también necesita un número de build más alto.
1. Compilada con un Xcode demasiado antiguo
Desde el 28 de abril de 2026, Apple solo acepta subidas compiladas con Xcode 26 o posterior, con un SDK de iOS 26. Una build de Xcode 16 no cumple esta regla. Para ver con qué se compiló un archivo, lee dos claves de su app:
/usr/libexec/PlistBuddy -c 'Print :DTSDKName' -c 'Print :DTXcode' \ MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist
En un runner macos-26 de GitHub esto mostró iphoneos26.5 y 2660, que significa Xcode 26.6. Los Macs de MacRun tienen Xcode 27.1 como predeterminado y también Xcode 26.6. Los dos cumplen la regla.
Una pega: Apple dice que las apps con el SDK de iOS 27.1 necesitarán capturas de iPhone Duo a partir de abril de 2027. Nuestra guía del iPhone Duo explica cómo hacerlas.
2. Manifiesto de privacidad y APIs con motivo obligatorio
Algunas APIs necesitan un motivo declarado, como UserDefaults y las fechas de los archivos. Los motivos van en un archivo llamado PrivacyInfo.xcprivacy. Desde el 1 de mayo de 2024, App Store Connect no acepta apps que se lo salten. Apple también rechaza manifiestos con claves inesperadas. Su email indica la ruta de cada archivo incorrecto.
Este es un manifiesto mínimo para una app que lee sus propios UserDefaults. CA92.1 es el código de motivo de Apple para ese uso:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>Añádelo al target de tu app. Después comprueba que es válido. Ejecutamos esto con un archivo correcto y con uno roto:
$ plutil -lint MyApp/PrivacyInfo.xcprivacy MyApp/PrivacyInfo.xcprivacy: OK $ plutil -lint bad.xcprivacy bad.xcprivacy: (Value missing for key inside <dict> at line 1)
Después de archivar, el archivo debe quedar en la raíz del .app. El nuestro quedó ahí. Si el email nombra un SDK de terceros, actualiza ese SDK. Su propio manifiesto debe cubrir su propio uso de APIs.
3. Faltan los textos de descripción de uso
Si tu app usa la cámara, las fotos o la ubicación, Info.plist necesita un texto de propósito para ello. Apple dice que sin él el acceso falla, y que la app podría cerrarse. La norma 5.1.1(ii) de App Review también pide que el texto describa con claridad el uso que haces de los datos.
<key>NSCameraUsageDescription</key> <string>Scan receipts to add them to your expenses.</string>
Comprueba la app compilada, no solo el archivo fuente:
plutil -extract NSCameraUsageDescription raw \ MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist
4. Cumplimiento de exportación
Una build sin respuesta sobre cifrado aparece como Missing Compliance en TestFlight. No necesitas recompilar para esto. Abre la build en App Store Connect, pulsa Manage y responde las preguntas. Para saltártelas la próxima vez, añade esta clave a Info.plist. Usa false solo si tu cifrado está exento, como el HTTPS normal:
<key>ITSAppUsesNonExemptEncryption</key> <false/>
5. Capturas incorrectas o que faltan
Las capturas no necesitan recompilar, pero necesitas el tamaño correcto. Apple exige al menos una captura de iPhone en el tamaño medio con Dynamic Island. Son 1179 x 2556 o 1206 x 2622 píxeles en vertical. Si no tienes un iPhone a mano, el simulador las hace:
xcrun simctl boot "iPhone 17 Pro" xcrun simctl install "iPhone 17 Pro" MyApp.app xcrun simctl launch "iPhone 17 Pro" com.example.myapp xcrun simctl io "iPhone 17 Pro" screenshot shot.png sips -g pixelWidth -g pixelHeight shot.png
Nuestra captura del iPhone 17 Pro salió a 1206 x 2622, el tamaño exigido. El iPhone 17 Pro Max dio 1320 x 2868, que encaja en el grupo grande. Ejecuta xcrun simctl list devices available para ver qué hay instalado.
Recompila y sube
Sube el número de build y después archiva. En nuestro runner de prueba este paso tardó 12 segundos para una app pequeña de SwiftUI:
xcodebuild archive -project MyApp.xcodeproj -scheme MyApp \ -destination 'generic/platform=iOS' \ -archivePath build/MyApp.xcarchive \ MARKETING_VERSION=1.0.1 CURRENT_PROJECT_VERSION=3
Después, exporta un .ipa firmado. Pon esto en ExportOptions.plist, con tu propio Team ID. Las claves salen de xcodebuild -help:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>method</key> <string>app-store-connect</string> <key>teamID</key> <string>ABCDE12345</string> <key>signingStyle</key> <string>automatic</string> </dict> </plist>
xcodebuild -exportArchive -archivePath build/MyApp.xcarchive \ -exportOptionsPlist ExportOptions.plist -exportPath build/export \ -allowProvisioningUpdates
Antes, inicia sesión en Xcode con tu cuenta de Apple. Nuestro archivo de prueba sin firma no tenía equipo, y la exportación se detuvo con "error: exportArchive No Team Found in Archive".
La página de subida de Apple indica Xcode, Transporter y altool. Con altool, guarda una vez una contraseña específica de app en el llavero. Después valida y sube:
xcrun altool --store-password-in-keychain-item altool -u you@example.com -p xxxx-xxxx-xxxx-xxxx xcrun altool --validate-app -f build/export/MyApp.ipa -t ios -u you@example.com -p @keychain:altool xcrun altool --upload-app -f build/export/MyApp.ipa -t ios -u you@example.com -p @keychain:altool
O pon destination en upload en ExportOptions.plist. Así -exportArchive envía la build a App Store Connect por sí mismo. Nuestra guía de publicación explica las claves de API y TestFlight.
Arréglalo en un día
Un pase de un día de MacRun cuesta $15, en un solo pago y sin renovación. Es un Mac mini M6 dedicado, listo en menos de 5 minutos. Xcode 27.1 y Xcode 26.6 están instalados, con el simulador de iOS 27.1. Llegas a él por Tailscale con SSH o un visor VNC. Si la revisión lo devuelve otra vez, una semana cuesta $59. El Mac se borra al final, así que sube antes tu código.
Quién no debería alquilar un Mac para esto
- Si el arreglo son capturas, textos o respuestas de exportación, usa App Store Connect en un navegador.
- Las apps de Expo pueden recompilar con EAS Build en las máquinas macOS de Expo. Consulta compilar apps de iOS en Windows.
- Si ya compilas en Codemagic o GitHub Actions, sube el arreglo y deja que CI recompile.
Preguntas frecuentes
¿Puedo arreglar un rechazo de la App Store sin Mac?
+
A veces. Las capturas, los textos y las respuestas de cumplimiento de exportación se arreglan en App Store Connect desde cualquier navegador. Un Xcode nuevo, un manifiesto de privacidad o un cambio en Info.plist necesitan una build nueva, y eso necesita macOS.
¿Qué versión de Xcode exige App Store Connect en 2026?
+
Desde el 28 de abril de 2026, Apple exige subidas compiladas con Xcode 26 o posterior, con un SDK de iOS 26. Los Macs de MacRun tienen Xcode 27.1 como predeterminado y Xcode 26.6 instalado.
¿Cómo añado un manifiesto de privacidad a mi app de iOS?
+
Añade un archivo llamado PrivacyInfo.xcprivacy al target de tu app. Indica cada categoría de API con motivo obligatorio junto con el código de motivo de Apple, como CA92.1 para los UserDefaults propios de una app. Compruébalo con plutil -lint y después recompila.
Mi build de TestFlight dice Missing Compliance. ¿Tengo que recompilar?
+
No. Abre la build en App Store Connect, pulsa Manage y responde las preguntas sobre cifrado. Añade ITSAppUsesNonExemptEncryption a Info.plist en tu próxima build para saltártelas.
¿Qué tamaño de captura exige la App Store para iPhone?
+
Apple exige al menos una captura para iPhone con Dynamic Island, pantalla mediana: 1179 x 2556 o 1206 x 2622 píxeles en vertical. Nuestra captura del simulador del iPhone 17 Pro fue de 1206 x 2622.
¿Cómo subo la build nueva sin la ventana de Xcode?
+
Exporta un .ipa con xcodebuild -exportArchive y después ejecuta xcrun altool --upload-app. Transporter también sirve. Apple indica los dos en su página de subida.