Guide

Votre build iOS a été rejeté. Corrigez-le et renvoyez-le sans Mac

Apple vous a envoyé un e-mail, ou votre envoi a échoué, et vous n’avez pas de Mac. Vérifiez d’abord si la correction demande vraiment un nouveau build. Certaines non. Pour celles qui le demandent, cette page donne la correction et les commandes pour archiver, exporter et renvoyer le build dans la journée.

Faut-il un nouveau build ?

Tout problème ne veut pas dire recompiler. Ces corrections se font dans App Store Connect, depuis n’importe quel navigateur :

  • Les captures d’écran, la description et les autres textes de la page produit.
  • Les réponses de conformité à l’export pour un build marqué Missing Compliance.
  • Vos réponses App Privacy dans App Store Connect.

Les autres corrections demandent un nouveau build, donc Xcode sur un Mac. Cela couvre un Xcode ou un SDK trop ancien, un privacy manifest, les textes d’Info.plist, et les changements de code ou de SDK. Chaque nouvel envoi demande aussi un numéro de build plus élevé.

1. Compilé avec un Xcode trop ancien

Depuis le 28 avril 2026, Apple n’accepte que les envois compilés avec Xcode 26 ou plus récent, avec un SDK iOS 26. Un build fait avec Xcode 16 ne respecte pas cette règle. Pour voir ce qui a compilé une archive, lisez deux clés de son app :

/usr/libexec/PlistBuddy -c 'Print :DTSDKName' -c 'Print :DTXcode' \
  MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist

Sur un runner macos-26 de GitHub, cela a affiché iphoneos26.5 et 2660, ce qui veut dire Xcode 26.6. Les Mac MacRun ont Xcode 27.1 par défaut, et Xcode 26.6 aussi. Les deux respectent la règle.

Un détail : Apple dit que les apps sur le SDK iOS 27.1 devront avoir des captures d’écran iPhone Duo à partir d’avril 2027. Notre guide iPhone Duo montre comment les prendre.

2. Privacy manifest et API à raison obligatoire

Certaines API demandent une raison déclarée, comme UserDefaults et les horodatages de fichiers. Les raisons vont dans un fichier nommé PrivacyInfo.xcprivacy. Depuis le 1er mai 2024, App Store Connect n’accepte pas les apps qui s’en passent. Apple rejette aussi les manifests qui contiennent des clés inattendues. Son e-mail donne le chemin de chaque fichier fautif.

Voici un manifest minimal pour une app qui lit ses propres UserDefaults. CA92.1 est le code de raison d’Apple pour cet usage :

<?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>

Ajoutez-le à la cible de votre app. Vérifiez ensuite qu’il est valide. Nous avons lancé ceci sur un bon fichier et sur un fichier cassé :

$ plutil -lint MyApp/PrivacyInfo.xcprivacy
MyApp/PrivacyInfo.xcprivacy: OK
$ plutil -lint bad.xcprivacy
bad.xcprivacy: (Value missing for key inside <dict> at line 1)

Après l’archive, le fichier doit se trouver à la racine du .app. Le nôtre y était. Si l’e-mail cite un SDK tiers, mettez ce SDK à jour. Son propre manifest doit couvrir son propre usage des API.

3. Textes de description d’usage manquants

Si votre app utilise l’appareil photo, les photos ou la position, Info.plist doit contenir un texte d’explication pour chacun. Apple dit que l’accès échoue sans ce texte, et que l’app peut planter. La règle 5.1.1(ii) de l’App Review demande aussi que le texte décrive clairement votre usage des données.

<key>NSCameraUsageDescription</key>
<string>Scan receipts to add them to your expenses.</string>

Vérifiez l’app compilée, pas seulement le fichier source :

plutil -extract NSCameraUsageDescription raw \
  MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist

4. Conformité à l’export

Un build sans réponse sur le chiffrement affiche Missing Compliance dans TestFlight. Pas besoin de recompiler pour ça. Ouvrez le build dans App Store Connect, cliquez sur Manage, et répondez aux questions. Pour les éviter la prochaine fois, ajoutez cette clé à Info.plist. N’utilisez false que si votre chiffrement est exempté, comme du simple HTTPS :

<key>ITSAppUsesNonExemptEncryption</key>
<false/>

5. Captures d’écran fausses ou manquantes

Les captures d’écran ne demandent pas de nouveau build, mais il faut la bonne taille. Apple exige au moins une capture iPhone à la taille Dynamic Island moyenne. Cela fait 1179 x 2556 ou 1206 x 2622 pixels en portrait. Sans iPhone sous la main, le simulateur les produit :

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

Notre capture iPhone 17 Pro est sortie en 1206 x 2622, la taille exigée. L’iPhone 17 Pro Max a donné 1320 x 2868, qui convient pour la grande série. Lancez xcrun simctl list devices available pour voir ce qui est installé.

Recompiler et envoyer

Augmentez le numéro de build, puis archivez. Sur notre runner de test, cette étape a pris 12 secondes pour une petite app 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

Ensuite, exportez un .ipa signé. Mettez ceci dans ExportOptions.plist, avec votre propre Team ID. Les clés viennent 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

Connectez-vous d’abord à Xcode avec votre compte Apple. Notre archive de test non signée n’avait pas d’équipe, et l’export s’est arrêté sur "error: exportArchive No Team Found in Archive".

La page d’envoi d’Apple cite Xcode, Transporter et altool. Avec altool, enregistrez une fois un mot de passe pour app dans le trousseau. Puis validez et envoyez :

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

Ou réglez destination sur upload dans ExportOptions.plist. -exportArchive envoie alors lui-même le build à App Store Connect. Notre guide de publication couvre les clés API et TestFlight.

Tout corriger en une journée

Un pass journée MacRun coûte $15, payé une seule fois, sans renouvellement. C’est un Mac mini M6 dédié, prêt en moins de 5 minutes. Xcode 27.1 et Xcode 26.6 sont installés, avec le simulateur iOS 27.1. Vous y accédez via Tailscale en SSH ou avec un client VNC. Si la review le renvoie encore, une semaine coûte $59. Le Mac est effacé à la fin, donc poussez votre code avant.

Qui ne devrait pas louer un Mac pour ça

  • Si la correction porte sur les captures, les textes ou les réponses d’export, utilisez App Store Connect dans un navigateur.
  • Les apps Expo peuvent être recompilées avec EAS Build sur les machines macOS d’Expo. Voyez créer des apps iOS sous Windows.
  • Si vous compilez déjà sur Codemagic ou GitHub Actions, poussez la correction et laissez la CI recompiler.

Questions fréquentes

Puis-je corriger un rejet App Store sans Mac ?

+

Parfois. Les captures d’écran, les textes et les réponses de conformité à l’export se corrigent dans App Store Connect depuis n’importe quel navigateur. Un nouveau Xcode, un privacy manifest ou une modification d’Info.plist demandent un nouveau build, et donc macOS.

Quelle version de Xcode App Store Connect exige-t-il en 2026 ?

+

Depuis le 28 avril 2026, Apple exige des envois compilés avec Xcode 26 ou plus récent, avec un SDK iOS 26. Les Mac MacRun ont Xcode 27.1 par défaut et Xcode 26.6 installé.

Comment ajouter un privacy manifest à mon app iOS ?

+

Ajoutez un fichier nommé PrivacyInfo.xcprivacy à la cible de votre app. Listez chaque catégorie d’API à raison obligatoire avec le code de raison d’Apple, comme CA92.1 pour les UserDefaults de l’app elle-même. Vérifiez-le avec plutil -lint, puis recompilez.

Mon build TestFlight affiche Missing Compliance. Dois-je recompiler ?

+

Non. Ouvrez le build dans App Store Connect, cliquez sur Manage, et répondez aux questions sur le chiffrement. Ajoutez ITSAppUsesNonExemptEncryption à Info.plist dans votre prochain build pour les éviter.

Quelle taille de capture d’écran l’App Store exige-t-il pour l’iPhone ?

+

Apple exige au moins une capture pour iPhone avec Dynamic Island, écran moyen : 1179 x 2556 ou 1206 x 2622 pixels en portrait. Notre capture du simulateur iPhone 17 Pro faisait 1206 x 2622.

Comment envoyer le nouveau build sans la fenêtre de Xcode ?

+

Exportez un .ipa avec xcodebuild -exportArchive, puis lancez xcrun altool --upload-app. Transporter marche aussi. Apple cite les deux sur sa page d’envoi.

Guides associés