概念:
Project:包含項目所有代碼、資源文件氮采、所有信息殷绍。
Target:對指定代碼和資源文件的具體構(gòu)建方式。
Scheme:對指定的Target的環(huán)境配置鹊漠。
一主到、使用多targets配置環(huán)境
這個章節(jié)請看我分享的文章:最詳細 Xcode的Targets管理項目的公開版本、測試版本躯概、預(yù)發(fā)布版本
這里不多講解
弊端:
1.生成多個info.plist文件
2.配置繁瑣且亂登钥,容易配置遺忘其它targets
3.通過聲明宏的方式,容易寫錯
4.真機測試需要的描述文件等比較多
二娶靡、使用多Scheme配置環(huán)境
正常情況下牧牢,選擇Edit Scheme ...
-> Run
-> Info
只有兩個Build Configuration
可以選擇(Debug/Release)
這個Build Configuration
是對應(yīng)于 PROJECT
里的 Info
-> Configuration
的
于是乎可以自定義添加我們所需要的Configuration
環(huán)境
因為當前只有一個Scheme
,當我們運行的時候,每次都來回點到Edit Scheme...
切換環(huán)境塔鳍,這無疑會導致容易操作疏漏的情況伯铣。
于是乎可以創(chuàng)建另外的Scheme
,來配對剛才的配置環(huán)境轮纫,那每次選擇環(huán)境的時候腔寡,只需要選擇對應(yīng)的Scheme
就可以了:
此時就可以選擇對應(yīng)的Scheme
去到Edit Scheme...
配對它對應(yīng)的配置環(huán)境了
那如果要區(qū)分環(huán)境去定義不同的 主機hostUrl
呢?我們通過Add User-Defined Setting
蜡感,自定義一個參數(shù)我起名為HOST_URL
蹬蚁,它自動會分配三個環(huán)境,依次填入自己的主機域名即可(下圖我做舉例用)郑兴。
通過定義了這個自定義參數(shù)犀斋,要如何讀取出來呢?通過在Info.plist
去聲明
訪問HOST_URL
就是讀取Info.plist
// Swift
let mainBundle = Bundle.main
let identifer = mainBundle.bundleIdentifier
let info = mainBundle.infoDictionary
let CFBundleName = mainBundle.object(forInfoDictionaryKey: "CFBundleName")
let HOST_URL = mainBundle.object(forInfoDictionaryKey: "HOST_URL")
print("[identifer]:\(identifer!)")
print("[info]:\(info!)")
print("[CFBundleName]:\(CFBundleName!)")
print("[HOST_URL]: \(HOST_URL!)")
// OC
NSString *path = [NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"];
NSDictionary *infoDic = [[NSDictionary alloc] initWithContentsOfFile:path];
NSLog(@"%@", infoDic[@"HOST_URL"]);
在Building Settings
里所有的參數(shù)都會分三個不同的環(huán)境情连,這就意味著可以設(shè)置不一樣的Icons叽粹、圖標、名稱等等...
弊端:在Building Settings
里可能會不斷地去找對應(yīng)的配置然后三個環(huán)境不斷地配置却舀,不方便虫几。
三、使用 Scheme + Configurations 配置(推薦)
本文僅做操作教學挽拔,對.xcconfig
一點都不懂的同學可以看這里:Swift進階-工程化實踐(一)辆脸。
在上面demo的基礎(chǔ)上,找到Build Settings
-> User-Defined
螃诅,將之前自定義個HOST_URL
刪掉
接下來新建三個.xcconfig文件啡氢,命名規(guī)則 目錄-項目名.環(huán)境.xcconfig
讓.xcconfig
生效,配置到對應(yīng)的Configuration
下
生效后可以在Build Settings
中看到這個配置了
附上demo
喜歡的老鐵术裸,點個??
適配好多環(huán)境工程后仍存在一些問題的
問題一:
在我們沒有配置xcconfig
文件的工程倘是,通過Cocoapods
導入第三方庫 $ pod install
后,我們的工程會自動配置成默認生效是使用了Pods-ProjectName.Debug.xcconfig
和 ProjectName.Debug.xcconfig
這兩個環(huán)境的xcconfig袭艺,那我們自定義的xcconfig就沒法生效了搀崭。
解決問題一的方法:
在我們自定義的xcconfig中去導入Pods-ProjectName.Debug.xcconfig
xcconfig生效的地方設(shè)置成我們自定義的xcconfig文件即可。
問題二:
比如我們用Cocoapods
導入第三方庫AFNetworking
猾编,在自定義的Config-SchemeProject.Debug.xcconfig
里有這樣一句
OTHER_LDFLAGS = -framework "AFNetworking"
而Cocoapods
生成的xcconfig里也會有同一個設(shè)置值并且還有其它參數(shù)呢:
最后生效的只有我們自定義的xcconfig (解決完問題一的情況)瘤睹,而Cocoapods
的OTHER_LDFLAGS
的其它參數(shù)并沒有生效了
解決問題的的方法:
在自定義的xcconfig聲明參數(shù)錢加上 $(inherited)
即可。 $(inherited)
是繼承的意思答倡。
OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"