在 Xcode 9 中的构建时更改 AppIcon
Change AppIcon at build time in Xcode 9
我在构建时使用脚本生成应用程序图标(只需为调试模式添加 "dev" 标题)。使用 ImageMagick 和 Ghostscript 非常容易(google 中有很多示例)。在我开始使用新的 Xcode 9 之前一切正常。现在,我可以在 MyAppName.app 文件上看到更新的图标,但 simulator/device 显示资产中的 AppIcon。
有什么建议么?感谢
似乎 Xcode9 构建应用程序时,它现在将资产目录中的应用程序图标复制为私有格式,并且不直接使用捆绑包中的应用程序图标文件。这可能与新的 iOS11 功能有关,您可以在 运行 时间更改应用程序图标。
有一个简单的修复方法。您需要做的是在资产目录中 直接 更改您的应用程序图标,因此必须在您的构建设置中进行 2 次更改:
1.步骤 - 更新 运行 脚本阶段
更新您的 "generate icon" 运行 脚本构建阶段,以便更新后的图标不会复制到目标包中,而是在资产目录中更改图标。这是我的生成脚本的示例,请注意 target_path=$base_path
行:
function processIcon() {
export PATH=$PATH:/usr/local/bin
base_file=
base_path=`find ${SRCROOT}/Cards/Assets.xcassets -name $base_file`
if [[ ! -f ${base_path} || -z ${base_path} ]]; then
echo "failed to find base_path for $base_file"
return -1;
fi
target_file=`echo $base_file`
#this is the change
target_path=$base_path
echo $target_path
width=`identify -format %w ${base_path}`
convert -background '#0008' -fill white -gravity center -size ${width}x40 caption:"${version} (${build}) ${commit}" ${base_path} +swap -gravity south -composite ${target_path}
}
2。步骤 - 更改构建阶段的顺序
您必须更改构建阶段的顺序,以便 "Generate Icon" 构建阶段被排序为 在 "Copy Bundle Resources" 构建阶段之前:
原创想法和脚本代码来自Krzysztof Zabłocki's blog post.
我找不到修复脚本的方法,所以我改变了方法。
我做了什么:
- 添加了新变量BUNDLE_ID_SUFFIX(构建设置/+/用户自定义设置)。
- 我的配置(质量检查、发布、开发)很少,所以我刚刚在 Info.plist 中更新了 "Bundle Identifier"。我附加了 ${BUNDLE_ID_SUFFIX},所以现在我的开发配置有像 com.my.app.dev、qa - com.my.app.qa 等包 ID
- 接下来,我又添加了一组图标(带有 "dev" 标签)。我以与 bundle id 相同的方式设置 AppIcon 名称 - 我附加了 ${BUNDLE_ID_SUFFIX}。
结果,我为每个配置设置了不同的应用程序图标。
下面是 link 我遵循的很棒的教程
看看下面的 link,解决方案效果很好。
支持Xcode9
在此处查看完整示例
https://github.com/dimohamdy/IconOverlaying
完整脚本
#!/bin/sh
export PATH=/opt/local/bin/:/opt/local/sbin:$PATH:/usr/local/bin:
convertPath=`which convert`
gsPath=`which gs`
if [[ ! -f ${convertPath} || -z ${convertPath} ]]; then
convertValidation=true;
else
convertValidation=false;
fi
if [[ ! -f ${gsPath} || -z ${gsPath} ]]; then
gsValidation=true;
else
gsValidation=false;
fi
if [[ "$convertValidation" = true || "$gsValidation" = true ]]; then
echo "WARNING: Skipping Icon versioning, you need to install ImageMagick and ghostscript (fonts) first, you can use brew to simplify process:"
if [[ "$convertValidation" = true ]]; then
echo "brew install imagemagick"
fi
if [[ "$gsValidation" = true ]]; then
echo "brew install ghostscript"
fi
exit 0;
fi
version=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${SRCROOT}/${PROJECT_NAME}/${INFOPLIST_PATH}"`
build_num=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${SRCROOT}/${PROJECT_NAME}/${INFOPLIST_PATH}"`
# Check if we are under a Git or Hg repo
if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1; then
commit=`git rev-parse --short HEAD`
branch=`git rev-parse --abbrev-ref HEAD`
else
commit=`hg identify -i`
branch=`hg identify -b`
fi;
#SRCROOT=..
#CONFIGURATION_BUILD_DIR=.
#UNLOCALIZED_RESOURCES_FOLDER_PATH=.
#commit="3783bab"
#branch="master"
#version="3.4"
#build_num="9999"
shopt -s extglob
build_num="${build_num##*( )}"
shopt -u extglob
caption="${version} ($build_num)\n${branch}\n${commit}"
echo $caption
function abspath() { pushd . > /dev/null; if [ -d "" ]; then cd ""; dirs -l +0; else cd "`dirname \"\"`"; cur_dir=`dirs -l +0`; if [ "$cur_dir" == "/" ]; then echo "$cur_dir`basename \"\"`"; else echo "$cur_dir/`basename \"\"`"; fi; fi; popd > /dev/null; }
function processIcon() {
base_path=
echo base_path
#this is the change
target_path=$base_path
width=`identify -format %w ${base_path}`
height=`identify -format %h ${base_path}`
band_height=$((($height * 47) / 100))
band_position=$(($height - $band_height))
text_position=$(($band_position - 3))
point_size=$(((13 * $width) / 100))
echo "Image dimensions ($width x $height) - band height $band_height @ $band_position - point size $point_size"
#
# blur band and text
#
convert ${base_path} -blur 10x8 /tmp/blurred.png
convert /tmp/blurred.png -gamma 0 -fill white -draw "rectangle 0,$band_position,$width,$height" /tmp/mask.png
convert -size ${width}x${band_height} xc:none -fill 'rgba(0,0,0,0.2)' -draw "rectangle 0,0,$width,$band_height" /tmp/labels-base.png
convert -background none -size ${width}x${band_height} -pointsize $point_size -fill white -gravity center -gravity South caption:"$caption" /tmp/labels.png
convert ${base_path} /tmp/blurred.png /tmp/mask.png -composite /tmp/temp.png
rm /tmp/blurred.png
rm /tmp/mask.png
#
# compose final image
#
filename=New${base_file}
convert /tmp/temp.png /tmp/labels-base.png -geometry +0+$band_position -composite /tmp/labels.png -geometry +0+$text_position -geometry +${w}-${h} -composite "${target_path}"
# clean up
rm /tmp/temp.png
rm /tmp/labels-base.png
rm /tmp/labels.png
echo "Overlayed ${target_path}"
}
if [ $CONFIGURATION = "Release" ]; then
cp $SRCROOT/$PROJECT_NAME/Assets.xcassets/AppIcon.appiconset/icons/*.png "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset/"
echo "Exit"
exit 0
fi
if [ -d "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset/icons/" ]
then
echo "Directory exists."
# get original icon to copy to assets
cp $SRCROOT/$PROJECT_NAME/Assets.xcassets/AppIcon.appiconset/icons/*.png "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset/"
else
# copy orgin to AppIcon
rsync -rv --include '*.png' --exclude '*' "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset/" "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset/icons/"
fi
for entry in "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset"/*.png
do
processIcon "$entry"
done
我在构建时使用脚本生成应用程序图标(只需为调试模式添加 "dev" 标题)。使用 ImageMagick 和 Ghostscript 非常容易(google 中有很多示例)。在我开始使用新的 Xcode 9 之前一切正常。现在,我可以在 MyAppName.app 文件上看到更新的图标,但 simulator/device 显示资产中的 AppIcon。 有什么建议么?感谢
似乎 Xcode9 构建应用程序时,它现在将资产目录中的应用程序图标复制为私有格式,并且不直接使用捆绑包中的应用程序图标文件。这可能与新的 iOS11 功能有关,您可以在 运行 时间更改应用程序图标。
有一个简单的修复方法。您需要做的是在资产目录中 直接 更改您的应用程序图标,因此必须在您的构建设置中进行 2 次更改:
1.步骤 - 更新 运行 脚本阶段
更新您的 "generate icon" 运行 脚本构建阶段,以便更新后的图标不会复制到目标包中,而是在资产目录中更改图标。这是我的生成脚本的示例,请注意 target_path=$base_path
行:
function processIcon() {
export PATH=$PATH:/usr/local/bin
base_file=
base_path=`find ${SRCROOT}/Cards/Assets.xcassets -name $base_file`
if [[ ! -f ${base_path} || -z ${base_path} ]]; then
echo "failed to find base_path for $base_file"
return -1;
fi
target_file=`echo $base_file`
#this is the change
target_path=$base_path
echo $target_path
width=`identify -format %w ${base_path}`
convert -background '#0008' -fill white -gravity center -size ${width}x40 caption:"${version} (${build}) ${commit}" ${base_path} +swap -gravity south -composite ${target_path}
}
2。步骤 - 更改构建阶段的顺序
您必须更改构建阶段的顺序,以便 "Generate Icon" 构建阶段被排序为 在 "Copy Bundle Resources" 构建阶段之前:
原创想法和脚本代码来自Krzysztof Zabłocki's blog post.
我找不到修复脚本的方法,所以我改变了方法。 我做了什么:
- 添加了新变量BUNDLE_ID_SUFFIX(构建设置/+/用户自定义设置)。
- 我的配置(质量检查、发布、开发)很少,所以我刚刚在 Info.plist 中更新了 "Bundle Identifier"。我附加了 ${BUNDLE_ID_SUFFIX},所以现在我的开发配置有像 com.my.app.dev、qa - com.my.app.qa 等包 ID
- 接下来,我又添加了一组图标(带有 "dev" 标签)。我以与 bundle id 相同的方式设置 AppIcon 名称 - 我附加了 ${BUNDLE_ID_SUFFIX}。 结果,我为每个配置设置了不同的应用程序图标。
下面是 link 我遵循的很棒的教程
看看下面的 link,解决方案效果很好。
支持Xcode9
在此处查看完整示例 https://github.com/dimohamdy/IconOverlaying
完整脚本
#!/bin/sh
export PATH=/opt/local/bin/:/opt/local/sbin:$PATH:/usr/local/bin:
convertPath=`which convert`
gsPath=`which gs`
if [[ ! -f ${convertPath} || -z ${convertPath} ]]; then
convertValidation=true;
else
convertValidation=false;
fi
if [[ ! -f ${gsPath} || -z ${gsPath} ]]; then
gsValidation=true;
else
gsValidation=false;
fi
if [[ "$convertValidation" = true || "$gsValidation" = true ]]; then
echo "WARNING: Skipping Icon versioning, you need to install ImageMagick and ghostscript (fonts) first, you can use brew to simplify process:"
if [[ "$convertValidation" = true ]]; then
echo "brew install imagemagick"
fi
if [[ "$gsValidation" = true ]]; then
echo "brew install ghostscript"
fi
exit 0;
fi
version=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${SRCROOT}/${PROJECT_NAME}/${INFOPLIST_PATH}"`
build_num=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${SRCROOT}/${PROJECT_NAME}/${INFOPLIST_PATH}"`
# Check if we are under a Git or Hg repo
if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1; then
commit=`git rev-parse --short HEAD`
branch=`git rev-parse --abbrev-ref HEAD`
else
commit=`hg identify -i`
branch=`hg identify -b`
fi;
#SRCROOT=..
#CONFIGURATION_BUILD_DIR=.
#UNLOCALIZED_RESOURCES_FOLDER_PATH=.
#commit="3783bab"
#branch="master"
#version="3.4"
#build_num="9999"
shopt -s extglob
build_num="${build_num##*( )}"
shopt -u extglob
caption="${version} ($build_num)\n${branch}\n${commit}"
echo $caption
function abspath() { pushd . > /dev/null; if [ -d "" ]; then cd ""; dirs -l +0; else cd "`dirname \"\"`"; cur_dir=`dirs -l +0`; if [ "$cur_dir" == "/" ]; then echo "$cur_dir`basename \"\"`"; else echo "$cur_dir/`basename \"\"`"; fi; fi; popd > /dev/null; }
function processIcon() {
base_path=
echo base_path
#this is the change
target_path=$base_path
width=`identify -format %w ${base_path}`
height=`identify -format %h ${base_path}`
band_height=$((($height * 47) / 100))
band_position=$(($height - $band_height))
text_position=$(($band_position - 3))
point_size=$(((13 * $width) / 100))
echo "Image dimensions ($width x $height) - band height $band_height @ $band_position - point size $point_size"
#
# blur band and text
#
convert ${base_path} -blur 10x8 /tmp/blurred.png
convert /tmp/blurred.png -gamma 0 -fill white -draw "rectangle 0,$band_position,$width,$height" /tmp/mask.png
convert -size ${width}x${band_height} xc:none -fill 'rgba(0,0,0,0.2)' -draw "rectangle 0,0,$width,$band_height" /tmp/labels-base.png
convert -background none -size ${width}x${band_height} -pointsize $point_size -fill white -gravity center -gravity South caption:"$caption" /tmp/labels.png
convert ${base_path} /tmp/blurred.png /tmp/mask.png -composite /tmp/temp.png
rm /tmp/blurred.png
rm /tmp/mask.png
#
# compose final image
#
filename=New${base_file}
convert /tmp/temp.png /tmp/labels-base.png -geometry +0+$band_position -composite /tmp/labels.png -geometry +0+$text_position -geometry +${w}-${h} -composite "${target_path}"
# clean up
rm /tmp/temp.png
rm /tmp/labels-base.png
rm /tmp/labels.png
echo "Overlayed ${target_path}"
}
if [ $CONFIGURATION = "Release" ]; then
cp $SRCROOT/$PROJECT_NAME/Assets.xcassets/AppIcon.appiconset/icons/*.png "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset/"
echo "Exit"
exit 0
fi
if [ -d "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset/icons/" ]
then
echo "Directory exists."
# get original icon to copy to assets
cp $SRCROOT/$PROJECT_NAME/Assets.xcassets/AppIcon.appiconset/icons/*.png "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset/"
else
# copy orgin to AppIcon
rsync -rv --include '*.png' --exclude '*' "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset/" "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset/icons/"
fi
for entry in "${SRCROOT}/${PROJECT_NAME}/Assets.xcassets/AppIcon.appiconset"/*.png
do
processIcon "$entry"
done