前言
在项目的QA阶段,如果有一种途径可以让测试的小姐姐们知道当前App是什么版本,以及包是inhouse还是adhoc的,就可以节省不少确认当前App包信息的时间,定位Bug也会更方便许多。
例如这样:
一目了然有没有!每次要验证问题前都可以方便的知道要不要更新新包(以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脚本,我们可以发现以下几点:
- .app包的路径、icon文件名称、项目信息等都可以通过Xcode的环境变量和info.plist获取。
- git(svn)的版本信息、当前分支,可以通过git(svn)的相关脚本命令获取。
- 图片的合成依赖
ImageMagick
这个工具,而ImageMagick
则依赖于GhostScript
,所以这两个工具都需要先安装好。
知道这些之后也算心里有数了,接下来开始集成这个功能到我们的项目中。
2、集成
配置IconOverlaying
十分简单,步骤大概为:
- 确保
ImageMagick
和GhostScript
已经安装,安装方法是在命令行中用brew安装。
Tidus$ brew install imagemagick
Tidus$ brew install ghostscript
- 在我们的项目中随便创建一个.sh文件,然后复制大神提供的Shell脚本中的内容粘贴到我们的.sh文件。
- 在Xcode中选中对应的
Target
->Build Phases
->左上角New Run Script Phase
,在Shell文本框中输入
"${SRCROOT}/你的项目名/刚才新建的sh文件.sh"
##在这里我的是
"${SRCROOT}/CommonDemo/processIcon.sh"
配置到此结束,然后运行我们的项目后返回模拟器桌面,如无意外就应该可以看到我们的AppIcon被添加上了一些版本信息了。
3、可能会出现的问题
尽管配置IconOverlaying
本身十分简单,但在这过程中我也遇到了一点问题。
1)编译时报错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)
的节点,即使没有配置值也可以。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,有兴趣的朋友可以去看看