iOS項(xiàng)目管理: 利用Target來管理項(xiàng)目的調(diào)試、測試、發(fā)布等不同版本或者OEM版本
應(yīng)用場景
場景一:公司的一個(gè)項(xiàng)目,你經(jīng)常需要在文件中修改一些類似于微信AppKey、友盟ID、測試\調(diào)試IP地址等等毫無技術(shù)含量,但是十分浪費(fèi)時(shí)間的代碼,給測試人員,客戶等打包或者安裝測試版本。等到正式發(fā)布release版本的時(shí)候,又是一通改。
尤其是當(dāng)你正在寫代碼的時(shí)候,你會(huì)對這樣的行為感到異常煩躁。
場景二:公司性質(zhì)為OEM廠商,幾個(gè)或者十幾個(gè)客戶的應(yīng)用都是基于你自己公司的項(xiàng)目上,只不過是換了應(yīng)用圖標(biāo)、啟動(dòng)圖片、應(yīng)用名稱、Bundle ID、服務(wù)器IP地址、第三方分享或者檢測框架的ID、info.plist配置文件部分信息或者極小部分代碼的差異。
然而每一次項(xiàng)目迭代或者上線,你都需要花費(fèi)大量的時(shí)間為這些公司挨個(gè)手動(dòng)替換這些圖片文件資料,然后打包上傳到AppStore.(當(dāng)然如果你的公司如自己開發(fā)了替換還文件的自動(dòng)化工具,然后把蘋果上傳應(yīng)用接口自己搞了一遍,那么target就顯得意義不是很大)。
場景三:打開一些有名的第三方框架,是否發(fā)現(xiàn)在Xcode運(yùn)行按鈕左邊選擇不同的Scheme,運(yùn)行得到的代碼效果是不一樣的,這是為什么呢?
Target介紹
官方文檔中的介紹
A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace. A target defines a single product; it organizes the inputs into the build system—the source files and instructions for processing those source files—required to build that product. Projects can contain one or more targets, each of which produces one product.
The instructions for building a product take the form of build settings and build phases, which you can examine and edit in the Xcode project editor. A target inherits the project build settings, but you can override any of the project settings by specifying different settings at the target level. There can be only one active target at a time; the Xcode scheme specifies the active target.
英文好的同學(xué)可能很快就知道了Target的妙用,在一個(gè)Xcode工程中,每個(gè)Target單獨(dú)對應(yīng)一個(gè)應(yīng)用(A target defines a single product),因?yàn)槲覀兛梢栽诿總€(gè)Target中單獨(dú)設(shè)置屬于這個(gè)Target的配置文件屬性。
官方文檔地址:《蘋果官方文檔-Xcode Target部分》
創(chuàng)建項(xiàng)目的不同Target
實(shí)現(xiàn)不同版本之間的差異化,主要就是下邊幾個(gè)步驟:
1、「右鍵Duplicate-Duplicate Only」復(fù)制單個(gè)Target 或者 新建Target,然后重新命名
2、修改Target對應(yīng)生成的「xxx copy.plist」的工程配置文件的名字
3、Target對應(yīng)「Build Settings」下配置Info.plist路徑,或者直接在「General」中選擇info.plist。
4、因?yàn)橹匦旅薚arget的名字,所以需要在「Schemes」中選擇「Manage Schemes」刪除之前的schemes,然后重新添加當(dāng)前所有的Target的Schemes。
這個(gè)時(shí)候有一個(gè)注意點(diǎn),因?yàn)橹笠玫紽astlane腳本進(jìn)行自動(dòng)化打包上傳,所以這里需要勾選添加之后的schemes之后的「Shared」一項(xiàng),保證腳本可以讀取到Schemes權(quán)限。
5、配置預(yù)編譯的宏,這個(gè)宏的作用就類似于我們之前在.pch之間用「#if DEBUG- #else- #endif」的DEBUG,我們切換選擇項(xiàng)目的「Build Configuration」的時(shí)候,NSLog會(huì)不同顯示。
配置的位置:在「Target-Preprocessor Macros」下的Debug和Release中。宏名字沒有特殊要求, 格式有兩種,一種為:XXXXXXXXX = 0或者"NEW_TARGET名字" ; 另一種為 xxxxxxxx6、在類中添加匹配宏代碼,區(qū)分Target,并且添加屬于該Target的代碼。方式有三種為:
第一種:
//#ifdef target1的預(yù)編譯宏名字
#if target1的預(yù)編譯宏名字
// target1下的特有代碼,比如說請求IP地址
#else
// 其他target下的特有代碼,比如說請求IP地址
#endif
第二種:
// #ifdef xxxxxx
#if xxxxxx == 0 或者 NEW_TARGET名字
// 該target下的特有代碼,比如說請求IP地址
#elif xxxxxx == 1 或者 NEW_TARGET名字
// 該target下的特有代碼,比如說請求IP地址
#else
// 沒找到匹配的預(yù)編譯宏
#endif
第三種:
if (xxxxxx == 1 或者 NEW_TARGET名字) {
// 該target下的特有代碼,比如說請求IP地址
else
// 其他target下的特有代碼,比如說請求IP地址
7、設(shè)置Target對應(yīng)的應(yīng)用圖標(biāo)和啟動(dòng)圖片。這一步是針對OEM公司來說,如果你是自己公司只是自己的一個(gè)項(xiàng)目或者兩個(gè)項(xiàng)目,只是用Target管理調(diào)試、測試、發(fā)布版本的話,啟動(dòng)圖片用同一套,那么則不需要單獨(dú)設(shè)置這一步了。
我們知道設(shè)置應(yīng)用圖標(biāo)和和啟動(dòng)圖片的有兩種方式,一種是把圖片加到「Assets.xcassets」中,另一種是直接把圖片加到項(xiàng)目文件下。(需要也別注意下啟動(dòng)圖標(biāo)的尺寸,移步->《26- iOS項(xiàng)目基礎(chǔ) - 官方應(yīng)用圖標(biāo)和啟動(dòng)圖片的尺寸規(guī)范和相應(yīng)的工程方法》)
我只測試了圖片加到「Assets.xcassets」這種,在「Assets.xcassets」創(chuàng)建之后,修改或者不修改圖片夾的名字后,直接在「Target-General」中選擇對應(yīng)的圖片夾即可。
8、 如果你使用了Cocoapods的話,需要把新的Target添加到podfile文件中。有兩種添加方式。
第一種:
platform :ios, '8.0'
workspace 'xxxxxxxxx'
// 添加第三方框架
target 'xxxxxx' do
pod 'AFNetworking', '3.1.0'
end
// 添加的內(nèi)容和上邊的完全一樣
target 'xxxxx' do
pod 'AFNetworking', '3.1.0'
end
第二種:直接用link_with關(guān)聯(lián)多個(gè)Target
platform :ios, '8.0'
workspace 'xxxxxxxxx'
link_with 'target1', 'target2'
pod 'xxxxxx'
圖片說明






一些注意點(diǎn)
- 如果你是新建項(xiàng)目,設(shè)置應(yīng)用圖標(biāo)和啟動(dòng)圖片,可能會(huì)遇到設(shè)置了之后不顯示(白板)的問題,這個(gè)問題需要在我們設(shè)置步驟完成后,刪除之前的APP,然后clean progect, 重新安裝。具體移步-> 《iOS設(shè)置啟動(dòng)頁,啟動(dòng)圖片》
- 拖拽資源進(jìn)工程的時(shí)候,需要勾選你需要的Target才可以共享資源。 當(dāng)然,也可以拖拽到工程之后,單獨(dú)選擇資源共享。 利用這一點(diǎn),也可以實(shí)現(xiàn)Target之間的差異性。
后續(xù)
針對OEM公司,比如我的公司,僅僅有Target來管理只是完成了第一步,因?yàn)檫€有同樣繁瑣沒有任何技術(shù)含量的打包上傳這一步驟等著我們,這里我打算嘗試?yán)谩窮astlane」來實(shí)現(xiàn),關(guān)于Fastlane的一些基礎(chǔ)介紹,可以查看我之前的文章。
《自動(dòng)化工具Fastlane筆記一: 安裝, 打包,上傳(testFlight,app store)》
另外,結(jié)合多Target和Fastlane的一些自動(dòng)化實(shí)踐,我會(huì)寫到第27篇文章中。
結(jié)尾

我的博客地址: http://www.lilongcnc.cc/