# ITMS-90717: rezolvă „Invalid large app icon” cu Expo

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

Pagina originală: [ITMS-90717: rezolvă „Invalid large app icon” cu Expo](https://devoria.fr/ro/blog/itms-90717-invalid-large-app-icon-expo)
Autor: [Mehdi Azizi](https://devoria.fr/ro/mehdi-azizi)
Publicare: 2026-11-04
Ultima revizuire a conținutului: 2026-11-04


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

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

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

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:

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

Conform [documentației ImageMagick](https://imagemagick.org/command-line-options/#alpha), `-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](https://docs.expo.dev/develop/user-interface/splash-screen-and-app-icon/): 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](https://docs.expo.dev/versions/latest/config/app/), `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ă](https://docs.expo.dev/workflow/continuous-native-generation/) 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:

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

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

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

```bash
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](https://devoria.fr/ro/blog/itms-90683-missing-purpose-string-expo) pentru textele de permisiune sau [ITMS-91053](https://devoria.fr/ro/blog/itms-91053-missing-api-declaration-expo) pentru manifestul de confidențialitate. După ce build-ul e acceptat, instalează-l cu [TestFlight](https://devoria.fr/ro/blog/testflight-testare-aplicatie-iphone) 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](https://devoria.fr/ro/expertise/aplicatie-respinsa-de-apple), iar motivele cele mai frecvente sunt în [de ce respinge Apple o aplicație](https://devoria.fr/ro/blog/aplicatie-respinsa-apple-cazuri-reale).

Ca să-ți verifici proiectul înainte de upload, [Review Kit](https://devoria.fr/ro/kits/app-review) 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](https://devoria.fr/ro/coaching): reluăm proiectul tău pe video, pe ecranul tău. Și dacă îți pregătești prima lansare, [fă diagnosticul gratuit](https://devoria.fr/ro/diagnostic): îț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.


## Proiectul tău

[Review Kit](https://devoria.fr/ro/kits/app-review): Checklistul meu de review App Store, respingerile mele de la Apple rezolvate, checklistul pentru Google Play și trei skilluri Claude Code. 259 RON.

[iOS & Android Kit](https://devoria.fr/ro/kits/ios): Creează-ți aplicația de iPhone și Android cu Claude Code: codul de pornire al aplicațiilor mele, drumul până în store-uri și toate kiturile. 529 RON.

[Diagnostic: ce te desparte de aplicația ta de iPhone](https://devoria.fr/ro/diagnostic): 7 întrebări, 60 de secunde: afli ce te blochează de fapt să-ți publici aplicația de iPhone, traseul tău în 4 etape și kitul potrivit pentru tine.
