【IconOverlaying】在AppIcon上显示自定义信息

前言

在项目的QA阶段,如果有一种途径可以让测试的小姐姐们知道当前App是什么版本,以及包是inhouse还是adhoc的,就可以节省不少确认当前App包信息的时间,定位Bug也会更方便许多。
例如这样:


在AppIcon上显示版本信息

一目了然有没有!每次要验证问题前都可以方便的知道要不要更新新包(以svn版本号为判断基准)、清楚需要在哪种打包方式打的包上验证,甚至可以尽情打开自己的脑洞,DIY自己的AppIcon!

而这一切都得益于krzysztofzablocki这位大神写一个脚本IconOverlaying,github地址在这IconOverlaying。实际上这位大神已经将IconOverlaying集成到KZBootstrap这个插件中了,同样奉上github地址KZBootstrap

在项目中用CocoaPods添加KZBootstrap后,我们的App就已经具有了一个经过默认修改的AppIcon。但如果不想只因为用到这个小功能就多引用一个Pod,或者需要定制属于自己的AppIcon,那本文接下来的内容也许会对你有帮助。

1、说明

在真正配置IconOverlaying前,可以简单了解一下它是怎么运作的。简单来说就是在App编译打包成.app之后,到利用证书签名为.ipa之前的这两个步骤中,利用脚本将我们需要的信息合成到.app包中的AppIcon.png上。

阅读大神提供的Shell脚本,我们可以发现以下几点:

  1. .app包的路径、icon文件名称、项目信息等都可以通过Xcode的环境变量和info.plist获取。
  2. git(svn)的版本信息、当前分支,可以通过git(svn)的相关脚本命令获取。
  3. 图片的合成依赖ImageMagick这个工具,而ImageMagick则依赖于GhostScript,所以这两个工具都需要先安装好。

知道这些之后也算心里有数了,接下来开始集成这个功能到我们的项目中。

2、集成

配置IconOverlaying十分简单,步骤大概为:

  1. 确保ImageMagickGhostScript已经安装,安装方法是在命令行中用brew安装。
Tidus$ brew install imagemagick
Tidus$ brew install ghostscript
  1. 在我们的项目中随便创建一个.sh文件,然后复制大神提供的Shell脚本中的内容粘贴到我们的.sh文件。
  2. 在Xcode中选中对应的Target -> Build Phases -> 左上角New Run Script Phase,在Shell文本框中输入
"${SRCROOT}/你的项目名/刚才新建的sh文件.sh"
##在这里我的是
"${SRCROOT}/CommonDemo/processIcon.sh"

配置到此结束,然后运行我们的项目后返回模拟器桌面,如无意外就应该可以看到我们的AppIcon被添加上了一些版本信息了。

3、可能会出现的问题

尽管配置IconOverlaying本身十分简单,但在这过程中我也遇到了一点问题。

1)编译时报错Permission denied

比如:


Permission denied

这是由于脚本没有运行权限导致的,给脚本加上运行权限即可

Tidus$ chmod +x /Users/tidus/Applications/SourceTree/CommonDemo/CommonDemo/processIcon.sh 

2)脚本提示找不到入口

比如:


这是由于脚本是根据打包后.app中的info.plist中的CFBundleIconFiles字段来确定AppIcon的名字的,参考脚本中的这段代码,输出的就是指定plist中指定字段的值:

icon=`/usr/libexec/PlistBuddy -c "Print CFBundleIcons:CFBundlePrimaryIcon:CFBundleIconFiles:$i" "${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}"`

输出

所以需要在info.plist中加上icon files (iOS 5)的节点,即使没有配置值也可以。
加上icon files (iOS 5)

3)生成的AppIcon.png有样式问题

个别AppIcon.png在处理后会出现异常情况,比如:


具体原因未知,但问题出在用ImageMagick生成mask.png时,后来查阅ImageMagick的相关文档后用新的代码替换了原来的生成mask的代码,问题解决。

#脚本中原来的代码
convert /tmp/blurred.png -gamma 0 -fill white -draw "rectangle 0,$band_position,$width,$height" /tmp/mask.png
#用另一种方式创建mask
convert -size ${width}x${height} -set colorspace RGB xc:none -fill black -draw "rectangle 0,$band_position,$width,$height" -colorspace sRGB /tmp/mask.png

顺带贴上ImageMagick的相关文档:
http://www.imagemagick.org/Usage/
https://www.imagemagick.org/script/index.php

4)其他问题

另外脚本中还存在几处语法错误,例如在判断是否Release环境时:

#编译时这里报了语法错误
if [ $CONFIGURATION = "Release" ]; then
#修复并加入其他判断
if [[ $CONFIGURATION == "Release" ]] && [[ $PRODUCT_BUNDLE_IDENTIFIER != *.inhouse ]] && [[ $PRODUCT_BUNDLE_IDENTIFIER != *.adhoc ]]
    then

将其修正后,也加入了根据BUNDLE_IDENTIFIER判断打包方式的逻辑。

4、参考资料:

phzean写的一篇文章:ios 脚本实现程序Icon显示APP版本信息

文章就到此结束了,DEMO:https://github.com/Tidusww/CommonDemo.git,有兴趣的朋友可以去看看

推荐阅读更多精彩内容