前言
在開發專案時,經常需要在開發環境下增加一些方便除錯的方法,或者需要完成類似馬甲包的操作,等等,Xcode為我們提供了一個簡單的方案。
簡介
Target為我們提供了一個完全獨立的編譯環境,可以非常靈活的編譯工程程式碼。
生成Target
有兩種方法可以生成一個新的Target,新建一個Target和複製原有Target。
新建
在Targets欄目下點選+新建一個Target。

彈框中有很多可選項,比如一些應用的擴充套件也在這裡生成。我們需要的是Application下的選項,一般都是Single View App。

用這種方法生成的Target相當於新建了一個應用,多個Target間有各自的資料夾,檔案相互之間不會因命名的問題衝突。

複製
在要複製的Target上點選右鍵,在彈框中選擇Duplicate。

這時候會生成一個以copy結尾的Target,並在專案中生成一個對應plist檔案。


屬於所複製的應用原有的檔案都會在新的Target中生效。

基於Target開發
生成了Target之後,會有一些基於此Target的操作,這個時候需要了解專案中檔案的作用範圍。
檔案作用範圍
在新建檔案的時候可以選擇檔案生效的Target,可以多選。

可以針對不同的Target宣告不同的OC類,但是叫同一個名字,這樣就可以用同一套邏輯完成針對不同Target的各自實現,但是注意不要把相同名字的類存放在一個資料夾下。

如果專案中存在一些相同名字的類的話,在修改時要注意這個類的作用範圍。

如果在編譯的時候報錯找不到這個類,注意檢查一下是不是這個類的作用範圍不包括正在編譯的這個Target。
Target設定
在新建Target會根據你生成的方式預設填入相關的配置,併為這個Target生成Info.plist,當然,你也可以向平時一樣,手動指定其他的plist檔案。你也可以針對Target配置不同的證書等等,這裡就不再贅述。

巨集的運用
有時候對不同的Target不需要專門生成一個類去處理邏輯間的區別,這個時候預編譯巨集就能起到很好的區分作用了,可以宣告一個巨集,對不同的Target賦予不同的值,再在程式碼中根據值做不同的邏輯。


Run Script Phase
XCode為我們提供了Run Script功能,讓我們能用過shell指令碼在專案編譯時完成更多的操作,幫我們將關注儘可能的聚焦於程式碼部分。
在Target對應的Build Phases裡面點選+號,選擇New Run Script Phase,新增一個指令碼。


我們在專案中有時候也用指令碼來做Releas版本的Build的自增,避免了手動的繁瑣和失誤。
if [ $CONFIGURATION == Release ]; then
echo "Bumping build number..."
plist=${PROJECT_DIR}/${INFOPLIST_FILE}
#increment the build number (ie 115 to 116)
buildnum=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${plist}")
if [[ "${buildnum}" == "" ]]; then
echo "No build number in $plist"
exit 2
fi
buildnum=$(expr $buildnum + 1)
/usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "${plist}"
echo "Bumped build number to $buildnum"
else
echo $CONFIGURATION " build - Not bumping build number."
fi
複製程式碼
然而有了Target之後,我們可以做的事情就更多了。比如我們可以針對開發和釋出各生成一個Target,在釋出的的Target下將生成的ipa移動到指定的資料夾甚至釋出到網上,或者移除一些三方庫中模擬器的框架。不過要注意的是,因為指令碼是在程式碼編譯完之後才執行的,所以替換程式碼或資源對當前編譯的結果是無效的,只要下次編譯的時候才會生效。
不過這就要求對shell比較熟悉,不多說了,我去學shell了。