ITMS-90717: rezolvă „Invalid large app icon” cu Expo
De Mehdi Azizi
Publicat pe , 8 min.
ITMS-90717: iconița de 1024 x 1024 din build are transparență sau canal alpha. Export-o opacă, verifică cu sips, apoi refă build-ul.
ITMS-90717 e o verificare automată pe care Apple o face pe build-ul tău. Îți spune că iconița mare a aplicației, cea de 1024 x 1024 pixeli afișată în App Store, conține transparență sau un canal alpha. Soluția: o iconiță pătrată și opacă, exportată fără canal alpha, apoi un build nou.
Cu Expo, fișierul tău PNG e rar vinovatul: prebuild-ul îl pune deja pe un fundal alb. Am citit codul ăsta în SDK 57 și am verificat iconițele de la Solys, TradaZen și Nolera. Eroarea vine atunci de cele mai multe ori dintr-un folder ios versionat sau dintr-un fișier Icon Composer. Uite cum găsești care dintre ele e, și cum o repari.
Ce înseamnă eroarea ITMS-90717?
Mesajul se numește „ITMS-90717: Invalid large app icon”. Precizează că iconița mare din catalogul de imagini al aplicației tale „can't be transparent or contain an alpha channel”: nu poate fi transparentă și nici nu poate conține canal alpha. Mesajele mai vechi vorbeau de „Invalid App Store Icon”. E aceeași regulă.
Iconița asta mare e cea din App Store. Documentația Xcode despre iconițe explică: o aplicație distribuită în App Store trebuie să-și furnizeze iconița de 1024 de puncte în catalogul de imagini.
Canalul alpha e al patrulea strat al unui PNG, pe lângă roșu, verde și albastru. Stochează transparența fiecărui pixel. O iconiță poate părea plină și totuși să păstreze canalul ăsta: e capcana care apare în toate thread-urile de pe forumuri.
Ca la celelalte erori ITMS, nu e respingerea unui reviewer. Apple a analizat binarul la livrare. În funcție de unealta de upload, eroarea apare ca un eșec de validare, de exemplu cu codul 409.
Verifică-ți iconița cu sips
Pe Mac, sips e instalat din fabrică. O singură linie ajunge:
sips -g hasAlpha assets/icon.png
Vrei să vezi hasAlpha: no. Pe 15 octombrie 2026, am rulat comanda asta pe iconițele declarate în app.json-urile de la Solys, TradaZen și Nolera: toate răspund no, la 1024 x 1024.
Am făcut și o iconiță de test: un pătrat albastru complet opac, dar salvat cu canal alpha. sips răspunde yes. Niciun pixel nu e transparent, și totuși canalul e acolo. De asta atâția developeri scriu „iconița mea n-are nicio transparență” sub mesajul ăsta.
În Preview, inspectorul (Tools, Show Inspector) listează și proprietățile imaginii, inclusiv canalul alpha.
Rezolvarea: exportă iconița fără canal alpha
Trei metode, de la cea mai simplă la cea mai precisă.
1. Preview. File, Export, format PNG, apoi debifează căsuța Alpha. Fișierul exportat nu mai are canal alpha.
2. sips, fără să instalezi nimic. sips nu scoate canalul alpha dintr-un PNG. Trebuie să treci printr-un JPEG, care nu are așa ceva:
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
Pe iconița mea de test cu colțuri transparente, colțurile au devenit albe și ultima linie răspunde no. Trecerea prin JPEG comprimă puțin imaginea, chiar și la calitate maximă: uită-te atent la rezultat.
3. ImageMagick. Dacă îl ai instalat, alegi tu culoarea de fundal:
magick icon.png -background white -alpha remove -alpha off icon-opaque.png
Conform documentației ImageMagick, -alpha remove pune imaginea pe culoarea de fundal, iar -alpha off dezactivează canalul.
Toate trei metodele umplu transparența cu o culoare uniformă. Dacă logo-ul tău plutea pe un fundal transparent, cel mai curat e să reiei fișierul sursă și să desenezi un fundal adevărat. Expo cere asta în ghidul despre iconița aplicației: iconița trebuie să umple tot pătratul, fără colțuri rotunjite și fără pixeli transparenți. iOS aplică singur masca.
De unde ia Expo iconița, și ce face cu ea
Expo citește întâi ios.icon, apoi câmpul icon de la rădăcina configurației. Conform referinței de configurare Expo, ios.icon acceptă trei forme: un PNG, un obiect cu variantele light, dark și tinted, sau un folder .icon creat cu Icon Composer.
Tabelul de mai jos vine din codul care generează iconița iOS la prebuild, @expo/prebuild-config 57.0.16 (SDK 57), citit pe 15 octombrie 2026:
| Ce declari | Ce face prebuild-ul | Risc ITMS-90717 |
|---|---|---|
icon ca PNG | Aplatizat pe fundal alb | Mic |
ios.icon.light | Aplatizat pe fundal alb | Mic |
ios.icon.tinted | Aplatizat pe fundal alb | Mic |
ios.icon.dark | Transparența păstrată | Cerut de Apple |
ios.icon ca .icon | Copiat ca atare | Real |
Folder ios versionat | Prebuild-ul nu mai rulează | Real |
Cu un PNG, Expo scoate singur transparența și o înlocuiește cu alb. Un logo decupat ajunge deci pe un pătrat alb: nicio eroare, dar un rezultat pe care poate nu ți l-ai dorit. Varianta întunecată își păstrează transparența, și e intenționat: Apple cere fundal transparent pentru iconița întunecată, ca să apară fundalul oferit de sistem.
Pe Nolera, care declară toate trei variantele, sips răspunde no pentru iconița luminoasă și cea tinted generate, yes pentru cea întunecată. După data commit-ului cu variantele astea, versiunea 1.0.2, publicată, le include. N-am verificat asta în IPA-ul ei.
Cazul folderului ios versionat
E cauza cea mai probabilă cu Expo. Pagina Expo despre generarea nativă continuă o spune: dacă proiectul tău conține folderele android și ios, EAS Build nu rulează prebuild-ul. app.json-ul tău nu mai atinge atunci iconița: la Apple pleacă PNG-ul din folderul ios.
Verifică asta din rădăcina proiectului:
sips -g hasAlpha ios/*/Images.xcassets/AppIcon.appiconset/*.png
Dacă comanda răspunde yes pentru iconița de 1024, înlocuiește fișierul cu versiunea ta opacă, cu același nume. Dacă n-ai făcut nicio modificare nativă de mână, poți și să ștergi folderul ios și să-l adaugi în .gitignore: EAS îl va regenera la fiecare build. La Solys, TradaZen și Nolera, folderul ăsta e ignorat de git.
Formatul iOS 26: Icon Composer
Icon Composer e unealta Apple pentru iconițele Liquid Glass din iOS 26. Produce un singur fișier .icon cu mai multe straturi. Conform ghidului Apple despre Icon Composer, Xcode extrage din el și imaginile pentru versiunile mai vechi de iOS.
Expo îl suportă din SDK 54. Declari folderul ca text, niciodată în obiectul de variante:
{
"expo": {
"ios": {
"icon": "./assets/app.icon"
}
}
}
În cazul ăsta, prebuild-ul copiază folderul fără să-l atingă, iar Xcode construiește iconița finală. Îți trebuie deci Xcode 26 sau mai nou, cel din imaginile EAS recente, cum explic în ghidul despre ITMS-90725.
Din august 2025, pe forumul developerilor Apple, mai multe thread-uri semnalează ITMS-90717 cu fișiere .icon. Pistele raportate: un strat PNG transparent, un strat mai mare decât canvas-ul, un grup cu efectul Blur aproape de margine. Soluțiile de ocolire citate: dezactivezi Blur, păstrezi un fundal plin sau revii la un PNG. Thread-urile astea nu dau nicio rezolvare oficială de la Apple, iar eroarea era încă semnalată în august 2026.
Regulile Apple despre iconițe merg în aceeași direcție: dacă imporți un strat de fundal, trebuie să acopere toată suprafața și să fie opac. Aplicațiile mele folosesc încă un PNG, deci n-am testat Icon Composer în producție. Dacă un fișier .icon îți blochează upload-ul, treci ios.icon înapoi pe un PNG: Expo îl va aplatiza, iar iconița ta va trece de verificare.
Verifică iconița în build-ul final
În IPA, iconița de 1024 nu e un fișier PNG: Xcode o compilează în Assets.car. Descarcă IPA-ul de pe pagina build-ului de pe expo.dev, apoi rulează:
unzip -q MyApp.ipa -d ipa
xcrun assetutil --info ipa/Payload/*.app/Assets.car | grep -B3 '"RenditionName" : "App-Icon'
Fiecare iconiță afișează un câmp Opaque. Pe 15 octombrie 2026, am compilat cu actool, unealta din Xcode, iconița de la Solys și iconița mea de test cu colțuri transparente. Prima iese "Opaque" : true, a doua "Opaque" : false. Apple nu documentează câmpul ăsta: ia-l ca pe un indiciu, nu ca pe verificarea Apple.
O capcană de știut: nu testa cu sips PNG-urile mici de la rădăcina aplicației. Xcode le scrie cu canal alpha, chiar și când sursa e opacă. În testul meu cu iconița de la Solys, sips răspunde yes pentru ele.
Celelalte erori de iconiță
| Cod | Ce semnalează Apple | Pistă cu Expo |
|---|---|---|
| ITMS-90717 | Iconița 1024 transparentă | Export fără alpha |
| ITMS-90704 | Iconița 1024 lipsește | Lipsește intrarea 1024 |
| ITMS-90022 | Iconița iPhone lipsește | Catalog incomplet |
| ITMS-90023 | Iconița iPad lipsește | Catalog incomplet |
Ultimele trei mesaje datează mai ales din 2017 și 2018, când Xcode 9 a schimbat regulile pentru iconițe.
Cu Expo, au devenit rare. Prebuild-ul scrie o singură iconiță universală de 1024, iar Xcode generează celelalte dimensiuni. Fără iconiță declarată, Expo creează chiar un pătrat alb, ca să evite un eșec la upload. Dacă dai de una dintre erorile astea, uită-te în folderul ios versionat: fișierul Contents.json din AppIcon.appiconset trebuie să conțină o intrare de dimensiune 1024x1024, iar PNG-ul la care trimite trebuie să existe.
Înainte de următorul upload
O iconiță se repară în zece minute, dar fiecare eroare te costă un build. Celelalte verificări automate cer aceeași rigoare, cum ar fi ITMS-90683 pentru textele de permisiune sau ITMS-91053 pentru manifestul de confidențialitate. După ce build-ul e acceptat, instalează-l cu TestFlight ca să-ți vezi iconița pe ecranul principal.
Respingerile unui reviewer cer mai mult calm: pașii sunt pe pagina despre aplicația respinsă de Apple, iar motivele cele mai frecvente sunt în de ce respinge Apple o aplicație.
Ca să-ți verifici proiectul înainte de upload, Review Kit adună checklist-ul meu și skill-uri Claude Code care îți recitesc proiectul. Dacă upload-ul se blochează și vrei o privire umană, rezervă o oră cu mine: reluăm proiectul tău pe video, pe ecranul tău. Și dacă îți pregătești prima lansare, fă diagnosticul gratuit: îți pune pașii în ordine și îți trimite checklist-ul meu anti-respingere Apple.
Întrebări frecvente
De ce vede Apple un canal alpha când iconița mea n-are nicio transparență?
Pentru că un PNG poate păstra un canal alpha chiar și când toți pixelii sunt opaci. Multe unelte îl adaugă implicit la export. Verifică cu sips -g hasAlpha, apoi reexportă iconița fără canalul ăsta.
Pot repara ITMS-90717 cu un update de la distanță?
Nu. Iconița e compilată în binar, în Assets.car. Un update de la distanță schimbă doar JavaScript-ul și resursele aplicației. Repară iconița, refă build-ul, apoi trimite-l din nou.
Poate iconița întunecată să fie transparentă?
Da. Apple cere fundal transparent pentru varianta întunecată, iar Expo îi păstrează transparența. De aici deduc că verificarea vizează iconița principală, cea din App Store: ea trebuie să fie opacă.
Trebuie să rotunjesc colțurile iconiței iOS?
Nu. Dă un pătrat plin: iOS aplică singur masca. Colțurile rotunjite lasă pixeli transparenți în colțuri, exact ce respinge verificarea asta.
Suportă Expo iconițele Icon Composer din iOS 26?
Da, din SDK 54: declară calea folderului .icon în ios.icon, ca text. Prebuild-ul îl copiază ca atare și Xcode 26 îl compilează. Dacă primești ITMS-90717 cu formatul ăsta, verifică straturile transparente și efectul Blur, sau revino temporar la un PNG.

