代码之家  ›  专栏  ›  技术社区  ›  Viacheslav Kostechko

在Xcode 9中生成时更改AppIcon

  •  3
  • Viacheslav Kostechko  · 技术社区  · 7 年前

    我使用脚本在构建时生成应用程序图标(只需为调试模式添加“dev”标题)。使用ImageMagick和Ghostscript(谷歌中有很多例子)非常容易。在我开始使用新的Xcode 9之前,一切都很好。现在,我可以在MyAppName上看到更新的图标。应用程序文件,但模拟器/设备显示来自资产的AppIcon。 有什么建议吗?谢谢

    3 回复  |  直到 5 年前
        1
  •  5
  •   Tankista    7 年前

    看起来,当Xcode9构建应用程序时,它现在将应用程序图标从资产目录复制到私有格式,并且不直接使用捆绑包中的应用程序图标文件。这可能与iOS11的新功能有关,您可以在运行时更改应用程序图标。

    在资产目录中,因此必须在生成设置中进行2项更改:

    更新“生成图标”运行脚本构建阶段,以便更新的图标不会复制到目标捆绑包,而是在资产目录中更改图标。这是我的生成脚本示例,请注意 target_path=$base_path 行:

    function processIcon() {
        export PATH=$PATH:/usr/local/bin
        base_file=$1
        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}
    }
    

    您必须更改构建阶段的顺序,以便对“生成图标”构建阶段进行排序 “复制捆绑资源”构建阶段: changed order of build phases

    Krzysztof Zabłocki's blog post .

        2
  •  1
  •   Viacheslav Kostechko    7 年前

    我所做的:

    1. 添加了新的变量BUNDLE\u ID\u后缀(生成设置/+/用户定义的设置)。
    2. 我几乎没有配置(qa、发布、开发),所以我只是更新了Info中的“Bundle Identifier”。普利斯特。我附加了${BUNDLE\u ID\u SUFFIX},所以现在我的开发配置具有类似com的BUNDLE ID。我的应用程序。开发,qa-com。我的应用程序。qa等。
    3. 接下来,我又添加了一组图标(带有“dev”标签)。我以与bundle id相同的方式设置AppIcon名称-我附加了${bundle\u id\u SUFFIX}。

    下面是我遵循的伟大教程的链接
    请看以下内容 link

        3
  •  1
  •   Community CDub    4 年前

    支持Xcode 9

    在此处检查完整示例 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 "$1" ]; then cd "$1"; dirs -l +0; else cd "`dirname \"$1\"`"; cur_dir=`dirs -l +0`; if [ "$cur_dir" == "/" ]; then echo "$cur_dir`basename \"$1\"`"; else echo "$cur_dir/`basename \"$1\"`"; fi; fi; popd > /dev/null; }
    
    function processIcon() {
        base_path=$1
    
         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