前言
在項目的QA階段,如果有一種途徑可以讓測試的小姐姐們知道當前App是什么版本,以及包是inhouse還是adhoc的,就可以節(jié)省不少確認當前App包信息的時間,定位Bug也會更方便許多。
例如這樣:

一目了然有沒有!每次要驗證問題前都可以方便的知道要不要更新新包(以svn版本號為判斷基準)、清楚需要在哪種打包方式打的包上驗證,甚至可以盡情打開自己的腦洞,DIY自己的AppIcon!
而這一切都得益于krzysztofzablocki這位大神寫一個腳本IconOverlaying,github地址在這IconOverlaying。實際上這位大神已經(jīng)將IconOverlaying集成到KZBootstrap這個插件中了,同樣奉上github地址KZBootstrap。
在項目中用CocoaPods添加KZBootstrap后,我們的App就已經(jīng)具有了一個經(jīng)過默認修改的AppIcon。但如果不想只因為用到這個小功能就多引用一個Pod,或者需要定制屬于自己的AppIcon,那本文接下來的內(nèi)容也許會對你有幫助。
1、說明
在真正配置IconOverlaying前,可以簡單了解一下它是怎么運作的。簡單來說就是在App編譯打包成.app之后,到利用證書簽名為.ipa之前的這兩個步驟中,利用腳本將我們需要的信息合成到.app包中的AppIcon.png上。
閱讀大神提供的Shell腳本,我們可以發(fā)現(xiàn)以下幾點:
- .app包的路徑、icon文件名稱、項目信息等都可以通過Xcode的環(huán)境變量和info.plist獲取。
- git(svn)的版本信息、當前分支,可以通過git(svn)的相關(guān)腳本命令獲取。
- 圖片的合成依賴
ImageMagick這個工具,而ImageMagick則依賴于GhostScript,所以這兩個工具都需要先安裝好。
知道這些之后也算心里有數(shù)了,接下來開始集成這個功能到我們的項目中。
2、集成
配置IconOverlaying十分簡單,步驟大概為:
- 確保
ImageMagick和GhostScript已經(jīng)安裝,安裝方法是在命令行中用brew安裝。
Tidus$ brew install imagemagick
Tidus$ brew install ghostscript
- 在我們的項目中隨便創(chuàng)建一個.sh文件,然后復(fù)制大神提供的Shell腳本中的內(nèi)容粘貼到我們的.sh文件。
- 在Xcode中選中對應(yīng)的
Target->Build Phases->左上角New Run Script Phase,在Shell文本框中輸入
"${SRCROOT}/你的項目名/剛才新建的sh文件.sh"
##在這里我的是
"${SRCROOT}/CommonDemo/processIcon.sh"
配置到此結(jié)束,然后運行我們的項目后返回模擬器桌面,如無意外就應(yīng)該可以看到我們的AppIcon被添加上了一些版本信息了。
3、可能會出現(xiàn)的問題
盡管配置IconOverlaying本身十分簡單,但在這過程中我也遇到了一點問題。
1)編譯時報錯Permission denied
比如:

這是由于腳本沒有運行權(quán)限導(dǎo)致的,給腳本加上運行權(quán)限即可
Tidus$ chmod +x /Users/tidus/Applications/SourceTree/CommonDemo/CommonDemo/processIcon.sh
2)腳本提示找不到入口
比如:

這是由于腳本是根據(jù)打包后.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)的節(jié)點,即使沒有配置值也可以。
3)生成的AppIcon.png有樣式問題
個別AppIcon.png在處理后會出現(xiàn)異常情況,比如:

具體原因未知,但問題出在用
ImageMagick生成mask.png時,后來查閱ImageMagick的相關(guān)文檔后用新的代碼替換了原來的生成mask的代碼,問題解決。
#腳本中原來的代碼
convert /tmp/blurred.png -gamma 0 -fill white -draw "rectangle 0,$band_position,$width,$height" /tmp/mask.png
#用另一種方式創(chuàng)建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的相關(guān)文檔:
http://www.imagemagick.org/Usage/
https://www.imagemagick.org/script/index.php
4)其他問題
另外腳本中還存在幾處語法錯誤,例如在判斷是否Release環(huán)境時:
#編譯時這里報了語法錯誤
if [ $CONFIGURATION = "Release" ]; then
#修復(fù)并加入其他判斷
if [[ $CONFIGURATION == "Release" ]] && [[ $PRODUCT_BUNDLE_IDENTIFIER != *.inhouse ]] && [[ $PRODUCT_BUNDLE_IDENTIFIER != *.adhoc ]]
then
將其修正后,也加入了根據(jù)BUNDLE_IDENTIFIER判斷打包方式的邏輯。
4、參考資料:
phzean寫的一篇文章:ios 腳本實現(xiàn)程序Icon顯示APP版本信息
文章就到此結(jié)束了,DEMO:https://github.com/Tidusww/CommonDemo.git,有興趣的朋友可以去看看