Xcode多環境配置

"I walk slowly, but I never walk backward."
我走得很慢,但從不後退

主要內容:

  1. 區分ProjectTargetScheme
  2. Target 配置
  3. Scheme配置
  4. xcconfig文件配置

一、區分Project、Target、Scheme

  • Project:是一個項目的整體,相當於一個倉庫,包括了所有的代碼和資源文件;
  • Target:相當於一個具體的產品,包含了對於代碼,資源文件的具體使用規則和配置;
  • Scheme: 對指定Target的環境進行配置;

總結:一個Project可以包含多個Target,也就是說通過不同Target我們可以生成不同的APP

多環境配置的三種方法:

  1. target配置;
  2. Scheme配置;
  3. xcconfig文件配置;

二、多Target 配置

1.總結特點
  • 優點:方便管理代碼,資源文件,比如在Compile SourcesCopy Bundle Resources里根據需要增加或者刪除需要編譯的代碼和資源;
  • 缺點:配置繁瑣,涉及多個info.plist文件、宏定義等,大量的修改人容易錯亂;
2.基本步驟

1.創建新target

選中已有target,右鍵選擇Duplicate,會拷貝創建出與原Target相同配置的新Target

2.修改新target的配置

由於拷貝得到的target仍使用舊的配置,爲了使用新target,所以我們還需要一些額外設置:

  1. 修改新Target名字;
  2. 修改新info.plist名字;
  3. 修改Build Settings -> Packaging -> info.plist FileProduct Bundle identifier

3.修改Scheme名字

進入Scheme Manager,修改Scheme的名字,這裏並非必須,修改是爲了更加方便識別;

4.爲了區別不同的Target,增加預定義宏

配置OC工程:Build Settings -> Preprocessor Macros

配置Swift工程:Build Settings -> Other Swift Flags

理解-D用法:

  1. swiftc編譯器中,需要添加一個-Doption,代表將條件編譯標誌標記爲true
  2. 至於-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,在這裏可以看到已經存在的DebugRelease等配置。點擊“+”,可以在這裏增加新的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配置文件:

  1. .xcconfig配置文件,可以幫助我們以文件的形式配置build settings裏的內容;
  2. .xcconfig的文件的內容,是以key-value形式構成的;
  3. 增加.xcconfig文件後,依然可以繼續在build settings裏增加配置項目,並不會覆蓋;
1.查看配置文件

其實,若使用Cocoapods管理第三方庫,就已經自動生成了DebugRelease配置文件。

查看配置:Xcode -> PROJECT -> info -> Configurations

2.自定義配置文件
  1. Commd +N -> 搜索Configuration Setting File,保存名稱以"目錄名-App名.環境"爲格式, 如"Config-TestProject.debug";
  2. .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 FlagsHeader 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多環境
  1. 在不同的.xcconfig定義不同的HOST_URL,並以類似上文的步驟在info.plist中增加配置;
  2. 切換到不同的configration下運行項目,將會得到不同的HOST_URL

參考鏈接

  1. 本文測試Demo地址
  2. iOS多Target開發相似App
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章