ITMS-90717: как исправить Invalid large app icon в Expo
Автор: Mehdi Azizi
Опубликовано , 8 мин
ITMS-90717: в иконке 1024 x 1024 твоего билда осталась прозрачность или альфа-канал. Экспортируй её непрозрачной, проверь через sips и пересобери билд.
ITMS-90717 это автоматическая проверка Apple, которую проходит твой билд. Она сообщает, что большая иконка приложения, та самая 1024 x 1024 пикселя, которую показывает App Store, содержит прозрачность или альфа-канал. Решение: квадратная непрозрачная иконка, экспортированная без альфа-канала, и новый билд.
С Expo виноват редко сам PNG-файл: prebuild уже кладёт его на белый фон. Я прочитал этот код в SDK 57 и проверил иконки Solys, TradaZen и Nolera. Чаще всего ошибка приходит из папки ios, которая лежит в git, или из файла Icon Composer. Ниже расскажу, как понять, откуда именно, и как это исправить.
Что значит ошибка ITMS-90717?
Сообщение называется «ITMS-90717: Invalid large app icon». В нём уточняется, что большая иконка в каталоге изображений твоего приложения «can't be transparent or contain an alpha channel»: она не может быть прозрачной или содержать альфа-канал. В старых сообщениях писали «Invalid App Store Icon». Правило то же самое.
Эта большая иконка и есть иконка для App Store. Об этом говорит документация Xcode по иконкам: приложение, которое распространяется через App Store, должно содержать иконку 1024 точки в своём каталоге изображений.
Альфа-канал это четвёртый слой PNG, рядом с красным, зелёным и синим. В нём хранится прозрачность каждого пикселя. Иконка может выглядеть полностью залитой и всё равно хранить этот канал: именно на эту ловушку жалуются во всех ветках форумов.
Как и другие ошибки ITMS, это не отказ ревьюера. Apple проанализировала бинарник при загрузке. В зависимости от инструмента отправки ошибка выглядит как сбой валидации, например с кодом 409.
Проверь иконку через sips
На Mac sips установлен по умолчанию. Хватит одной строки:
sips -g hasAlpha assets/icon.png
Тебе нужно увидеть hasAlpha: no. 15 октября 2026 года я запустил эту команду на иконках, указанных в app.json у Solys, TradaZen и Nolera: все ответили no, в размере 1024 x 1024.
Ещё я сделал тестовую иконку: полностью непрозрачный синий квадрат, но сохранённый с альфа-каналом. sips отвечает yes. Ни один пиксель не прозрачный, а канал всё равно есть. Поэтому столько разработчиков пишут под этим сообщением «в моей иконке нет никакой прозрачности».
В Preview инспектор (Tools, Show Inspector) тоже показывает свойства изображения, включая альфа-канал.
Исправление: экспорт иконки без альфа-канала
Три способа, от самого простого к самому точному.
1. Preview. File, Export, формат PNG, затем сними галочку Alpha. У экспортированного файла больше нет альфа-канала.
2. sips, без установки чего-либо. sips не умеет убирать альфа-канал из PNG. Придётся пройти через JPEG, у которого его нет:
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
На моей тестовой иконке с прозрачными углами углы стали белыми, а последняя строка ответила no. Проход через JPEG немного сжимает картинку даже на максимальном качестве: внимательно посмотри на результат.
3. ImageMagick. Если он у тебя установлен, ты сам выбираешь цвет фона:
magick icon.png -background white -alpha remove -alpha off icon-opaque.png
Согласно документации ImageMagick, -alpha remove кладёт изображение на цвет фона, а -alpha off отключает канал.
Все три способа заливают прозрачность сплошным цветом. Если твой логотип висел на прозрачном фоне, чище всего взять исходник и нарисовать в нём нормальный фон. Expo прямо требует этого в своём гайде по иконке приложения: иконка должна заполнять весь квадрат, без скруглённых углов и прозрачных пикселей. Маску iOS накладывает сама.
Где Expo берёт иконку и что с ней делает
Expo сначала читает ios.icon, потом поле icon в корне конфигурации. Согласно справочнику по конфигурации Expo, ios.icon принимает три формы: PNG, объект с вариантами light, dark и tinted, или папку .icon, созданную в Icon Composer.
Следующая таблица составлена по коду, который генерирует иконку iOS при prebuild, @expo/prebuild-config 57.0.16 (SDK 57), прочитан 15 октября 2026 года:
| Что ты указываешь | Что делает prebuild | Риск ITMS-90717 |
|---|---|---|
icon в PNG | Сводит на белый фон | Низкий |
ios.icon.light | Сводит на белый фон | Низкий |
ios.icon.tinted | Сводит на белый фон | Низкий |
ios.icon.dark | Сохраняет прозрачность | Так хочет Apple |
ios.icon в .icon | Копирует как есть | Реальный |
Папка ios в git | Prebuild не запускается | Реальный |
С PNG Expo сам убирает прозрачность и заменяет её белым. Логотип без фона в итоге окажется на белом квадрате: ошибки не будет, но результат может оказаться не тем, что ты хотел. Тёмный вариант сохраняет прозрачность, и это задумано: Apple требует прозрачный фон для тёмной иконки, чтобы был виден системный фон.
В Nolera, где указаны все три варианта, sips отвечает no для сгенерированных светлой и тонированной иконок и yes для тёмной. Судя по дате коммита с этими вариантами, они входят в опубликованную версию 1.0.2. В её IPA я это не проверял.
Случай с папкой ios в git
С Expo это самая вероятная причина. На странице Expo о continuous native generation сказано: если в проекте есть папки android и ios, EAS Build не запускает prebuild. Тогда твой app.json больше не влияет на иконку: в Apple уходит PNG из папки ios.
Проверь это из корня проекта:
sips -g hasAlpha ios/*/Images.xcassets/AppIcon.appiconset/*.png
Если команда отвечает yes для иконки 1024, замени этот файл непрозрачной версией с тем же именем. Если ты ничего не менял в нативной части руками, можно просто удалить папку ios и добавить её в .gitignore: EAS будет генерировать её заново при каждом билде. В Solys, TradaZen и Nolera эта папка игнорируется git.
Формат iOS 26: Icon Composer
Icon Composer это инструмент Apple для иконок Liquid Glass в iOS 26. Он создаёт один многослойный файл .icon. Согласно гайду Apple по Icon Composer, Xcode также получает из него изображения для более старых версий iOS.
Expo поддерживает его начиная с SDK 54. Путь к папке указывается строкой, никогда не в объекте вариантов:
{
"expo": {
"ios": {
"icon": "./assets/app.icon"
}
}
}
В этом случае prebuild копирует папку, ничего в ней не трогая, а финальную иконку собирает Xcode. Значит, нужен Xcode 26 или новее, тот, что стоит в свежих образах EAS, как я объясняю в гайде по ITMS-90725.
С августа 2025 года на форуме разработчиков Apple появляются ветки про ITMS-90717 с файлами .icon. Возможные причины, о которых пишут: прозрачный PNG-слой, слой больше холста, группа с эффектом Blur у края. Обходные пути: отключить Blur, оставить сплошной фон или вернуться к PNG. Официального исправления от Apple в этих ветках нет, и в августе 2026 года об ошибке всё ещё сообщали.
Правила Apple для иконок говорят о том же: если ты импортируешь фоновый слой, он должен покрывать всю площадь и быть непрозрачным. Мои приложения пока используют PNG, так что Icon Composer в продакшене я не тестировал. Если файл .icon блокирует отправку, переключи ios.icon обратно на PNG: Expo его сведёт, и иконка пройдёт эту проверку.
Проверь иконку в финальном билде
В IPA иконка 1024 лежит не PNG-файлом: Xcode компилирует её в Assets.car. Скачай IPA со страницы билда на expo.dev и запусти:
unzip -q MyApp.ipa -d ipa
xcrun assetutil --info ipa/Payload/*.app/Assets.car | grep -B3 '"RenditionName" : "App-Icon'
У каждой иконки есть поле Opaque. 15 октября 2026 года я скомпилировал через actool, инструмент Xcode, иконку Solys и свою тестовую иконку с прозрачными углами. Первая выдала "Opaque" : true, вторая "Opaque" : false. Apple это поле не документирует: считай его подсказкой, а не проверкой Apple.
Есть ловушка: не проверяй через sips маленькие PNG в корне приложения. Xcode записывает их с альфа-каналом, даже если исходник непрозрачный. В моём тесте с иконкой Solys sips отвечает для них yes.
Другие ошибки иконок
| Код | О чём сообщает Apple | Что проверить в Expo |
|---|---|---|
| ITMS-90717 | Иконка 1024 прозрачная | Экспорт без альфы |
| ITMS-90704 | Нет иконки 1024 | Нет записи 1024 |
| ITMS-90022 | Нет иконки для iPhone | Неполный каталог |
| ITMS-90023 | Нет иконки для iPad | Неполный каталог |
Последние три сообщения в основном встречались в 2017 и 2018 годах, когда Xcode 9 поменял правила для иконок.
С Expo они стали редкостью. Prebuild записывает одну универсальную иконку 1024, а остальные размеры генерирует Xcode. Если иконка не указана, Expo даже создаёт белый квадрат, чтобы отправка не упала. Если всё же получил одну из этих ошибок, посмотри на папку ios в git: файл Contents.json в AppIcon.appiconset должен содержать запись размера 1024x1024, а указанный в ней PNG должен существовать.
Перед следующей отправкой
Иконка исправляется за десять минут, но каждая ошибка стоит тебе билда. Другие автоматические проверки требуют такой же аккуратности, например ITMS-90683 для текстов запроса разрешений или ITMS-91053 для манифеста приватности. Когда билд примут, установи его через TestFlight и посмотри на иконку на своём домашнем экране.
С отказами ревьюера нужно разбираться вдумчивее: порядок действий описан на странице приложение отклонено Apple, а самые частые причины собраны в статье почему Apple отклоняет приложение.
Чтобы проверить всё перед отправкой, в Review Kit собраны мой чек-лист и skills для Claude Code, которые проверяют твой проект. Если отправка застряла и нужен живой взгляд, забронируй час со мной: разберём твой проект по видеосвязи, прямо на твоём экране. А если готовишь свой первый релиз, пройди бесплатную диагностику: она расставит шаги по порядку и пришлёт тебе мой чек-лист против отказов Apple.
Частые вопросы
Почему Apple видит альфа-канал, если в моей иконке нет прозрачности?
Потому что PNG может хранить альфа-канал, даже когда все его пиксели непрозрачные. Многие программы по умолчанию добавляют его при экспорте. Проверь через sips -g hasAlpha и переэкспортируй иконку без этого канала.
Можно ли исправить ITMS-90717 удалённым обновлением?
Нет. Иконка скомпилирована в бинарник, в Assets.car. Удалённое обновление меняет только JavaScript и ресурсы приложения. Исправь иконку, собери новый билд и отправь его.
Может ли тёмная иконка быть прозрачной?
Да. Apple требует прозрачный фон для тёмного варианта, и Expo сохраняет его прозрачность. Из этого я делаю вывод, что проверка касается основной иконки, той, что для App Store: именно она должна быть непрозрачной.
Нужно ли скруглять углы иконки iOS?
Нет. Дай сплошной квадрат: маску iOS наложит сама. Скруглённые углы оставляют прозрачные пиксели по краям, а именно их эта проверка и не пропускает.
Поддерживает ли Expo иконки Icon Composer из iOS 26?
Да, начиная с SDK 54: укажи путь к папке .icon в ios.icon строкой. Prebuild копирует её как есть, а Xcode 26 компилирует. Если с этим форматом получил ITMS-90717, проверь прозрачные слои и эффект Blur или временно вернись к PNG.

