Separate Icons for macOS Tahoe vs. Earlier
Looks like Tahoe/Xcode beta 5 no longer lets me show my pre-Tahoe app icons in pre-Tahoe OSes. This is a bummer. I filed FB19437407 asking for the ability to do this.
I was also looking into how to do this. I had read that you could just keep your old icon in the .xcassets and use the same name for the new .icon file, and it would all just work: new icon on Tahoe and old icon on older versions of macOS. But I found that the old icon didn’t make it into the built app, and even the generated .icns file for backwards compatibility was low-resolution.
By default, yes,
actool
will ignore .xcassets compatibility bitmaps that match the name of your app icon, and will instead substitute its own. However, if you use the super duper secret undocumented--enable-icon-stack-fallback-generation=disabled
flag, it won’t. See here. This worked as of db4; I really hope they didn’t break it in db5.
This did not work for me with beta 5.
Václav Slavík found that it does work to separate names for the .iconset (for CFBundleIconFile
) and .icon (for CFBundleIconName
), not putting either in .xcassets, and this seemed to work for me, at least with his test project. But this approach didn’t work for Siracusa.
There’s apparently something special about app icons stored in Assets.car, it’s not just the name, and that’s what is throwing a wrench into things.
Previously:
Update (2025-08-09): John Siracusa:
The approach used in the [new version of the] sample project referenced here did work for me.
It uses a shell script to call actool
and PlistBuddy
.
Update (2025-08-11): John Siracusa:
Update: an app built this way is rejected by App Store Connect with the following error:
ITMS-90236: Missing required icon - The asset catalog in the application bundle does not contain an icon of size 512pt x 512pt @2X.
I changed the
actool
command line in the custom build phase to include the Assets.xcassets file path as the first argument (right before the existing .icon path argument) and then added the--include-all-app-icons
option. That seemed to satisfy App Store Connect while still showing the pre-Tahoe icon on pre-Tahoe versions of macOS and the Tahoe icon on Tahoe.
Update (2025-08-12): Václav Slavík:
Passing the undocumented flag plus
--include-all-app-icons
and having same-named AppIcon in Assets.xcassets seems sufficient and is much simpler. I updated the example repo.
See also: James Thomson.
3 Comments RSS · Twitter · Mastodon
It broke even for Apple. XC26 betas 2-4 had the original beta icon on macOS < 26. Now with beta 5, it's the disgusting Tahoe icon. Not just for Xcode, but for Simulator, Instruments, etc. Yuck
@someone that's the thing. That means basically abandoning the entire platform. You've got maybe a year until it starts getting harder and harder to not be on at least Tahoe.
As ATP and Siracusa recently pointed out, it's like this because there is no competition. In areas like games where there is little to no lock-in, the developers really care about the interface looking good and working well.
With operating systems, you get to pick Windows or macOS. Or have fun getting Linux to work for everything you need. Maybe it will maybe it won't but it will definitely be an adventure.
So Apple has very little incentive to make it excellent.