Install optional iOS Dark/Tinted app icons after capacitor-assets generate.
Post-process AppIcon.appiconset so appearance variants are reapplied on every iOS build without changing the existing asset generation flow.
This commit is contained in:
@@ -192,6 +192,113 @@ check_ios_resources() {
|
|||||||
log_success "iOS resource check completed"
|
log_success "iOS resource check completed"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# iOS app icon appearance variants (Dark, Tinted, …).
|
||||||
|
# Luminosity appearance values match Apple's asset catalog format (iOS 18+).
|
||||||
|
readonly _IOS_APP_ICON_APPEARANCE_LUMINOSITY="luminosity"
|
||||||
|
readonly _IOS_APP_ICON_APPEARANCE_DARK="dark"
|
||||||
|
readonly _IOS_APP_ICON_APPEARANCE_TINTED="tinted"
|
||||||
|
|
||||||
|
# Each row: source_file|luminosity_value|dest_filename
|
||||||
|
# To add a variant: append one row and place the source PNG under resources/ios/.
|
||||||
|
readonly _IOS_APP_ICON_APPEARANCE_VARIANTS=(
|
||||||
|
"resources/ios/icon/icon-dark.png|${_IOS_APP_ICON_APPEARANCE_DARK}|AppIcon-Dark.png"
|
||||||
|
"resources/ios/icon/icon-tinted.png|${_IOS_APP_ICON_APPEARANCE_TINTED}|AppIcon-Tinted.png"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Update AppIcon.appiconset/Contents.json with one 1024×1024 appearance entry.
|
||||||
|
# Preserves all other images (including capacitor-assets output); replaces any
|
||||||
|
# existing entry for the same luminosity appearance.
|
||||||
|
_update_appicon_contents_for_appearance() {
|
||||||
|
local contents_json="$1"
|
||||||
|
local dest_filename="$2"
|
||||||
|
local luminosity_value="$3"
|
||||||
|
|
||||||
|
local tmp_file
|
||||||
|
tmp_file="$(mktemp)"
|
||||||
|
|
||||||
|
if ! jq --arg filename "$dest_filename" \
|
||||||
|
--arg appearance "$_IOS_APP_ICON_APPEARANCE_LUMINOSITY" \
|
||||||
|
--arg value "$luminosity_value" \
|
||||||
|
'
|
||||||
|
.images |= map(select((.appearances[0].value // "") != $value))
|
||||||
|
| .images += [{
|
||||||
|
"appearances": [{
|
||||||
|
"appearance": $appearance,
|
||||||
|
"value": $value
|
||||||
|
}],
|
||||||
|
"filename": $filename,
|
||||||
|
"idiom": "universal",
|
||||||
|
"platform": "ios",
|
||||||
|
"size": "1024x1024"
|
||||||
|
}]
|
||||||
|
' "$contents_json" > "$tmp_file"; then
|
||||||
|
rm -f "$tmp_file"
|
||||||
|
log_error "Failed to update AppIcon Contents.json for appearance: $luminosity_value"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv "$tmp_file" "$contents_json"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install one appearance variant when its source PNG exists.
|
||||||
|
_apply_ios_app_icon_appearance_variant() {
|
||||||
|
local appiconset_dir="$1"
|
||||||
|
local contents_json="$2"
|
||||||
|
local source_file="$3"
|
||||||
|
local luminosity_value="$4"
|
||||||
|
local dest_filename="$5"
|
||||||
|
|
||||||
|
if [ ! -f "$source_file" ]; then
|
||||||
|
log_info "iOS app icon appearance variant not found ($source_file) — skipping"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$appiconset_dir" ]; then
|
||||||
|
log_warn "AppIcon.appiconset not found — skipping appearance variant ($luminosity_value)"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! cp "$source_file" "$appiconset_dir/$dest_filename"; then
|
||||||
|
log_error "Failed to copy $source_file to $appiconset_dir/$dest_filename"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "Installed iOS app icon appearance variant: $luminosity_value ($dest_filename)"
|
||||||
|
_update_appicon_contents_for_appearance "$contents_json" "$dest_filename" "$luminosity_value"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Post-process capacitor-assets iOS icons: copy optional Dark/Tinted sources and
|
||||||
|
# register them in AppIcon.appiconset/Contents.json.
|
||||||
|
apply_ios_app_icon_appearances() {
|
||||||
|
local appiconset_dir="ios/App/App/Assets.xcassets/AppIcon.appiconset"
|
||||||
|
local contents_json="$appiconset_dir/Contents.json"
|
||||||
|
|
||||||
|
if [ ! -f "$contents_json" ]; then
|
||||||
|
log_info "AppIcon Contents.json not found — skipping appearance variants"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v jq &> /dev/null; then
|
||||||
|
log_error "jq is required to install iOS app icon appearance variants (install with: brew install jq)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local variant source_file luminosity_value dest_filename
|
||||||
|
for variant in "${_IOS_APP_ICON_APPEARANCE_VARIANTS[@]}"; do
|
||||||
|
IFS='|' read -r source_file luminosity_value dest_filename <<< "$variant"
|
||||||
|
_apply_ios_app_icon_appearance_variant \
|
||||||
|
"$appiconset_dir" "$contents_json" \
|
||||||
|
"$source_file" "$luminosity_value" "$dest_filename"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generate iOS assets (capacitor-assets), then apply optional appearance variants.
|
||||||
|
generate_ios_assets() {
|
||||||
|
ensure_ios_capacitor_asset_directories
|
||||||
|
npx capacitor-assets generate --ios
|
||||||
|
apply_ios_app_icon_appearances
|
||||||
|
}
|
||||||
|
|
||||||
# Function to clean iOS build
|
# Function to clean iOS build
|
||||||
clean_ios_build() {
|
clean_ios_build() {
|
||||||
log_info "Cleaning iOS build artifacts..."
|
log_info "Cleaning iOS build artifacts..."
|
||||||
@@ -424,8 +531,7 @@ fi
|
|||||||
# Handle assets-only mode
|
# Handle assets-only mode
|
||||||
if [ "$ASSETS_ONLY" = true ]; then
|
if [ "$ASSETS_ONLY" = true ]; then
|
||||||
log_info "Assets-only mode: generating assets"
|
log_info "Assets-only mode: generating assets"
|
||||||
ensure_ios_capacitor_asset_directories
|
safe_execute "Generating assets" "generate_ios_assets" || exit 7
|
||||||
safe_execute "Generating assets" "npx capacitor-assets generate --ios" || exit 7
|
|
||||||
log_success "Assets generation completed successfully!"
|
log_success "Assets generation completed successfully!"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@@ -574,8 +680,7 @@ safe_execute "Installing CocoaPods dependencies" "run_pod_install_with_workaroun
|
|||||||
safe_execute "Syncing with Capacitor" "run_cap_sync_with_workaround" || exit 6
|
safe_execute "Syncing with Capacitor" "run_cap_sync_with_workaround" || exit 6
|
||||||
|
|
||||||
# Step 7: Generate assets
|
# Step 7: Generate assets
|
||||||
ensure_ios_capacitor_asset_directories
|
safe_execute "Generating assets" "generate_ios_assets" || exit 7
|
||||||
safe_execute "Generating assets" "npx capacitor-assets generate --ios" || exit 7
|
|
||||||
|
|
||||||
# Step 8: Build iOS app
|
# Step 8: Build iOS app
|
||||||
safe_execute "Building iOS app" "build_ios_app" || exit 5
|
safe_execute "Building iOS app" "build_ios_app" || exit 5
|
||||||
|
|||||||
Reference in New Issue
Block a user