ITMS-90717: “Invalid large app icon” oplossen met Expo
Door Mehdi Azizi
Gepubliceerd op , 8 min
ITMS-90717: je 1024x1024-icoon heeft transparantie of een alfakanaal. Exporteer het ondoorzichtig, check het met sips en maak een nieuwe build.
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 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:
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:
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:
magick icon.png -background white -alpha remove -alpha off icon-opaque.png
Volgens de ImageMagick-documentatie 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: 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 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 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:
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 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:
{
"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.
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 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:
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 voor de toestemmingsteksten of ITMS-91053 voor het privacy manifest. Is de build geaccepteerd, installeer hem dan via TestFlight 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, en de meest voorkomende redenen in waarom Apple een app afwijst.
Om je dossier voor de upload te controleren, bundelt de Review Kit 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: we nemen je project samen door via video, op jouw scherm. En bereid je je eerste release voor, doe dan de gratis diagnose: 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.

