# ITMS-90717: Fix “Invalid large app icon” with Expo

> ITMS-90717: your build's 1024 x 1024 icon still has transparency or an alpha channel. Export it opaque, check it with sips, then rebuild.

Original page: [ITMS-90717: Fix “Invalid large app icon” with Expo](https://devoria.fr/en/blog/itms-90717-invalid-large-app-icon-expo)
Author: [Mehdi Azizi](https://devoria.fr/en/mehdi-azizi)
Published: 2026-11-04
Content last revised: 2026-11-04


ITMS-90717 is an automated check Apple runs on your build. It says your app's large icon, the 1024 x 1024 pixel one shown on the App Store, contains transparency or an alpha channel. **The fix: a square, opaque icon exported without an alpha channel, then a new build.**

With Expo, your PNG file is rarely the culprit: prebuild already puts it on a white background. I read that code in SDK 57 and checked the icons of Solys, TradaZen and Nolera. So the error usually comes from a committed `ios` folder or an Icon Composer file. Here's how to find which one, and fix it.

## What does the ITMS-90717 error mean?

The message is titled "ITMS-90717: Invalid large app icon". It says the large icon in your app's asset catalog "can't be transparent or contain an alpha channel". Older messages talked about "Invalid App Store Icon". Same rule.

That large icon is the App Store one. The [Xcode documentation on app icons](https://developer.apple.com/documentation/xcode/configuring-your-app-icon) explains it: an app distributed on the App Store must provide its 1024-point icon in its asset catalog.

The alpha channel is the fourth layer of a PNG, next to red, green and blue. It stores the transparency of each pixel. **An icon can look solid and still keep that channel**: that's the trap that shows up in every forum thread.

Like other ITMS errors, this isn't a rejection by a reviewer. Apple scanned the binary on delivery. Depending on your upload tool, the error shows up as a validation failure, for example with code 409.

## Check your icon with sips

On a Mac, `sips` comes preinstalled. One line is enough:

```bash
sips -g hasAlpha assets/icon.png
```

You want to see `hasAlpha: no`. On October 15, 2026, I ran this command on the icons declared in the app.json files of Solys, TradaZen and Nolera: all of them return `no`, at 1024 x 1024.

I also made a test icon: a fully opaque blue square, but saved with an alpha channel. `sips` returns `yes`. **Not a single pixel is transparent, and the channel is still there.** That's why so many developers reply "my icon has no transparency" under this message.

In Preview, the inspector (Tools, Show Inspector) also lists the image properties, including the alpha channel.

## Fix it: export the icon without an alpha channel

Three methods, from simplest to most precise.

**1. Preview.** File, Export, PNG format, then uncheck the Alpha box. The exported file no longer has an alpha channel.

**2. sips, nothing to install.** `sips` doesn't remove the alpha channel from a PNG. You have to go through a JPEG, which has none:

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

On my test icon with transparent corners, the corners turned white and the last line returns `no`. Going through JPEG compresses the image a bit, even at maximum quality: look closely at the result.

**3. ImageMagick.** If you have it installed, you pick the background color:

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

According to the [ImageMagick documentation](https://imagemagick.org/command-line-options/#alpha), `-alpha remove` puts the image on the background color, and `-alpha off` turns the channel off.

All three methods fill the transparency with a solid color. If your logo was floating on a transparent background, the cleanest option is to go back to the source file and draw a real background. Expo asks for this in its [app icon guide](https://docs.expo.dev/develop/user-interface/splash-screen-and-app-icon/): the icon must fill the whole square, with no rounded corners or transparent pixels. iOS applies the mask itself.

## Where Expo gets your icon, and what it does with it

Expo reads `ios.icon` first, then the root `icon` field of your config. According to the [Expo config reference](https://docs.expo.dev/versions/latest/config/app/), `ios.icon` accepts three forms: a PNG, an object with `light`, `dark` and `tinted` variants, or a `.icon` folder made with Icon Composer.

The table below comes from the code that generates the iOS icon at prebuild, `@expo/prebuild-config` 57.0.16 (SDK 57), read on October 15, 2026:

| What you declare       | What prebuild does     | ITMS-90717 risk   |
| ---------------------- | ---------------------- | ----------------- |
| `icon` as PNG          | Flattened on white     | Low               |
| `ios.icon.light`       | Flattened on white     | Low               |
| `ios.icon.tinted`      | Flattened on white     | Low               |
| `ios.icon.dark`        | Transparency kept      | Intended by Apple |
| `ios.icon` as `.icon`  | Copied as is           | Real              |
| Committed `ios` folder | Prebuild not run again | Real              |

**With a PNG, Expo removes the transparency itself and replaces it with white.** So a cut-out logo ends up on a white square: no error, but maybe not the look you wanted. The dark variant keeps its transparency, and that's intentional: Apple asks for a transparent background on the dark icon so the system-provided background shows through.

On Nolera, which declares all three variants, `sips` returns `no` for the generated light and tinted icons, `yes` for the dark one. Based on the commit date of those variants, version 1.0.2, which is live, ships them. I haven't checked it in its IPA.

### The committed ios folder case

This is the most likely cause with Expo. [Expo's page on continuous native generation](https://docs.expo.dev/workflow/continuous-native-generation/) says it: if your project contains the `android` and `ios` folders, EAS Build doesn't run prebuild. **Your app.json then no longer touches the icon**: the PNG in the `ios` folder is what gets sent to Apple.

Check it from the project root:

```bash
sips -g hasAlpha ios/*/Images.xcassets/AppIcon.appiconset/*.png
```

If the command returns `yes` for the 1024 icon, replace that file with your opaque version, under the same name. If you haven't made any manual native changes, you can also delete the `ios` folder and add it to `.gitignore`: EAS will regenerate it on every build. On Solys, TradaZen and Nolera, that folder is ignored by git.

## The iOS 26 format: Icon Composer

Icon Composer is Apple's tool for iOS 26 Liquid Glass icons. It produces a single multi-layer `.icon` file. According to [Apple's guide on Icon Composer](https://developer.apple.com/documentation/xcode/creating-your-app-icon-using-icon-composer), Xcode also derives the images for older iOS versions from it.

Expo has supported it since SDK 54. You declare the folder as a string, never in the variants object:

```json
{
  "expo": {
    "ios": {
      "icon": "./assets/app.icon"
    }
  }
}
```

In that case, prebuild copies the folder untouched, and Xcode builds the final icon. So you need Xcode 26 or later, the one in recent EAS images, as I explain in the guide on [ITMS-90725](https://devoria.fr/en/blog/itms-90725-sdk-version-issue-expo).

Since August 2025, threads on Apple's developer forums have reported ITMS-90717 with `.icon` files. Reported leads: a transparent PNG layer, a layer bigger than the canvas, a group with the Blur effect near the edge. Workarounds mentioned: turn off Blur, keep a solid background, or go back to a PNG. These threads give no official fix from Apple, and the error was still being reported in August 2026.

[Apple's guidelines on app icons](https://developer.apple.com/design/human-interface-guidelines/app-icons) point the same way: if you import a background layer, it must cover the whole surface and be opaque. My apps still use a PNG, so I haven't tested Icon Composer in production. **If a `.icon` file blocks your upload, switch `ios.icon` back to a PNG**: Expo will flatten it, and your icon will pass this check.

## Check the icon in the final build

In the IPA, the 1024 icon isn't a PNG file: Xcode compiles it into `Assets.car`. Download the IPA from the build page on expo.dev, then run:

```bash
unzip -q MyApp.ipa -d ipa
xcrun assetutil --info ipa/Payload/*.app/Assets.car | grep -B3 '"RenditionName" : "App-Icon'
```

Each icon shows an `Opaque` field. On October 15, 2026, I compiled the Solys icon and my test icon with transparent corners using `actool`, Xcode's tool. The first comes out as `"Opaque" : true`, the second as `"Opaque" : false`. Apple doesn't document this field: treat it as a hint, not as Apple's check.

One trap to know about: **don't test the small PNGs at the root of the app with `sips`.** Xcode writes them with an alpha channel, even when the source is opaque. In my test with the Solys icon, `sips` returns `yes` for them.

## Other icon errors

| Code       | What Apple reports    | Lead with Expo       |
| ---------- | --------------------- | -------------------- |
| ITMS-90717 | Transparent 1024 icon | Export without alpha |
| ITMS-90704 | Missing 1024 icon     | Missing 1024 entry   |
| ITMS-90022 | Missing iPhone icon   | Incomplete catalog   |
| ITMS-90023 | Missing iPad icon     | Incomplete catalog   |

The last three messages mostly date back to 2017 and 2018, when Xcode 9 changed the icon rules.

With Expo, they've become rare. Prebuild writes a single universal 1024 icon, and Xcode generates the other sizes. With no icon declared, Expo even creates a white square to avoid an upload failure. **If one of these errors shows up, look at the committed `ios` folder**: the `Contents.json` file in `AppIcon.appiconset` must contain an entry with size `1024x1024`, and the PNG it references must exist.

## Before your next upload

An icon takes ten minutes to fix, but every error costs you a build. The other automated checks need the same rigor, like [ITMS-90683](https://devoria.fr/en/blog/itms-90683-missing-purpose-string-expo) for permission strings or [ITMS-91053](https://devoria.fr/en/blog/itms-91053-missing-api-declaration-expo) for the privacy manifest. Once the build is accepted, install it with [TestFlight](https://devoria.fr/en/blog/testflight-test-iphone-app-before-submitting) to see your icon on your home screen.

Rejections by a reviewer need more perspective: the process is on the [app rejected by Apple](https://devoria.fr/en/expertise/app-rejected-by-apple) page, and the most common reasons are in [why Apple rejects an app](https://devoria.fr/en/blog/apple-app-rejection-real-cases).

To check your submission before sending it, the [Review Kit](https://devoria.fr/en/kits/app-review) bundles my checklist and Claude Code skills that review your project. If your upload is stuck and you want a human pair of eyes, [book an hour with me](https://devoria.fr/en/coaching): we go through your project on a video call, on your screen. And if you're preparing your first release, [take the free diagnostic](https://devoria.fr/en/diagnostic): it puts the steps in order and sends you my Apple anti-rejection checklist.

## Frequently asked questions

### Why does Apple see an alpha channel when my icon has no transparency?

Because a PNG can keep an alpha channel even when all its pixels are opaque. Many tools add it by default on export. Check with `sips -g hasAlpha`, then re-export the icon without that channel.

### Can you fix ITMS-90717 with an over-the-air update?

No. The icon is compiled into the binary, in `Assets.car`. An over-the-air update only changes the app's JavaScript and assets. Fix the icon, rebuild, then upload again.

### Can the dark icon be transparent?

Yes. Apple asks for a transparent background on the dark variant, and Expo keeps its transparency. My takeaway is that the check targets the main icon, the App Store one: that's the one that must be opaque.

### Should you round the corners of an iOS icon?

No. Provide a full square: iOS applies the mask itself. Rounded corners leave transparent pixels in the corners, exactly what this check rejects.

### Does Expo support iOS 26 Icon Composer icons?

Yes, since SDK 54: declare the path to the `.icon` folder in `ios.icon`, as a string. Prebuild copies it as is and Xcode 26 compiles it. If you hit ITMS-90717 with this format, check for transparent layers and the Blur effect, or temporarily go back to a PNG.


## Your project

[Review Kit](https://devoria.fr/en/kits/app-review): My App Store review checklist, the Apple rejections I fixed, a Google Play checklist and three Claude Code skills. $55.

[iOS & Android Kit](https://devoria.fr/en/kits/ios): Build your iPhone and Android app with Claude Code: the starter code from my apps, the path all the way to the stores, and every kit. $109.

[Diagnostic: what's between you and your iPhone app](https://devoria.fr/en/diagnostic): 7 questions, 60 seconds: find out what's really stopping you from publishing your iPhone app, get your 4-step path and the kit that fits you.
