ITMS-90717 : corriger « Invalid large app icon » avec Expo
Par Mehdi Azizi
Publié le , 8 min
ITMS-90717 : l'icône 1024 x 1024 de ton build garde de la transparence ou un canal alpha. Exporte-la opaque, vérifie-la avec sips, puis refais un build.
ITMS-90717 est un contrôle automatique d'Apple sur ton build. Il dit que la grande icône de l'app, celle de 1024 x 1024 pixels qu'affiche l'App Store, contient de la transparence ou un canal alpha. La correction : une icône carrée et opaque, exportée sans canal alpha, puis un nouveau build.
Avec Expo, ton fichier PNG est rarement le coupable : le prebuild le pose déjà sur un fond blanc. J'ai lu ce code dans le SDK 57 et vérifié les icônes de Solys, TradaZen et Nolera. L'erreur vient alors le plus souvent d'un dossier ios versionné ou d'un fichier Icon Composer. Voici comment trouver lequel, et le corriger.
Que veut dire l'erreur ITMS-90717 ?
Le message s'intitule « ITMS-90717: Invalid large app icon ». Il précise que la grande icône du catalogue d'images de ton app « can't be transparent or contain an alpha channel » : elle ne peut être ni transparente, ni contenir de canal alpha. Les anciens messages parlaient d'« Invalid App Store Icon ». C'est la même règle.
Cette grande icône, c'est celle de l'App Store. La documentation de Xcode sur les icônes l'explique : une app distribuée sur l'App Store doit fournir son icône de 1024 points dans son catalogue d'images.
Le canal alpha, c'est la quatrième couche d'un PNG, à côté du rouge, du vert et du bleu. Elle stocke la transparence de chaque pixel. Une icône peut paraître pleine et garder ce canal : c'est le piège qui revient dans tous les fils de forum.
Comme les autres erreurs ITMS, ce n'est pas le refus d'un reviewer. Apple a analysé le binaire à la livraison. Selon l'outil d'envoi, l'erreur apparaît comme un échec de validation, par exemple avec le code 409.
Vérifier ton icône avec sips
Sur Mac, sips est installé d'office. Une ligne suffit :
sips -g hasAlpha assets/icon.png
Tu veux lire hasAlpha: no. Le 15 octobre 2026, j'ai lancé cette commande sur les icônes déclarées dans les app.json de Solys, TradaZen et Nolera : toutes répondent no, en 1024 x 1024.
J'ai aussi fabriqué une icône d'essai : un carré bleu entièrement opaque, mais enregistré avec un canal alpha. sips répond yes. Aucun pixel n'est transparent, et le canal est pourtant là. C'est pour ça que tant de développeurs écrivent « mon icône n'a aucune transparence » sous ce message.
Dans Aperçu, l'inspecteur (Outils, Afficher l'inspecteur) liste aussi les propriétés de l'image, dont le canal alpha.
Corriger : exporter l'icône sans canal alpha
Trois méthodes, de la plus simple à la plus précise.
1. Aperçu. Fichier, Exporter, format PNG, puis décoche la case Alpha. Le fichier exporté n'a plus de canal alpha.
2. sips, sans rien installer. sips ne retire pas le canal alpha d'un PNG. Il faut passer par un JPEG, qui n'en a pas :
sips -s format jpeg -s formatOptions 100 icon.png --out icon.jpg
sips -s format png icon.jpg --out icon-opaque.png
sips -g hasAlpha icon-opaque.png
Sur mon icône d'essai à coins transparents, les coins sont devenus blancs et la dernière ligne répond no. Le passage par le JPEG compresse un peu l'image, même à la qualité maximale : regarde le résultat de près.
3. ImageMagick. Si tu l'as installé, tu choisis la couleur de fond :
magick icon.png -background white -alpha remove -alpha off icon-opaque.png
D'après la documentation d'ImageMagick, -alpha remove pose l'image sur la couleur de fond, et -alpha off désactive le canal.
Ces trois méthodes remplissent la transparence avec une couleur unie. Si ton logo flottait sur un fond transparent, le plus propre est de reprendre le fichier source et d'y dessiner un vrai fond. Expo le demande dans son guide de l'icône d'app : l'icône doit remplir tout le carré, sans coins arrondis ni pixels transparents. iOS applique lui‑même le masque.
Où Expo prend ton icône, et ce qu'il en fait
Expo lit d'abord ios.icon, puis le champ icon à la racine de ta configuration. D'après la référence de la configuration d'Expo, ios.icon accepte trois formes : un PNG, un objet avec des variantes light, dark et tinted, ou un dossier .icon créé avec Icon Composer.
Le tableau suivant vient du code qui génère l'icône iOS au prebuild, @expo/prebuild-config 57.0.16 (SDK 57), lu le 15 octobre 2026 :
| Ce que tu déclares | Ce que fait le prebuild | Risque ITMS-90717 |
|---|---|---|
icon en PNG | Aplati sur fond blanc | Faible |
ios.icon.light | Aplati sur fond blanc | Faible |
ios.icon.tinted | Aplati sur fond blanc | Faible |
ios.icon.dark | Transparence gardée | Voulu par Apple |
ios.icon en .icon | Copié tel quel | Réel |
Dossier ios versionné | Prebuild non relancé | Réel |
Avec un PNG, Expo retire lui‑même la transparence et la remplace par du blanc. Un logo détouré finit donc sur un carré blanc : pas d'erreur, mais un rendu que tu n'as peut-être pas voulu. La variante sombre garde sa transparence, et c'est voulu : Apple demande un fond transparent pour l'icône sombre, afin que le fond fourni par le système apparaisse.
Sur Nolera, qui déclare les trois variantes, sips répond no pour l'icône claire et la teintée générées, yes pour la sombre. D'après la date du commit de ces variantes, la version 1.0.2, en ligne, les embarque. Je ne l'ai pas vérifié dans son IPA.
Le cas du dossier ios versionné
C'est la cause la plus probable avec Expo. La page d'Expo sur la génération native continue le dit : si ton projet contient les dossiers android et ios, EAS Build ne lance pas le prebuild. Ton app.json ne touche alors plus l'icône : c'est le PNG du dossier ios qui part chez Apple.
Contrôle-le depuis la racine du projet :
sips -g hasAlpha ios/*/Images.xcassets/AppIcon.appiconset/*.png
Si la commande répond yes pour l'icône 1024, remplace ce fichier par ta version opaque, sous le même nom. Si tu n'as fait aucune modification native à la main, tu peux aussi supprimer le dossier ios et l'ajouter au .gitignore : EAS le régénérera à chaque build. Sur Solys, TradaZen et Nolera, ce dossier est ignoré par git.
Le format iOS 26 : Icon Composer
Icon Composer est l'outil d'Apple pour les icônes Liquid Glass d'iOS 26. Il produit un seul fichier .icon à plusieurs calques. D'après le guide d'Apple sur Icon Composer, Xcode en tire aussi les images pour les versions d'iOS plus anciennes.
Expo le gère depuis le SDK 54. Tu déclares le dossier en texte, jamais dans l'objet de variantes :
{
"expo": {
"ios": {
"icon": "./assets/app.icon"
}
}
}
Dans ce cas, le prebuild copie le dossier sans y toucher, et c'est Xcode qui fabrique l'icône finale. Il faut donc Xcode 26 ou plus, celui des images EAS récentes, comme je l'explique dans le guide sur ITMS-90725.
Depuis août 2025, sur le forum des développeurs d'Apple, des fils signalent ITMS-90717 avec des fichiers .icon. Les pistes rapportées : un calque PNG transparent, un calque plus grand que la toile, un groupe avec l'effet Blur près du bord. Les contournements cités : couper le Blur, garder un fond plein, ou revenir à un PNG. Ces fils ne donnent aucune correction officielle d'Apple, et l'erreur était encore signalée en août 2026.
Les règles d'Apple sur les icônes vont dans ce sens : si tu importes un calque de fond, il doit couvrir toute la surface et être opaque. Mes apps utilisent encore un PNG, je n'ai donc pas testé Icon Composer en production. Si un fichier .icon bloque ton envoi, repasse ios.icon sur un PNG : Expo l'aplatira, et ton icône passera ce contrôle.
Vérifier l'icône dans le build final
Dans l'IPA, l'icône 1024 n'est pas un fichier PNG : Xcode la compile dans Assets.car. Télécharge l'IPA depuis la page du build sur expo.dev, puis lance :
unzip -q MonApp.ipa -d ipa
xcrun assetutil --info ipa/Payload/*.app/Assets.car | grep -B3 '"RenditionName" : "App-Icon'
Chaque icône affiche un champ Opaque. Le 15 octobre 2026, j'ai compilé avec actool, l'outil de Xcode, l'icône de Solys et mon icône d'essai à coins transparents. La première sort en "Opaque" : true, la seconde en "Opaque" : false. Apple ne documente pas ce champ : prends-le comme un indice, pas comme le contrôle d'Apple.
Un piège à connaître : ne teste pas avec sips les petits PNG posés à la racine de l'app. Xcode les écrit avec un canal alpha, même quand la source est opaque. Sur mon test avec l'icône de Solys, sips répond yes pour eux.
Les autres erreurs d'icône
| Code | Ce qu'Apple signale | Piste avec Expo |
|---|---|---|
| ITMS-90717 | Icône 1024 transparente | Exporter sans alpha |
| ITMS-90704 | Icône 1024 absente | Entrée 1024 manquante |
| ITMS-90022 | Icône iPhone absente | Catalogue incomplet |
| ITMS-90023 | Icône iPad absente | Catalogue incomplet |
Les trois derniers messages remontent surtout à 2017 et 2018, quand Xcode 9 a changé les règles des icônes.
Avec Expo, ils sont devenus rares. Le prebuild écrit une seule icône universelle de 1024, et Xcode génère les autres tailles. Sans icône déclarée, Expo crée même un carré blanc, pour éviter un échec à l'envoi. Si l'une de ces erreurs tombe, regarde le dossier ios versionné : le fichier Contents.json de AppIcon.appiconset doit contenir une entrée de taille 1024x1024, et le PNG qu'elle cite doit exister.
Avant ton prochain envoi
Une icône se corrige en dix minutes, mais chaque erreur coûte un build. Les autres contrôles automatiques demandent la même rigueur, comme ITMS-90683 pour les phrases d'autorisation ou ITMS-91053 pour le manifeste de confidentialité. Une fois le build accepté, installe-le avec TestFlight pour voir ton icône sur ton écran d'accueil.
Les refus d'un reviewer demandent plus de recul : la démarche est sur la page application refusée par Apple, et les motifs les plus fréquents sont dans pourquoi Apple refuse une app.
Pour vérifier ton dossier avant l'envoi, le Kit Review Apple réunit ma checklist et des skills Claude Code qui relisent ton projet. Si ton envoi bloque et que tu veux un regard humain, réserve une heure avec moi : on reprend ton projet en visio, sur ton écran. Et si tu prépares ta première sortie, fais ton diagnostic gratuit : il remet les étapes dans l'ordre et t'envoie ma checklist anti-refus Apple.
Questions fréquentes
Pourquoi Apple voit un canal alpha alors que mon icône n'a aucune transparence ?
Parce qu'un PNG peut garder un canal alpha même quand tous ses pixels sont opaques. Beaucoup d'outils l'ajoutent par défaut à l'export. Vérifie avec sips -g hasAlpha, puis réexporte l'icône sans ce canal.
Peut-on corriger ITMS-90717 avec une mise à jour à distance ?
Non. L'icône est compilée dans le binaire, dans Assets.car. Une mise à jour à distance ne change que le JavaScript et les ressources de l'app. Corrige l'icône, refais un build, puis renvoie-le.
L'icône sombre peut-elle être transparente ?
Oui. Apple demande un fond transparent pour la variante sombre, et Expo garde sa transparence. J'en déduis que le contrôle vise l'icône principale, celle de l'App Store : c'est elle qui doit être opaque.
Faut-il arrondir les coins de l'icône iOS ?
Non. Fournis un carré plein : iOS applique lui‑même le masque. Des coins arrondis laissent des pixels transparents dans les angles, exactement ce que refuse ce contrôle.
Expo gère-t-il les icônes Icon Composer d'iOS 26 ?
Oui, depuis le SDK 54 : déclare le chemin du dossier .icon dans ios.icon, en texte. Le prebuild le copie tel quel et Xcode 26 le compile. En cas d'ITMS-90717 avec ce format, vérifie les calques transparents et l'effet Blur, ou reviens provisoirement à un PNG.

