通過配置 Xcode 的設定選項實現 Swift 專案中 API 環境快捷切換

weixin_34124651發表於2016-07-28

原文: 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 標籤中新增如下的設定變數,以實現快捷切換伺服器地址,具體操作如下:

1306435-9d293d3fa697b1e1.png
設定 Xcode 中 Project 的 Configurations

我通常有開發和釋出兩套配置,因為我喜歡通過修改很少量的程式碼的方式來區分開發版本和提交到 App Store 的版本。如此以來,我能方便的關閉打點統計等只為 App Store 版本所準備的功能。為此在 Target 的 Build 設定裡,新增一個新的自定義設定,我把它命名為MY_API_BASE_URL_ENDPOINT
1306435-0e626214dbab211e.png
自定義變數的名字,來標明 Build 用途

上圖中展現了我們將會在執行時設定和使用的環境變數。不過我們還不能在 Swift 裡像使用環境變數那樣使用這些自定義變數。我們需要將這些變數鍵值化並存入 Info.plist 檔案,像下面這樣:![Alt text]
1306435-ec03a14b65a08248.png
鍵值化存入Info.plist 中

至此,你可以像下面這樣簡單的訪問你所設定的變數:

let env = NSBundle.mainBundle().infoDictionary![“MY_API_BASE_URL_ENDPOINT”] as! String

讓我們蕩起雙槳更進一步

我喜歡在 Debug 模式下有更高的靈活性,以便於我能夠在任何時間切換我的 API 。為了達到這種目的,我們可以新增 Swift 編譯識別符號以便於我們能在程式碼中使用巨集定義指令。我尤其喜歡使用一個巨集定義來區分 Debug 和 App Store 兩種編譯模式,具體操作如下:


1306435-02aabb8f8c4d2673.png
設定 Swift 的編譯器標示符

現在我們有能力在 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 設定不同的包名,具體操作如下:

1306435-ae0de2da56802635.png
設定包名

然後,每一個 App 會在執行時顯示不同的名字,測試員再也不會搞糊塗了:


1306435-e9453d770d2c3268.png
定義不同 Build 用途所需的 Scheme

well Done , 搞完這些設定會為你節省很多時間,希望可以幫到你哦!祝你少 Bug。

相關文章