Every time I ship an app I go through the same ritual: design one icon, then spend twenty minutes turning it into a pile of correctly-named PNGs for Xcode and Android Studio. The rules for this are scattered across Apple and Google docs and nobody explains them in one place, so here's what I've learned from doing it wrong a few times.
iOS: it's not just about pixel sizes
Xcode expects an AppIcon.appiconset folder with a Contents.json file that maps each PNG to a specific idiom (iphone, ipad, watch, mac, ios-marketing) and scale (1x, 2x, 3x). Get the JSON wrong and Xcode either shows a blank icon or refuses to build.
The sizes themselves are derived from a small set of "points" values multiplied by scale, but the practical range you need runs from 16px up to the 1024px App Store marketing icon, with about 37 unique sizes once you cover iPhone, iPad, Apple Watch and Mac. Missing the 1024 one is the most common mistake, since it's easy to test the app without ever needing it, and then App Store Connect rejects the build.
Android: it's about folders, not just files
Android doesn't care about a manifest file, it cares about where the PNG physically sits. Each density bucket gets its own mipmap-* folder:
-
mipmap-mdpi— 48px -
mipmap-hdpi— 72px -
mipmap-xhdpi— 96px -
mipmap-xxhdpi— 144px -
mipmap-xxxhdpi— 192px
Plus a separate 512px icon that never ships in the app at all, it's only for the Play Store listing. If you also want ic_launcher_round.png for launchers that mask icons to a circle, that's another five files.
Screenshots have the same problem
App Store Connect and Google Play Console both reject screenshots that are off by a handful of pixels, and the accepted dimensions differ by device class (iPhone 6.9", iPhone 6.5", iPad 12.9", Android phone, Android tablet, etc). Same category of annoying manual work, different assets.
What I did about it
I turned the whole ruleset into a small browser tool: upload one square image, pick iOS/Android/both, and it generates the full AppIcon.appiconset with a valid Contents.json, every Android mipmap density plus the round launcher icon and Play Store icon, packaged as a ZIP with the folder structure already correct. There's also a screenshot resizer for the store dimensions and a favicon generator since that's the same problem again for the web.
It's free, no account, and nothing is stored after processing: https://www.appassetgenerator.com
Curious if others have found cleaner ways to handle this, especially the Contents.json generation — happy to compare notes in the comments.
Top comments (0)