原文: Change your API endpoint/environment using Xcode Configurations in Swift
作者:Daniel Galasko ?????? 譯者:米廣
作為一名 iOS 開發者,你的工作往往是與服務端有通信的 App。你可能需要線上線下或者 Dev/ Live 兩套服務器地址,并且這 Dev / OffLine 的地址需要在公司內網里才能用。這時候,你需要為不同開發用途的服務器地址做很多設置。
我們肯定不想每一次切換不同開發目的的服務器地址的時候,需要修改很多代碼。如果你能夠讓同事并發快速的切換服務器地址,你同事肯定給你說『哇,你好厲害』。同時,測試人員可以將 Staging/Dev/Live 不同的 Build 同時運行在同一個設備上。本文中,我將討論如何設置來達到以上目的。全文所用到關鍵技術就是給你不同發布用途的 App 分配不同的包名。「來都來了,往下看看唄。」
將域名設置為一個 Xcode 環境變量
在開始之前,需要在 Xcode 中做一些設置。我們通過在項目的 Info 標簽中添加如下的設置變量,以實現快捷切換服務器地址,具體操作如下:
我通常有開發和發布兩套配置,因為我喜歡通過修改很少量的代碼的方式來區分開發版本和提交到 App Store 的版本。如此以來,我能方便的關閉打點統計等只為 App Store 版本所準備的功能。為此在 Target 的 Build 設置里,添加一個新的自定義設置,我把它命名為MY_API_BASE_URL_ENDPOINT
上圖中展現了我們將會在運行時設置和使用的環境變量。不過我們還不能在 Swift 里像使用環境變量那樣使用這些自定義變量。我們需要將這些變量鍵值化并存入 Info.plist 文件,像下面這樣:![Alt text]
至此,你可以像下面這樣簡單的訪問你所設置的變量:
let env = NSBundle.mainBundle().infoDictionary![“MY_API_BASE_URL_ENDPOINT”] as! String
讓我們蕩起雙槳更進一步
我喜歡在 Debug 模式下有更高的靈活性,以便于我能夠在任何時間切換我的 API 。為了達到這種目的,我們可以添加 Swift 編譯標識符以便于我們能在代碼中使用宏定義指令。我尤其喜歡使用一個宏定義來區分 Debug 和 App Store 兩種編譯模式,具體操作如下:
現在我們有能力在 Debug 模式下修改我們的環境變量了。Bravo!我們能有定義我們環境變量的 Struct 啦:
struct Configuration {
#if DEBUG
enum Environment: String {
case Production = "www.galasko.com"
case Dev = "www.galasko-dev.com"
case Staging = "www.galasko-staging.com"
}
let environment = Environment.Staging.rawValue//we can change this at any time
#else
let environment = NSBundle.mainBundle().infoDictionary!
["MY_API_BASE_URL_ENDPOINT"] as! String
#endif
}
現在,只有在 Debug 模式里才會有我們通過枚舉自定義的調試 API。當訪問任何設置變量時,它會自動使用 Info.plist 里的值作為默認值。
在構建時,我們只需要幾的我們設置變量的值,我們不需要改任何一行代碼就可以實現我們想要的目的。是不是很簡潔高效~。
終極目的
如果你已經讀到了這里,十有八九你會有不同用途的 Build。所以你需要對每一個 Build 設置不同的包名,具體操作如下:
然后,每一個 App 會在運行時顯示不同的名字,測試員再也不會搞糊涂了:
well Done , 搞完這些設置會為你節省很多時間,希望可以幫到你哦!祝你少 Bug。