ITMS-90717: jak naprawić Invalid large app icon w Expo
Autor: Mehdi Azizi
Opublikowano , 8 min
ITMS-90717: ikona 1024 x 1024 w twoim buildzie ma przezroczystość lub kanał alfa. Wyeksportuj ją bez alfy, sprawdź przez sips i zrób nowy build.
ITMS-90717 to automatyczna kontrola Apple na twoim buildzie. Mówi, że duża ikona aplikacji, ta 1024 x 1024 piksele wyświetlana w App Store, zawiera przezroczystość albo kanał alfa. Rozwiązanie: kwadratowa, nieprzezroczysta ikona wyeksportowana bez kanału alfa, a potem nowy build.
W Expo twój plik PNG rzadko jest winowajcą: prebuild i tak kładzie go na białym tle. Przeczytałem ten kod w SDK 57 i sprawdziłem ikony Solys, TradaZen i Nolera. Błąd bierze się wtedy najczęściej z wersjonowanego folderu ios albo z pliku Icon Composer. Oto jak ustalić, z którego, i jak to naprawić.
Co oznacza błąd ITMS-90717?
Komunikat ma tytuł „ITMS-90717: Invalid large app icon”. Precyzuje, że duża ikona w katalogu zasobów twojej aplikacji „can't be transparent or contain an alpha channel”: nie może być przezroczysta ani mieć kanału alfa. Starsze komunikaty mówiły o „Invalid App Store Icon”. To ta sama reguła.
Ta duża ikona to ikona z App Store. Wyjaśnia to dokumentacja Xcode o ikonach: aplikacja dystrybuowana w App Store musi mieć w katalogu zasobów ikonę 1024 punktów.
Kanał alfa to czwarta warstwa PNG, obok czerwonego, zielonego i niebieskiego. Przechowuje przezroczystość każdego piksela. Ikona może wyglądać na pełną i nadal mieć ten kanał: to pułapka, która wraca w każdym wątku na forach.
Jak inne błędy ITMS, to nie jest odrzucenie przez recenzenta. Apple przeanalizowało plik binarny przy wysyłce. Zależnie od narzędzia błąd pojawia się jako nieudana walidacja, na przykład z kodem 409.
Sprawdź ikonę przez sips
Na Macu sips jest zainstalowany domyślnie. Wystarczy jedna linia:
sips -g hasAlpha assets/icon.png
Chcesz zobaczyć hasAlpha: no. 15 października 2026 uruchomiłem tę komendę na ikonach zadeklarowanych w app.json Solys, TradaZen i Nolera: wszystkie odpowiadają no, w rozmiarze 1024 x 1024.
Zrobiłem też ikonę testową: niebieski kwadrat, całkowicie nieprzezroczysty, ale zapisany z kanałem alfa. sips odpowiada yes. Żaden piksel nie jest przezroczysty, a kanał i tak jest. Dlatego tylu deweloperów pisze pod tym komunikatem „moja ikona nie ma żadnej przezroczystości”.
W Podglądzie (Preview) inspektor (Tools, Show Inspector) też pokazuje właściwości obrazu, w tym kanał alfa.
Naprawa: eksport ikony bez kanału alfa
Trzy metody, od najprostszej do najdokładniejszej.
1. Podgląd (Preview). File, Export, format PNG, potem odznacz pole Alpha. Wyeksportowany plik nie ma już kanału alfa.
2. sips, bez instalowania czegokolwiek. sips nie usuwa kanału alfa z PNG. Trzeba przejść przez JPEG, który go nie ma:
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
Na mojej ikonie testowej z przezroczystymi rogami rogi zrobiły się białe, a ostatnia linia odpowiada no. Przejście przez JPEG trochę kompresuje obraz, nawet przy maksymalnej jakości: przyjrzyj się wynikowi z bliska.
3. ImageMagick. Jeśli go masz, wybierasz kolor tła:
magick icon.png -background white -alpha remove -alpha off icon-opaque.png
Według dokumentacji ImageMagick -alpha remove kładzie obraz na kolorze tła, a -alpha off wyłącza kanał.
Te trzy metody wypełniają przezroczystość jednolitym kolorem. Jeśli twoje logo wisiało na przezroczystym tle, najczyściej jest wrócić do pliku źródłowego i narysować prawdziwe tło. Expo wymaga tego w swoim przewodniku po ikonie aplikacji: ikona musi wypełniać cały kwadrat, bez zaokrąglonych rogów i przezroczystych pikseli. iOS sam nakłada maskę.
Skąd Expo bierze ikonę i co z nią robi
Expo czyta najpierw ios.icon, potem pole icon w głównej części konfiguracji. Według dokumentacji konfiguracji Expo ios.icon przyjmuje trzy formy: PNG, obiekt z wariantami light, dark i tinted albo folder .icon utworzony w Icon Composer.
Poniższa tabela pochodzi z kodu, który generuje ikonę iOS przy prebuildzie, @expo/prebuild-config 57.0.16 (SDK 57), czytanego 15 października 2026:
| Co deklarujesz | Co robi prebuild | Ryzyko ITMS-90717 |
|---|---|---|
icon jako PNG | Spłaszcza na białym tle | Niskie |
ios.icon.light | Spłaszcza na białym tle | Niskie |
ios.icon.tinted | Spłaszcza na białym tle | Niskie |
ios.icon.dark | Zachowuje przezroczystość | Zamierzone przez Apple |
ios.icon jako .icon | Kopiuje bez zmian | Realne |
Wersjonowany folder ios | Prebuild się nie uruchamia | Realne |
Z PNG Expo samo usuwa przezroczystość i zastępuje ją bielą. Wycięte logo ląduje więc na białym kwadracie: błędu nie ma, ale efekt może nie być tym, czego chciałeś. Wariant ciemny zachowuje przezroczystość i to celowe: Apple wymaga przezroczystego tła dla ciemnej ikony, żeby było widać tło dostarczane przez system.
W Nolerze, która deklaruje trzy warianty, sips odpowiada no dla wygenerowanej ikony jasnej i tinted, yes dla ciemnej. Sądząc po dacie commita z tymi wariantami, opublikowana wersja 1.0.2 je zawiera. Nie sprawdziłem tego w jej IPA.
Przypadek wersjonowanego folderu ios
To najbardziej prawdopodobna przyczyna w Expo. Strona Expo o continuous native generation mówi wprost: jeśli projekt zawiera foldery android i ios, EAS Build nie uruchamia prebuilda. Twój app.json przestaje wtedy wpływać na ikonę: do Apple trafia PNG z folderu ios.
Sprawdź to z katalogu głównego projektu:
sips -g hasAlpha ios/*/Images.xcassets/AppIcon.appiconset/*.png
Jeśli komenda odpowiada yes dla ikony 1024, zastąp ten plik nieprzezroczystą wersją, pod tą samą nazwą. Jeśli nie robiłeś ręcznie żadnych zmian natywnych, możesz też usunąć folder ios i dodać go do .gitignore: EAS wygeneruje go przy każdym buildzie. W Solys, TradaZen i Nolerze ten folder jest ignorowany przez git.
Format iOS 26: Icon Composer
Icon Composer to narzędzie Apple do ikon Liquid Glass w iOS 26. Tworzy jeden plik .icon z wieloma warstwami. Według przewodnika Apple po Icon Composer Xcode generuje z niego też obrazy dla starszych wersji iOS.
Expo obsługuje go od SDK 54. Folder deklarujesz jako tekst, nigdy w obiekcie wariantów:
{
"expo": {
"ios": {
"icon": "./assets/app.icon"
}
}
}
W tym przypadku prebuild kopiuje folder bez zmian, a ostateczną ikonę tworzy Xcode. Potrzebujesz więc Xcode 26 lub nowszego, tego z nowszych obrazów EAS, jak tłumaczę w poradniku o ITMS-90725.
Od sierpnia 2025 na forum deweloperów Apple pojawiają się wątki o ITMS-90717 z plikami .icon. Zgłaszane tropy: przezroczysta warstwa PNG, warstwa większa niż płótno, grupa z efektem Blur blisko krawędzi. Wymieniane obejścia: wyłączyć Blur, zostawić pełne tło albo wrócić do PNG. Te wątki nie podają żadnej oficjalnej poprawki od Apple, a błąd był zgłaszany jeszcze w sierpniu 2026.
Zasady Apple dotyczące ikon idą w tym kierunku: jeśli importujesz warstwę tła, musi pokrywać całą powierzchnię i być nieprzezroczysta. Moje aplikacje wciąż używają PNG, więc nie testowałem Icon Composer na produkcji. Jeśli plik .icon blokuje wysyłkę, przełącz ios.icon z powrotem na PNG: Expo go spłaszczy, a ikona przejdzie tę kontrolę.
Sprawdź ikonę w finalnym buildzie
W IPA ikona 1024 nie jest plikiem PNG: Xcode kompiluje ją do Assets.car. Pobierz IPA ze strony buildu na expo.dev, a potem uruchom:
unzip -q MyApp.ipa -d ipa
xcrun assetutil --info ipa/Payload/*.app/Assets.car | grep -B3 '"RenditionName" : "App-Icon'
Każda ikona pokazuje pole Opaque. 15 października 2026 skompilowałem przez actool, narzędzie Xcode, ikonę Solys i moją ikonę testową z przezroczystymi rogami. Pierwsza wychodzi jako "Opaque" : true, druga jako "Opaque" : false. Apple nie dokumentuje tego pola: traktuj je jako wskazówkę, nie jako kontrolę Apple.
Pułapka, o której warto wiedzieć: nie testuj przez sips małych plików PNG w katalogu głównym aplikacji. Xcode zapisuje je z kanałem alfa, nawet gdy źródło jest nieprzezroczyste. W moim teście z ikoną Solys sips odpowiada dla nich yes.
Inne błędy ikon
| Kod | Co zgłasza Apple | Trop w Expo |
|---|---|---|
| ITMS-90717 | Przezroczysta ikona 1024 | Eksport bez alfy |
| ITMS-90704 | Brak ikony 1024 | Brak wpisu 1024 |
| ITMS-90022 | Brak ikony iPhone | Niepełny katalog |
| ITMS-90023 | Brak ikony iPad | Niepełny katalog |
Trzy ostatnie komunikaty pochodzą głównie z lat 2017 i 2018, kiedy Xcode 9 zmienił zasady dotyczące ikon.
W Expo stały się rzadkie. Prebuild zapisuje jedną uniwersalną ikonę 1024, a Xcode generuje pozostałe rozmiary. Bez zadeklarowanej ikony Expo tworzy nawet biały kwadrat, żeby uniknąć błędu przy wysyłce. Jeśli trafi cię któryś z tych błędów, zajrzyj do wersjonowanego folderu ios: plik Contents.json w AppIcon.appiconset musi zawierać wpis o rozmiarze 1024x1024, a wskazany w nim PNG musi istnieć.
Przed następną wysyłką
Ikonę poprawisz w dziesięć minut, ale każdy błąd kosztuje build. Inne automatyczne kontrole wymagają tej samej staranności, na przykład ITMS-90683 dla opisów uprawnień czy ITMS-91053 dla manifestu prywatności. Gdy build zostanie przyjęty, zainstaluj go przez TestFlight, żeby zobaczyć ikonę na ekranie głównym.
Odrzucenia przez recenzenta wymagają więcej dystansu: sposób postępowania jest na stronie aplikacja odrzucona przez Apple, a najczęstsze powody w artykule dlaczego Apple odrzuca aplikację.
Żeby sprawdzić swoje zgłoszenie przed wysyłką, Review Kit zbiera moją checklistę i skille Claude Code, które przeglądają twój projekt. Jeśli wysyłka stoi i chcesz, żeby spojrzał na to człowiek, zarezerwuj ze mną godzinę: przejdziemy przez twój projekt na wideorozmowie, na twoim ekranie. A jeśli szykujesz pierwsze wydanie, zrób darmową diagnozę: ułoży kroki we właściwej kolejności i wyśle ci moją checklistę przeciw odrzuceniom przez Apple.
Najczęściej zadawane pytania
Dlaczego Apple widzi kanał alfa, skoro moja ikona nie ma żadnej przezroczystości?
Bo PNG może mieć kanał alfa, nawet gdy wszystkie piksele są nieprzezroczyste. Wiele narzędzi dodaje go domyślnie przy eksporcie. Sprawdź przez sips -g hasAlpha, a potem wyeksportuj ikonę ponownie bez tego kanału.
Czy można naprawić ITMS-90717 aktualizacją zdalną?
Nie. Ikona jest skompilowana w pliku binarnym, w Assets.car. Aktualizacja zdalna zmienia tylko JavaScript i zasoby aplikacji. Popraw ikonę, zrób nowy build i wyślij go ponownie.
Czy ciemna ikona może być przezroczysta?
Tak. Apple wymaga przezroczystego tła dla wariantu ciemnego, a Expo zachowuje jego przezroczystość. Wnioskuję z tego, że kontrola dotyczy głównej ikony, tej z App Store: to ona musi być nieprzezroczysta.
Czy trzeba zaokrąglać rogi ikony iOS?
Nie. Dostarcz pełny kwadrat: iOS sam nakłada maskę. Zaokrąglone rogi zostawiają przezroczyste piksele w narożnikach, czyli dokładnie to, czego ta kontrola nie akceptuje.
Czy Expo obsługuje ikony Icon Composer z iOS 26?
Tak, od SDK 54: zadeklaruj ścieżkę do folderu .icon w ios.icon, jako tekst. Prebuild kopiuje go bez zmian, a Xcode 26 go kompiluje. Jeśli przy tym formacie pojawi się ITMS-90717, sprawdź przezroczyste warstwy i efekt Blur albo tymczasowo wróć do PNG.

