"I walk slowly, but I never walk backward."
我走得很慢,但從不後退
主要內容:
- 區分
Project
、Target
、Scheme
- 多
Target
配置 -
Scheme
配置 -
xcconfig
文件配置
一、區分Project、Target、Scheme
-
Project
:是一個項目的整體,相當於一個倉庫,包括了所有的代碼和資源文件; -
Target
:相當於一個具體的產品,包含了對於代碼,資源文件的具體使用規則和配置; -
Scheme
: 對指定Target
的環境進行配置;
總結:一個Project
可以包含多個Target
,也就是說通過不同Target
我們可以生成不同的APP
;
多環境配置的三種方法:
- 多
target
配置; -
Scheme
配置; -
xcconfig
文件配置;
二、多Target 配置
1.總結特點
- 優點:方便管理代碼,資源文件,比如在
Compile Sources
、Copy Bundle Resources
里根據需要增加或者刪除需要編譯的代碼和資源; - 缺點:配置繁瑣,涉及多個
info.plist
文件、宏定義等,大量的修改人容易錯亂;
2.基本步驟
1.創建新target
選中已有target
,右鍵選擇Duplicate
,會拷貝創建出與原Target
相同配置的新Target
;
2.修改新target
的配置
由於拷貝得到的target
仍使用舊的配置,爲了使用新target
,所以我們還需要一些額外設置:
- 修改新
Target
名字; - 修改新
info.plist
名字; - 修改
Build Settings
->Packaging
->info.plist File
與Product Bundle identifier
;
3.修改Scheme
名字
進入Scheme Manager
,修改Scheme
的名字,這裏並非必須,修改是爲了更加方便識別;
4.爲了區別不同的Target
,增加預定義宏
配置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
多環境
#if DEV
print("Project DEV")
#else
print("Project Normal")
#endif
三、Scheme配置
配置Scheme
實現多環境,其實是通過設置多種configurations
的方式,具體步驟如下:
1.增加新configration
進入Project
-> Info
-> Configurations
,在這裏可以看到已經存在的Debug
、Release
等配置。點擊“+”
,可以在這裏增加新的configuration
(以Dev
爲例);
2.切換多環境
增加configuration
後,在Edit Scheme
時,也會多出一種configration
。我們在run
的時候,就可以手動切換configration
使用不同的環境;
3.多Scheme
每次手動切換configration
較爲繁瑣,我們還可以使用不同的Scheme
直接對應不同的配置;
4.測試Scheme多環境
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
裏的內容; -
.xcconfig
的文件的內容,是以key-value
形式構成的; - 增加
.xcconfig
文件後,依然可以繼續在build settings
裏增加配置項目,並不會覆蓋;
1.查看配置文件
其實,若使用Cocoapods
管理第三方庫,就已經自動生成了Debug
和Release
配置文件。
查看配置:Xcode
-> PROJECT
-> info
-> Configurations
2.自定義配置文件
-
Commd +N
-> 搜索Configuration Setting File
,保存名稱以"目錄名-App名.環境
"爲格式, 如"Config-TestProject.debug
"; - 在
.xcconfig
文件裏寫入配置,而這裏用到的key
其實都是build settings
配置選項的縮寫,具體可查看網站Xcode Build Settings;
舉例:在配置文件中寫入以下配置:
SLASH = /
HOST_URL = http:${SLASH}/1234
OTHER_LDFLAGS = -framework "AFNetworking"
HEADER_SEARCH_PATHS = /abcd/efg
此時執行編譯後,在build settings
裏搜索查看Other Linker Flags
、Header Search Paths
,這些配置都已經被成功修改;
3.特殊符號問題
在寫入配置信息時,其中url
的//
會被認爲是註釋。此時,我們可以先定義一個變量SLASH = /
, 如下代碼:
SLASH = /
HOST_URL = http:${SLASH}/5678
4.增加約束條件
某些情況下,我們需要爲配置增加約束條件,如只在Debug
環境下、SDK
是模擬器,且架構是x86_64
的情況下才會link
這個frameworkName
,則需要如下配置:
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64] = -framework "frameworkName"
5.xcconfig文件衝突問題
我們習慣於使用cocoapods
管理第三方,由其生成的配置文件和我們自定義的配置文件就會衝突,因爲一個環境只能配置一個.xcconfig
文件:
而且,此時更新Pods
也會警告:已經存在其他的配置文件,Pods
設置的.xcconfig
文件不會生效;
解決方案:在自定義配置文件中使用關鍵include
命令,引入pods
的配置文件,使其生效:
//注意:這裏需要根據debug、release等不同的環境,分別設置
#include "Pods/Target Support Files/Pods-TestProject/Pods-TestProject.debug.xcconfig"
6.xcconfig關鍵字衝突問題
將Pods
生成的.xcconfig
文件通過include
導入自定義的配置文件中後,如果兩者都對同一個key
進行過配置,就會導致前者無效的問題。
比如,兩者都對相同的Other Link Flags
進行配置,查看Build Setting
後,會發現Pods
生成的.xcconfig
沒有生效;
解決方案:使用inherited
進行繼承,在自定義配置文件中配置如下:
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"
7.測試.xcconfig多環境
- 在不同的
.xcconfig
定義不同的HOST_URL
,並以類似上文的步驟在info.plist
中增加配置; - 切換到不同的
configration
下運行項目,將會得到不同的HOST_URL
;