# ITMS-90717 : corriger « Invalid large app icon » avec Expo

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

Page originale : [ITMS-90717 : corriger « Invalid large app icon » avec Expo](https://devoria.fr/blog/itms-90717-icone-app-store-transparence)
Auteur : [Mehdi Azizi](https://devoria.fr/mehdi-azizi)
Publication : 2026-11-04
Dernière révision du contenu : 2026-11-04


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](https://developer.apple.com/documentation/xcode/configuring-your-app-icon) 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 :

```bash
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 :

```bash
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 :

```bash
magick icon.png -background white -alpha remove -alpha off icon-opaque.png
```

D'après la [documentation d'ImageMagick](https://imagemagick.org/command-line-options/#alpha), `-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](https://docs.expo.dev/develop/user-interface/splash-screen-and-app-icon/) : 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](https://docs.expo.dev/versions/latest/config/app/), `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](https://docs.expo.dev/workflow/continuous-native-generation/) 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 :

```bash
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](https://developer.apple.com/documentation/xcode/creating-your-app-icon-using-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 :

```json
{
  "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](https://devoria.fr/blog/itms-90725-sdk-version-xcode).

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](https://developer.apple.com/design/human-interface-guidelines/app-icons) 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 :

```bash
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](https://devoria.fr/blog/itms-90683-missing-purpose-string-expo) pour les phrases d'autorisation ou [ITMS-91053](https://devoria.fr/blog/itms-91053-privacy-manifest-expo) pour le manifeste de confidentialité. Une fois le build accepté, installe-le avec [TestFlight](https://devoria.fr/blog/testflight-tester-son-app-iphone) 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](https://devoria.fr/expertise/application-refusee-par-apple), et les motifs les plus fréquents sont dans [pourquoi Apple refuse une app](https://devoria.fr/blog/pourquoi-apple-refuse-votre-app).

Pour vérifier ton dossier avant l'envoi, le [Kit Review Apple](https://devoria.fr/kits/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](https://devoria.fr/coaching) : on reprend ton projet en visio, sur ton écran. Et si tu prépares ta première sortie, [fais ton diagnostic gratuit](https://devoria.fr/diagnostic) : 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.


## Ton projet

[Kit Review](https://devoria.fr/kits/review-apple) : Tout ce que je vérifie avant d'envoyer une app à Apple, la même vérification pour Google Play, et trois skills qui font la relecture avec Claude Code. 49 €, paiement unique. Inclus : La checklist avant l'envoi ; Les refus que j'ai pris, et ce que j'ai corrigé ; Les notes pour le testeur ; Les skills de vérification. Prérequis : une app iPhone ou Android presque prête, et Claude Code ou Cursor. Téléchargement immédiat après le paiement.

[Kit iOS & Android Devoria](https://devoria.fr/kits/ios) : Le code de départ de mes apps, le parcours jusqu'à l'App Store et Google Play avec les messages à donner à Claude, et tous les kits. Claude part d'une app qui tourne déjà. 99 €, paiement unique. Inclus : Le code de départ de ton app ; Les styles visuels ; Le parcours pas à pas ; Kit Review ; Kit Captures ; Kit ASO ; Mises à jour à vie ; Bonus : la séance 1:1 à moitié prix. Prérequis : pour l'iPhone, un Mac avec Xcode 26 ou plus et un compte Apple Developer (99 $ par an) pour publier. Pour Android, Android Studio sur un Mac, un PC Windows ou Linux, et un compte Google Play Console (25 $, une fois). Et Claude Code (abonnement payant) ou Cursor. Téléchargement immédiat après le paiement.

[Diagnostic gratuit](https://devoria.fr/diagnostic) : quelques questions sur ton projet. Il dit ce qui te bloque vraiment, l'ordre des quatre étapes et le kit qui correspond. En laissant ton e-mail, tu reçois la checklist anti-refus Apple : les points vérifiés avant chaque envoi, tirés des refus reçus par les apps du studio.

[Une heure avec moi](https://devoria.fr/coaching) : On regarde ton app ou ton projet Claude, écran partagé : ce qui bloque, ce que je change en premier, et dans quel ordre. 100 € la séance d'une heure, en visio, paiement en une fois. Sujets : L'audit de ton app ; Ton travail avec Claude ; Ta fiche et ton paywall ; Un refus d'Apple.
