{"id":48842,"date":"2025-08-08T15:14:24","date_gmt":"2025-08-08T19:14:24","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=48842"},"modified":"2026-02-04T17:10:44","modified_gmt":"2026-02-04T22:10:44","slug":"separate-icons-for-macos-tahoe-vs-earlier","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2025\/08\/08\/separate-icons-for-macos-tahoe-vs-earlier\/","title":{"rendered":"Separate Icons for macOS Tahoe vs. Earlier"},"content":{"rendered":"<p><a href=\"https:\/\/mastodon.social\/@siracusa\/114987950012388063\">John Siracusa<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@siracusa\/114987950012388063\">\n<p>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.<\/p>\n<\/blockquote>\n\n<p>I was also <a href=\"https:\/\/mastodon.social\/@mjtsai\/114988326687350451\">looking into<\/a> how to do this. I had read that you could just keep your old icon in the <tt>.xcassets<\/tt> and use the same name for the new <tt>.icon<\/tt> 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 <a href=\"https:\/\/mastodon.social\/@betamagic\/114989602626082647\">didn&rsquo;t<\/a> make it into the built app, and even the generated <tt>.icns<\/tt> file for backwards compatibility was low-resolution.<\/p>\n\n<p><a href=\"https:\/\/mas.to\/@avidrissman\/114989207727177911\">Avi Drissman<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mas.to\/@avidrissman\/114989207727177911\">\n<p>By default, yes, <code>actool<\/code> will ignore <tt>.xcassets<\/tt> 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 <code>--enable-icon-stack-fallback-generation=disabled<\/code> flag, it won&rsquo;t. See <a href=\"https:\/\/source.chromium.org\/chromium\/chromium\/src\/+\/cb9d61c26abea51d2ab51412352581a34574c8f9:tools\/mac\/icons\/compile_car.py;l=154-164\">here<\/a>. This worked as of db4; I really hope they didn&rsquo;t break it in db5.<\/p>\n<\/blockquote>\n\n<p>This <a href=\"https:\/\/mastodon.social\/@mjtsai\/114989464001181328\">did not<\/a> work for me with beta 5.<\/p>\n\n<p><a href=\"https:\/\/mastodon.social\/@vslavik\/114993216557011235\">V&aacute;clav Slav&iacute;k<\/a> found that it does work to separate names for the <tt>.iconset<\/tt> (for <code>CFBundleIconFile<\/code>) and <tt>.icon<\/tt> (for <code>CFBundleIconName<\/code>), not putting either in <tt>.xcassets<\/tt>, and this seemed to work for me, at least with his <a href=\"https:\/\/github.com\/vslavik\/TahoeIconsTests\">test project<\/a>. But this approach <a href=\"https:\/\/mastodon.social\/@siracusa\/114988279380148827\">didn&rsquo;t work for Siracusa<\/a>.<\/p>\n\n<p><a href=\"https:\/\/mastodon.social\/@vslavik\/114993221217469827\">V&aacute;clav Slav&iacute;k<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@vslavik\/114993221217469827\"><p>There&rsquo;s apparently something special about app icons stored in <tt>Assets.car<\/tt>, it&rsquo;s not just the name, and that&rsquo;s what is throwing a wrench into things.<\/p><\/blockquote>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2025\/08\/05\/macos-tahoe-26-developer-beta-5\/\">macOS Tahoe 26 Developer Beta 5<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2025\/06\/23\/icon-composer-notes\/\">Icon Composer Notes<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2025\/06\/19\/macos-tahoes-new-theming-system\/\">macOS Tahoe&rsquo;s New Theming System<\/a><\/li>\n<\/ul>\n\n<p id=\"separate-icons-for-macos-tahoe-vs-earlier-update-2025-08-09\">Update (<a href=\"#separate-icons-for-macos-tahoe-vs-earlier-update-2025-08-09\">2025-08-09<\/a>): <a href=\"https:\/\/mastodon.social\/@siracusa\/114996301998175827\">John Siracusa<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@siracusa\/114996301998175827\">\n<p>The approach used in the [<a href=\"https:\/\/github.com\/vslavik\/TahoeIconsTests\/tree\/1447a3ef56cabec1474e23d933c2eeb003033e17\">new version<\/a> of the] <a href=\"https:\/\/github.com\/vslavik\/TahoeIconsTests\">sample project<\/a> referenced here did work for me.<\/p>\n<\/blockquote>\n<p>It <a href=\"https:\/\/github.com\/vslavik\/TahoeIconsTests\/commit\/1447a3ef56cabec1474e23d933c2eeb003033e17#diff-0fed183085228c4a626d20792374da4ca5be6287ab4d6dcd2942c77c3fb6ac1cR153\">uses<\/a> a shell script to call <code>actool<\/code> and <code>PlistBuddy<\/code>.<\/p>\n\n<p id=\"separate-icons-for-macos-tahoe-vs-earlier-update-2025-08-11\">Update (<a href=\"#separate-icons-for-macos-tahoe-vs-earlier-update-2025-08-11\">2025-08-11<\/a>): <a href=\"https:\/\/mastodon.social\/@siracusa\/114999384770435387\">John Siracusa<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@siracusa\/114999384770435387\">\n<p>Update: an app built this way is rejected by App Store Connect with the following error:<\/p>\n<blockquote><p>ITMS-90236: Missing required icon - The asset catalog in the application bundle does not contain an icon of size 512pt x 512pt @2X.<\/p><\/blockquote>\n<\/blockquote>\n\n<p><a href=\"https:\/\/mastodon.social\/@siracusa\/115004905960161870\">John Siracusa<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@siracusa\/115004905960161870\"><p>I changed the <code>actool<\/code> command line in the custom build phase to include the <tt>Assets.xcassets<\/tt> file path as the first argument (right before the existing <tt>.icon<\/tt> path argument) and then added the <code>--include-all-app-icons<\/code> 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.<\/p><\/blockquote>\n\n<p id=\"separate-icons-for-macos-tahoe-vs-earlier-update-2025-08-12\">Update (<a href=\"#separate-icons-for-macos-tahoe-vs-earlier-update-2025-08-12\">2025-08-12<\/a>): <a href=\"https:\/\/mastodon.social\/@vslavik\/115016258774715162\">V&aacute;clav Slav&iacute;k<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@vslavik\/115016258774715162\">\n<p>Passing the undocumented flag plus <code>--include-all-app-icons<\/code> and having same-named <tt>AppIcon<\/tt> in <tt>Assets.xcassets<\/tt> seems sufficient and is much simpler. I updated the example repo.<\/p>\n<\/blockquote>\n\n<p>See also: <a href=\"https:\/\/mastodon.social\/@jamesthomson\/115005039802316921\">James Thomson<\/a>.<\/p>\n\n<p id=\"separate-icons-for-macos-tahoe-vs-earlier-update-2025-09-10\">Update (<a href=\"#separate-icons-for-macos-tahoe-vs-earlier-update-2025-09-10\">2025-09-10<\/a>): <a href=\"https:\/\/mastodon.social\/@siracusa\/115180108905478797\">John Siracusa<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@siracusa\/115180108905478797\"><p>Hey, I got a response to one of my Feedbacks!<\/p><p>Me: &ldquo;In Xcode 26 beta 4, if a Mac app included a new Tahoe-style .icon file with the same name as its existing app icon in its .appiconset file, the Tahoe-style .icon would show up in Tahoe and the pre-Tahoe icon from the .appiconset would show up in pre-Tahoe versions of macOS.<\/p><p>In Xcode beta 5, this no longer works. The Tahoe .icon is shown on all versions of macOS.&rdquo;<\/p><p>(1 month passes)<\/p><p>Apple: &ldquo;Please know that this is by design.&rdquo;<\/p><\/blockquote>\n\n<p id=\"separate-icons-for-macos-tahoe-vs-earlier-update-2025-11-12\">Update (<a href=\"#separate-icons-for-macos-tahoe-vs-earlier-update-2025-11-12\">2025-11-12<\/a>): <a href=\"https:\/\/mastodon.social\/@siracusa\/115491845898322390\">John Siracusa<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@siracusa\/115491845898322390\">\n<p>Xcode 26.1 no longer supports this technique for building a Mac app that shows a Tahoe-style icon in macOS 26 and a non-Tahoe-style icon in earlier versions of macOS.<\/p>\n<\/blockquote>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2025\/11\/05\/xcode-26-1\/\">Xcode 26.1<\/a><\/li>\n<\/ul>\n\n<p id=\"separate-icons-for-macos-tahoe-vs-earlier-update-2026-02-04\">Update (<a href=\"#separate-icons-for-macos-tahoe-vs-earlier-update-2026-02-04\">2026-02-04<\/a>): <a href=\"https:\/\/mastodon.social\/@siracusa\/116013242646915561\">John Siracusa<\/a>:<\/p>\n<blockquote cite=\"https:\/\/mastodon.social\/@siracusa\/116013242646915561\">\n<p> I rubber-ducked with it for a while and came up with a new, terrible approach:<\/p>\n<p>1. Copy the Assets.car file from a build of my app made with Xcode 26.0.1 into the repo.<\/p>\n<p>2. Add a new build phase that replaces the built Assets.car with the saved &ldquo;good&rdquo; Assets.car file.<\/p>\n<p>It works! But I need to use Xcode 26.0.1 or earlier if I ever want to change my icon.<\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>John Siracusa: 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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2025-08-08T19:14:26Z","apple_news_api_id":"82ed3242-14dd-4064-8730-7828b7a8de3d","apple_news_api_modified_at":"2026-02-04T22:10:49Z","apple_news_api_revision":"AAAAAAAAAAAAAAAAAAAABw==","apple_news_api_share_url":"https:\/\/apple.news\/Agu0yQhTdQGSHMHgot6jePQ","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[4],"tags":[2352,2783,545,2785,30,2598,2742,71,226],"class_list":["post-48842","post","type-post","status-publish","format-standard","hentry","category-programming-category","tag-asset-catalog-car","tag-icon-composer","tag-icons","tag-liquid-glass","tag-mac","tag-macos-15-sequoia","tag-macos-tahoe-26","tag-programming","tag-xcode"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/48842","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=48842"}],"version-history":[{"count":9,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/48842\/revisions"}],"predecessor-version":[{"id":50911,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/48842\/revisions\/50911"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=48842"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=48842"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=48842"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}