自动在app图标上添加应用的版本信息

from:http://merowing.info/2013/03/overlaying-application-version-on-top-of-your-icon/

Overlaying application version on top of your icon


I’ve just returned from NSConference #5, there were many good talks there, but my favourite one was the one about Flipboard development tools/setup by Evan Doll.

Especially how they add version information on top of the icons.Unfortunately they didn’t share it with us.

So I wrote my own.

What we will be overlaying ?

I’ve decided that 3 parts of information should be enough:

  • version number
  • branch name
  • short commit hash

Version number

We can extract version number straight from our application .plist file by using PlistBuddy tool:

version=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_FILE}"`

PS. You could extract any plist entry with this tool, just change CFBundleVersion to different key (show raw keys in Xcode)

Branch and short commit hash

git command line tool offers rev-parse command which let’s you both of those variables:

commit=`git rev-parse --short HEAD`
branch=`git rev-parse --abbrev-ref HEAD`

How to overlay it ?

ImageMagic is my go-to tool for playing with images from command line, it offers crazy amount of functions.

Make sure to install ImageMagick and ghostscript (fonts) first, you can use brew to simplify process:

brew install imagemagick
brew install ghostscript

We can use convert function, by specifing caption parameter imagemagick will layout our text on top of image, we also setup alignment to bottom and default height.

convert -background '#0008' -fill white -gravity center -size ${width}x40 \
    caption:"${version} ${branch} ${commit}" \
    ${base_file} +swap -gravity south -composite  "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${target_file}"

Setting it up in Xcode project

There are few steps we need to take in order to set this up as part of Xcode build:

  1. Rename your Icon* files (where * is @2x, -568h etc.) to Icon_base*, e.g. Icon@2x_base.png
  2. Add run script for your target under Build Phases
  3. Paste this code:
commit=`git rev-parse --short HEAD`
branch=`git rev-parse --abbrev-ref HEAD`
version=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_FILE}"`

function processIcon() {
    export PATH=$PATH:/usr/local/bin
    base_file=$1
    base_path=`find ${SRCROOT} -name $base_file`

    if [[ ! -f ${base_path} || -z ${base_path} ]]; then
        return;
    fi

    target_file=`echo $base_file | sed "s/_base//"`
    target_path="${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${target_file}"

    if [ $CONFIGURATION = "Release" ]; then
    cp ${base_file} $target_path
    return
    fi

    width=`identify -format %w ${base_path}`

    convert -background '#0008' -fill white -gravity center -size ${width}x40\
    caption:"${version} ${branch} ${commit}"\
    ${base_path} +swap -gravity south -composite ${target_path}
}

processIcon "Icon_base.png"
processIcon "Icon@2x_base.png"
processIcon "Icon-72_base.png"
processIcon "Icon-72@2x_base.png"

Conclusion

Few things about final script:

  • I’ve added support for skipping icons that don’t exist, no need to change script contents.
  • I’m using sed to strip _base string from file name.
  • For release build we don’t want to overlay our development info.
  • Xcode likes messes up path resolution, so I’ve added usr/local/bin to it for this terminal lifetime.

Now run your project and you should see this:

Sample project on GitHub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值