主要內(nèi)容:
- 區(qū)分
Project
、Target
、Scheme
- 多
Target
配置 -
Scheme
配置 -
xcconfig
文件配置
一、區(qū)分Project、Target、Scheme
-
Project
:是一個項目的整體,相當(dāng)于一個倉庫,包括了所有的代碼和資源文件; -
Target
:相當(dāng)于一個具體的產(chǎn)品,包含了對于代碼,資源文件的具體使用規(guī)則和配置; -
Scheme
: 對指定Target
的環(huán)境進行配置;
總結(jié):一個Project
可以包含多個Target
,也就是說通過不同Target
我們可以生成不同的APP
;
多環(huán)境配置的三種方法:
- 多
target
配置; -
Scheme
配置; -
xcconfig
文件配置;
二、多Target 配置
1.總結(jié)特點
- 優(yōu)點:方便管理代碼,資源文件,比如在
Compile Sources
、Copy Bundle Resources
里根據(jù)需要增加或者刪除需要編譯的代碼和資源; - 缺點:配置繁瑣,涉及多個
info.plist
文件、宏定義等,大量的修改人容易錯亂;
2.基本步驟
1.創(chuàng)建新target
選中已有target
,右鍵選擇Duplicate
,會拷貝創(chuàng)建出與原Target
相同配置的新Target
;
2.修改新target
的配置
由于拷貝得到的target
仍使用舊的配置,為了使用新target
,所以我們還需要一些額外設(shè)置:
- 修改新
Target
名字; - 修改新
info.plist
名字; - 修改
Build Settings
->Packaging
->info.plist File
與Product Bundle identifier
;
3.修改Scheme
名字
進入Scheme Manager
,修改Scheme
的名字,這里并非必須,修改是為了更加方便識別;
4.為了區(qū)別不同的Target
,增加預(yù)定義宏
配置OC
工程:Build Settings
-> Preprocessor Macros
配置Swift
工程:Build Settings
-> Other Swift Flags
理解-D
用法:
-
swiftc
編譯器中,需要添加一個-D
的option
,代表將條件編譯標志標記為true
; - 至于
-D
的說明,也可以使用控制臺命令查看:swiftc --help |grep '-D'
-D <value> Marks a conditional compilation flag as true
5.測試target
多環(huán)境
#if DEV
print("Project DEV")
#else
print("Project Normal")
#endif
三、Scheme配置
配置Scheme
實現(xiàn)多環(huán)境,其實是通過設(shè)置多種configurations
的方式,具體步驟如下:
1.增加新configration
進入Project
-> Info
-> Configurations
,在這里可以看到已經(jīng)存在的Debug
、Release
等配置。點擊“+”
,可以在這里增加新的configuration
(以Dev
為例);
2.切換多環(huán)境
增加configuration
后,在Edit Scheme
時,也會多出一種configration
。我們在run
的時候,就可以手動切換configration
使用不同的環(huán)境;
3.多Scheme
每次手動切換configration
較為繁瑣,我們還可以使用不同的Scheme
直接對應(yīng)不同的配置;
4.測試Scheme多環(huán)境
1.Build Setting
-> User-Defined
里自定義Host_URL
,再對不同的configration
配置不同的值;
2.將Host_URL
以變量的方式配置到info.plist
文件中;
3.讀取info.plist
,手動切換configration
或者使用不同的Scheme
運行,將得到不同的信息;
guard let path = Bundle.main.path(forResource: "Info", ofType: "plist") else { return}
guard let infoDic = NSDictionary(contentsOfFile: path) else {return}
if let host_url = infoDic["HOST_URL"] {
print("HOST_URL:\(host_url)")
}
四、xcconfig配置文件
xcconfig
配置文件:
-
.xcconfig
配置文件,可以幫助我們以文件的形式配置build settings
里的內(nèi)容; -
.xcconfig
的文件的內(nèi)容,是以key-value
形式構(gòu)成的; - 增加
.xcconfig
文件后,依然可以繼續(xù)在build settings
里增加配置項目,并不會覆蓋;
1.查看配置文件
其實,若使用Cocoapods
管理第三方庫,就已經(jīng)自動生成了Debug
和Release
配置文件。
查看配置:Xcode
-> PROJECT
-> info
-> Configurations
2.自定義配置文件
-
Commd +N
-> 搜索Configuration Setting File
,保存名稱以"目錄名-App名.環(huán)境
"為格式, 如"Config-TestProject.debug
"; - 在
.xcconfig
文件里寫入配置,而這里用到的key
其實都是build settings
配置選項的縮寫,具體可查看網(wǎng)站Xcode Build Settings;
舉例:在配置文件中寫入以下配置:
SLASH = /
HOST_URL = http:${SLASH}/1234
OTHER_LDFLAGS = -framework "AFNetworking"
HEADER_SEARCH_PATHS = /abcd/efg
此時執(zhí)行編譯后,在build settings
里搜索查看Other Linker Flags
、Header Search Paths
,這些配置都已經(jīng)被成功修改;
3.特殊符號問題
在寫入配置信息時,其中url
的//
會被認為是注釋。此時,我們可以先定義一個變量SLASH = /
, 如下代碼:
SLASH = /
HOST_URL = http:${SLASH}/5678
4.增加約束條件
某些情況下,我們需要為配置增加約束條件,如只在Debug
環(huán)境下、SDK
是模擬器,且架構(gòu)是x86_64
的情況下才會link
這個frameworkName
,則需要如下配置:
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64] = -framework "frameworkName"
5.xcconfig文件沖突問題
我們習(xí)慣于使用cocoapods
管理第三方,由其生成的配置文件和我們自定義的配置文件就會沖突,因為一個環(huán)境只能配置一個.xcconfig
文件:
而且,此時更新Pods
也會警告:已經(jīng)存在其他的配置文件,Pods
設(shè)置的.xcconfig
文件不會生效;
解決方案:在自定義配置文件中使用關(guān)鍵include
命令,引入pods
的配置文件,使其生效:
//注意:這里需要根據(jù)debug、release等不同的環(huán)境,分別設(shè)置
#include "Pods/Target Support Files/Pods-TestProject/Pods-TestProject.debug.xcconfig"
6.xcconfig關(guān)鍵字沖突問題
將Pods
生成的.xcconfig
文件通過include
導(dǎo)入自定義的配置文件中后,如果兩者都對同一個key
進行過配置,就會導(dǎo)致前者無效的問題。
比如,兩者都對相同的Other Link Flags
進行配置,查看Build Setting
后,會發(fā)現(xiàn)Pods
生成的.xcconfig
沒有生效;
解決方案:使用inherited
進行繼承,在自定義配置文件中配置如下:
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"
7.測試.xcconfig多環(huán)境
- 在不同的
.xcconfig
定義不同的HOST_URL
,并以類似上文的步驟在info.plist
中增加配置; - 切換到不同的
configration
下運行項目,將會得到不同的HOST_URL
;