Skip to content

Commit 4a442f4

Browse files
authored
fix: compile Asset Catalog (Assets.car) for app icon in Finder (#44)
Modern macOS requires a compiled Asset Catalog (Assets.car) for app icons to render in Finder. The raw .icns file alone is not sufficient when CFBundleIconName is set. build.sh now: 1. Copies the .icns file (fallback) 2. Extracts PNGs from the .icns via iconutil 3. Compiles an Asset Catalog via actool (xcrun) 4. Falls back gracefully if actool is unavailable
1 parent 8fb1082 commit 4a442f4

1 file changed

Lines changed: 43 additions & 2 deletions

File tree

scripts/build.sh

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,51 @@ find ".build/arm64-apple-macosx/${CONFIG}" -maxdepth 1 -name "*.bundle" | while
6060
cp -rf "$bundle" "${APP_DIR}/Contents/Resources/"
6161
done
6262

63-
# Copy app icon
63+
# Copy app icon and compile Asset Catalog
6464
if [ -f "Sources/VocaMac/Resources/AppIcon.icns" ]; then
6565
cp -f "Sources/VocaMac/Resources/AppIcon.icns" "${APP_DIR}/Contents/Resources/AppIcon.icns"
66-
echo "📎 App icon copied"
66+
67+
# Extract PNGs from .icns and compile an Asset Catalog (Assets.car)
68+
# Modern macOS requires Assets.car for icons to render in Finder
69+
ICONSET_DIR="/tmp/vocamac-icon-build.iconset"
70+
XCASSETS_DIR="/tmp/vocamac-icon-build.xcassets"
71+
rm -rf "$ICONSET_DIR" "$XCASSETS_DIR"
72+
73+
iconutil --convert iconset "Sources/VocaMac/Resources/AppIcon.icns" -o "$ICONSET_DIR" 2>/dev/null
74+
if [ -d "$ICONSET_DIR" ]; then
75+
mkdir -p "${XCASSETS_DIR}/AppIcon.appiconset"
76+
cp "$ICONSET_DIR"/*.png "${XCASSETS_DIR}/AppIcon.appiconset/"
77+
cat > "${XCASSETS_DIR}/AppIcon.appiconset/Contents.json" << 'ICONJSON'
78+
{
79+
"images": [
80+
{"filename":"icon_16x16.png","idiom":"mac","scale":"1x","size":"16x16"},
81+
{"filename":"icon_16x16@2x.png","idiom":"mac","scale":"2x","size":"16x16"},
82+
{"filename":"icon_32x32.png","idiom":"mac","scale":"1x","size":"32x32"},
83+
{"filename":"icon_32x32@2x.png","idiom":"mac","scale":"2x","size":"32x32"},
84+
{"filename":"icon_128x128.png","idiom":"mac","scale":"1x","size":"128x128"},
85+
{"filename":"icon_128x128@2x.png","idiom":"mac","scale":"2x","size":"128x128"},
86+
{"filename":"icon_256x256.png","idiom":"mac","scale":"1x","size":"256x256"},
87+
{"filename":"icon_256x256@2x.png","idiom":"mac","scale":"2x","size":"256x256"},
88+
{"filename":"icon_512x512.png","idiom":"mac","scale":"1x","size":"512x512"},
89+
{"filename":"icon_512x512@2x.png","idiom":"mac","scale":"2x","size":"512x512"}
90+
],
91+
"info": {"author":"xcode","version":1}
92+
}
93+
ICONJSON
94+
# Compile Asset Catalog — produces Assets.car which modern macOS needs
95+
xcrun actool "$XCASSETS_DIR" \
96+
--compile "${APP_DIR}/Contents/Resources" \
97+
--platform macosx \
98+
--minimum-deployment-target 13.0 \
99+
--app-icon AppIcon \
100+
--output-partial-info-plist /tmp/vocamac-icon-partial.plist 2>/dev/null && \
101+
echo "📎 App icon compiled (Assets.car)" || \
102+
echo "📎 App icon copied (.icns only — actool unavailable)"
103+
104+
rm -rf "$ICONSET_DIR" "$XCASSETS_DIR" /tmp/vocamac-icon-partial.plist 2>/dev/null
105+
else
106+
echo "📎 App icon copied (.icns only)"
107+
fi
67108
fi
68109

69110
# Create/update Info.plist

0 commit comments

Comments
 (0)