# ITMS-90717: “Invalid large app icon” oplossen met Expo

> ITMS-90717: je 1024x1024-icoon heeft transparantie of een alfakanaal. Exporteer het ondoorzichtig, check het met sips en maak een nieuwe build.

Originele pagina: [ITMS-90717: “Invalid large app icon” oplossen met Expo](https://devoria.fr/nl/blog/itms-90717-invalid-large-app-icon-expo)
Auteur: [Mehdi Azizi](https://devoria.fr/nl/mehdi-azizi)
Publicatie: 2026-11-04
Laatste inhoudsrevisie: 2026-11-04


ITMS-90717 is een automatische controle die Apple op je build uitvoert. Die meldt dat het grote app-icoon, het icoon van 1024 x 1024 pixels dat de App Store toont, transparantie of een alfakanaal bevat. **De oplossing: een vierkant, ondoorzichtig icoon, geëxporteerd zonder alfakanaal, en daarna een nieuwe build.**

Met Expo is je PNG-bestand zelden de boosdoener: de prebuild zet het al op een witte achtergrond. Ik heb die code gelezen in SDK 57 en de iconen van Solys, TradaZen en Nolera gecontroleerd. De fout komt dan meestal uit een `ios`-map die in versiebeheer staat, of uit een Icon Composer-bestand. Zo vind je welke het is, en zo los je het op.

## Wat betekent de fout ITMS-90717?

De melding heet "ITMS-90717: Invalid large app icon". Er staat in dat het grote icoon in de asset catalog van je app "can't be transparent or contain an alpha channel": het mag niet transparant zijn en geen alfakanaal bevatten. Oudere meldingen spraken van "Invalid App Store Icon". Het is dezelfde regel.

Dat grote icoon is het icoon van de App Store. De [Xcode-documentatie over iconen](https://developer.apple.com/documentation/xcode/configuring-your-app-icon) legt het uit: een app die via de App Store wordt verspreid, moet zijn icoon van 1024 punten in de asset catalog meeleveren.

Het alfakanaal is de vierde laag van een PNG, naast rood, groen en blauw. Daarin staat de transparantie van elke pixel. **Een icoon kan er vol uitzien en toch dat kanaal hebben**: dat is de valkuil die in elke forumdraad terugkomt.

Net als bij de andere ITMS-fouten is dit geen afwijzing door een reviewer. Apple heeft de binary bij de levering geanalyseerd. Afhankelijk van je uploadtool verschijnt de fout als een mislukte validatie, bijvoorbeeld met code 409.

## Je icoon controleren met sips

Op een Mac is `sips` standaard geïnstalleerd. Eén regel is genoeg:

```bash
sips -g hasAlpha assets/icon.png
```

Je wilt `hasAlpha: no` zien. Op 15 oktober 2026 heb ik dit commando gedraaid op de iconen uit de app.json-bestanden van Solys, TradaZen en Nolera: allemaal `no`, in 1024 x 1024.

Ik heb ook een testicoon gemaakt: een volledig ondoorzichtig blauw vierkant, maar opgeslagen met een alfakanaal. `sips` antwoordt `yes`. **Geen enkele pixel is transparant, en toch is het kanaal er.** Daarom schrijven zoveel developers "mijn icoon heeft helemaal geen transparantie" onder deze melding.

In Voorvertoning toont de infovenster (Extra, Toon infovenster) ook de eigenschappen van de afbeelding, waaronder het alfakanaal.

## Oplossen: het icoon exporteren zonder alfakanaal

Drie methodes, van de eenvoudigste tot de preciesste.

**1. Voorvertoning.** Archief, Exporteer, formaat PNG, en vink het vakje Alfa uit. Het geëxporteerde bestand heeft geen alfakanaal meer.

**2. sips, zonder iets te installeren.** `sips` haalt het alfakanaal niet uit een PNG. Je moet via een JPEG, dat er geen heeft:

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

Bij mijn testicoon met transparante hoeken werden de hoeken wit en gaf de laatste regel `no`. De omweg via JPEG comprimeert de afbeelding een beetje, zelfs op maximale kwaliteit: bekijk het resultaat goed.

**3. ImageMagick.** Als je dat geïnstalleerd hebt, kies je zelf de achtergrondkleur:

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

Volgens de [ImageMagick-documentatie](https://imagemagick.org/command-line-options/#alpha) zet `-alpha remove` de afbeelding op de achtergrondkleur, en schakelt `-alpha off` het kanaal uit.

Deze drie methodes vullen de transparantie met een effen kleur. Zweefde je logo op een transparante achtergrond, dan is het netst om het bronbestand te pakken en er een echte achtergrond in te tekenen. Expo vraagt dat in zijn [gids over het app-icoon](https://docs.expo.dev/develop/user-interface/splash-screen-and-app-icon/): het icoon moet het hele vierkant vullen, zonder afgeronde hoeken of transparante pixels. iOS past het masker zelf toe.

## Waar Expo je icoon vandaan haalt, en wat het ermee doet

Expo leest eerst `ios.icon`, daarna het veld `icon` op het hoogste niveau van je configuratie. Volgens de [referentie van de Expo-configuratie](https://docs.expo.dev/versions/latest/config/app/) accepteert `ios.icon` drie vormen: een PNG, een object met varianten `light`, `dark` en `tinted`, of een `.icon`-map gemaakt met Icon Composer.

De tabel hieronder komt uit de code die het iOS-icoon bij de prebuild genereert, `@expo/prebuild-config` 57.0.16 (SDK 57), gelezen op 15 oktober 2026:

| Wat je opgeeft            | Wat de prebuild doet           | Risico ITMS-90717 |
| ------------------------- | ------------------------------ | ----------------- |
| `icon` als PNG            | Op witte achtergrond           | Laag              |
| `ios.icon.light`          | Op witte achtergrond           | Laag              |
| `ios.icon.tinted`         | Op witte achtergrond           | Laag              |
| `ios.icon.dark`           | Transparantie blijft           | Gewild door Apple |
| `ios.icon` als `.icon`    | Ongewijzigd gekopieerd         | Reëel             |
| `ios`-map in versiebeheer | Prebuild niet opnieuw gedraaid | Reëel             |

**Met een PNG haalt Expo zelf de transparantie weg en vervangt die door wit.** Een uitgeknipt logo belandt dus op een wit vierkant: geen fout, maar misschien niet het resultaat dat je wilde. De donkere variant houdt zijn transparantie, en dat is de bedoeling: Apple vraagt een transparante achtergrond voor het donkere icoon, zodat de achtergrond van het systeem zichtbaar wordt.

Bij Nolera, dat alle drie varianten opgeeft, antwoordt `sips` `no` voor het gegenereerde lichte en getinte icoon, en `yes` voor het donkere. Afgaande op de commitdatum van die varianten zitten ze in versie 1.0.2, die online staat. Dat heb ik niet in de IPA gecontroleerd.

### Het geval van de ios-map in versiebeheer

Dit is met Expo de meest waarschijnlijke oorzaak. De [Expo-pagina over continuous native generation](https://docs.expo.dev/workflow/continuous-native-generation/) zegt het: als je project de mappen `android` en `ios` bevat, draait EAS Build de prebuild niet. **Je app.json raakt het icoon dan niet meer aan**: het is de PNG uit de `ios`-map die naar Apple gaat.

Controleer het vanuit de root van je project:

```bash
sips -g hasAlpha ios/*/Images.xcassets/AppIcon.appiconset/*.png
```

Antwoordt het commando `yes` voor het 1024-icoon, vervang dat bestand dan door je ondoorzichtige versie, met dezelfde naam. Heb je niets native met de hand aangepast, dan kun je ook de `ios`-map verwijderen en aan `.gitignore` toevoegen: EAS genereert hem dan bij elke build opnieuw. Bij Solys, TradaZen en Nolera wordt die map door git genegeerd.

## Het iOS 26-formaat: Icon Composer

Icon Composer is de tool van Apple voor de Liquid Glass-iconen van iOS 26. Hij maakt één `.icon`-bestand met meerdere lagen. Volgens [Apples gids over Icon Composer](https://developer.apple.com/documentation/xcode/creating-your-app-icon-using-icon-composer) haalt Xcode er ook de afbeeldingen voor oudere iOS-versies uit.

Expo ondersteunt het sinds SDK 54. Je geeft de map op als tekst, nooit in het object met varianten:

```json
{
  "expo": {
    "ios": {
      "icon": "./assets/app.icon"
    }
  }
}
```

In dat geval kopieert de prebuild de map zonder er iets aan te veranderen, en maakt Xcode het uiteindelijke icoon. Je hebt dus Xcode 26 of hoger nodig, dat van de recente EAS-images, zoals ik uitleg in de gids over [ITMS-90725](https://devoria.fr/nl/blog/itms-90725-sdk-version-issue-expo).

Sinds augustus 2025 melden draadjes op Apples developerforum ITMS-90717 met `.icon`-bestanden. De genoemde oorzaken: een transparante PNG-laag, een laag die groter is dan het canvas, een groep met het Blur-effect vlak bij de rand. De genoemde workarounds: Blur uitzetten, een volle achtergrond houden, of teruggaan naar een PNG. Die draadjes geven geen officiële oplossing van Apple, en de fout werd in augustus 2026 nog steeds gemeld.

[Apples richtlijnen voor iconen](https://developer.apple.com/design/human-interface-guidelines/app-icons) wijzen dezelfde kant op: als je een achtergrondlaag importeert, moet die het hele oppervlak bedekken en ondoorzichtig zijn. Mijn apps gebruiken nog een PNG, dus ik heb Icon Composer niet in productie getest. **Blokkeert een `.icon`-bestand je upload, zet `ios.icon` dan terug op een PNG**: Expo maakt die vlak en je icoon komt door deze controle.

## Het icoon in de uiteindelijke build controleren

In de IPA is het 1024-icoon geen PNG-bestand: Xcode compileert het in `Assets.car`. Download de IPA via de buildpagina op expo.dev en draai:

```bash
unzip -q MyApp.ipa -d ipa
xcrun assetutil --info ipa/Payload/*.app/Assets.car | grep -B3 '"RenditionName" : "App-Icon'
```

Elk icoon toont een veld `Opaque`. Op 15 oktober 2026 heb ik met `actool`, de tool van Xcode, het icoon van Solys en mijn testicoon met transparante hoeken gecompileerd. Het eerste geeft `"Opaque" : true`, het tweede `"Opaque" : false`. Apple documenteert dit veld niet: zie het als een aanwijzing, niet als Apples eigen controle.

Een valkuil om te kennen: **test de kleine PNG's in de root van de app niet met `sips`.** Xcode schrijft die met een alfakanaal, ook als de bron ondoorzichtig is. In mijn test met het icoon van Solys antwoordt `sips` daar `yes`.

## De andere icoonfouten

| Code       | Wat Apple meldt        | Spoor met Expo         |
| ---------- | ---------------------- | ---------------------- |
| ITMS-90717 | 1024-icoon transparant | Exporteren zonder alfa |
| ITMS-90704 | 1024-icoon ontbreekt   | 1024-entry ontbreekt   |
| ITMS-90022 | iPhone-icoon ontbreekt | Catalog onvolledig     |
| ITMS-90023 | iPad-icoon ontbreekt   | Catalog onvolledig     |

De laatste drie meldingen stammen vooral uit 2017 en 2018, toen Xcode 9 de regels voor iconen veranderde.

Met Expo zijn ze zeldzaam geworden. De prebuild schrijft één universeel icoon van 1024, en Xcode genereert de andere formaten. Zonder opgegeven icoon maakt Expo zelfs een wit vierkant, om een mislukte upload te voorkomen. **Krijg je een van deze fouten, kijk dan naar de `ios`-map in versiebeheer**: het bestand `Contents.json` van `AppIcon.appiconset` moet een entry met formaat `1024x1024` bevatten, en de PNG die erin genoemd wordt moet bestaan.

## Voor je volgende upload

Een icoon los je in tien minuten op, maar elke fout kost een build. De andere automatische controles vragen dezelfde nauwkeurigheid, zoals [ITMS-90683](https://devoria.fr/nl/blog/itms-90683-missing-purpose-string-expo) voor de toestemmingsteksten of [ITMS-91053](https://devoria.fr/nl/blog/itms-91053-missing-api-declaration-expo) voor het privacy manifest. Is de build geaccepteerd, installeer hem dan via [TestFlight](https://devoria.fr/nl/blog/testflight-iphone-app-testen-voor-indienen) om je icoon op je beginscherm te zien.

Afwijzingen door een reviewer vragen meer afstand: de aanpak staat op de pagina [app afgewezen door Apple](https://devoria.fr/nl/expertise/app-afgewezen-door-apple), en de meest voorkomende redenen in [waarom Apple een app afwijst](https://devoria.fr/nl/blog/app-afgewezen-door-apple-waarom).

Om je dossier voor de upload te controleren, bundelt de [Review Kit](https://devoria.fr/nl/kits/app-review) mijn checklist en Claude Code-skills die je project nalezen. Loopt je upload vast en wil je een menselijke blik, [boek een uur met mij](https://devoria.fr/nl/coaching): we nemen je project samen door via video, op jouw scherm. En bereid je je eerste release voor, [doe dan de gratis diagnose](https://devoria.fr/nl/diagnostic): die zet de stappen op volgorde en stuurt je mijn checklist tegen afwijzingen door Apple.

## Veelgestelde vragen

### Waarom ziet Apple een alfakanaal terwijl mijn icoon geen transparantie heeft?

Omdat een PNG een alfakanaal kan houden, zelfs als alle pixels ondoorzichtig zijn. Veel tools voegen het standaard toe bij het exporteren. Controleer het met `sips -g hasAlpha` en exporteer het icoon opnieuw zonder dat kanaal.

### Kun je ITMS-90717 oplossen met een update op afstand?

Nee. Het icoon wordt in de binary gecompileerd, in `Assets.car`. Een update op afstand verandert alleen de JavaScript en de resources van de app. Pas het icoon aan, maak een nieuwe build en upload die opnieuw.

### Mag het donkere icoon transparant zijn?

Ja. Apple vraagt een transparante achtergrond voor de donkere variant, en Expo houdt die transparantie. Daaruit leid ik af dat de controle op het hoofdicoon gericht is, dat van de App Store: dat moet ondoorzichtig zijn.

### Moet je de hoeken van het iOS-icoon afronden?

Nee. Lever een vol vierkant aan: iOS past het masker zelf toe. Afgeronde hoeken laten transparante pixels in de hoeken achter, precies wat deze controle weigert.

### Ondersteunt Expo de Icon Composer-iconen van iOS 26?

Ja, sinds SDK 54: geef het pad naar de `.icon`-map op in `ios.icon`, als tekst. De prebuild kopieert hem ongewijzigd en Xcode 26 compileert hem. Krijg je ITMS-90717 met dit formaat, controleer dan de transparante lagen en het Blur-effect, of ga tijdelijk terug naar een PNG.


## Je project

[Review Kit](https://devoria.fr/nl/kits/app-review): Mijn App Store-reviewchecklist, mijn opgeloste afwijzingen door Apple, die voor Google Play en drie Claude Code-skills. € 49.

[iOS & Android Kit](https://devoria.fr/nl/kits/ios): Bouw je iPhone- en Android-app met Claude Code: de startcode van mijn apps, de route naar de stores en alle kits. € 99.

[Diagnose: wat staat er tussen jou en je iPhone-app](https://devoria.fr/nl/diagnostic): 7 vragen, 60 seconden: je weet wat je echt tegenhoudt om je iPhone-app te publiceren, je traject in 4 stappen en de kit die bij je past.
