利用 Macros 和 Custom Flags 來區分開發和正式環境的參數值

法蘭克的 iOS 世界
6 min readJun 1, 2020

--

Got from pexels
Photo by Tranmautritam on Pexels

在實務上,常常需要對開發和正式環境設定不同的參數,比方 API 的 URL、需不需要印 Log 等等。雖然說,這些事情可以手動調整,但是人非聖賢,難免會有失手的時侯🙃。透過 Xcode 的 Macros(巨集)、Custom Flags 的定義,可以輕鬆幫我們避免諸如此類的問題發生。

在開始前,法蘭克必須創建一個專案來模擬主題的情境。它有兩個 Targets,一個是開發環境(Staging),另一個則是正式環境(Production),詳細創建的過程就不在此多加贅述,避免偏離了今天的主題。

兩個 Targets,一個是開發環境(Staging),另一個則是正式環境(Production)

ViewController 裡有一個條件式判斷,如果是測試環境(Staging)則取得測試環境的 URL,反之,則取得正式環境(Production)的 URL。

如果是測試環境(Staging)則取得測試環境的 API URL,反之,則取得正式環境(Production)的 URL

問題來了,要怎麼依照不同的 Target 取到相對應的 URL 呢?讓我們開始進入今天的主題吧😀

要解決上面的問題,有兩個方案。

  1. 使用 Preprocessor Macros + Other Swift Flags。
  2. 使用 Xcode8 以後才有的 Active Compilation Conditions。

使用 Preprocessor Macros + Other Swift Flags

  • 切換到 Staging Target → Build Setting → 搜尋 Macros → Preprocessor Macros設定 STAGING=1
Staging Target → Build Setting → 搜尋 Macros → Preprocessor Macros設定 STAGING=1
  • 同樣的,切換到 Production Target → Build Setting → 搜尋 Macros → Preprocessor Macros設定 STAGING=0
Production Target → Build Setting → 搜尋 Macros → Preprocessor Macros設定 STAGING=0
  • 再度切回 Staging Target → Build Setting → 搜尋 custom flags → Other Swift Flags 設定 -DSTAGING。

-D一定得額外加上,否則此 Flag 則不會生效

Staging Target → Build Setting → 搜尋 custom flags → Other Swift Flags 設定 -DSTAGING
  • Production Target 則無須做任何設定。
Production Target 無須設定
  • 切換至 Staging Scheme,並試著啟動模擬器,看看結果是不是取得 Staging 的 URL。
Staging 的 URL
  • 切換至 Production Scheme,並試著啟動模擬器,看看結果是不是取得 Production 的 URL。
Production 的 URL

使用 Xcode8 以後才有的 Active Compilation Conditions

  • 切換到 Staging Target → Build Setting → 搜尋 Custom Flags → Active Compilation Conditions 設定 STAGING
Staging Target → Build Setting → 搜尋 Custom Flags → Active Compilation Conditions 設定 STAGING
  • 切換到 Production Target → Build Setting → 搜尋 Custom Flags → Active Compilation Conditions 設定 PRODUCTION
Production Target → Build Setting → 搜尋 Custom Flags → Active Compilation Conditions 設定 PRODUCTION
  • 切換至 Staging Scheme,並試著啟動模擬器,看看結果是不是取得 Staging 的 URL
  • 切換至 Production Scheme,並試著啟動模擬器,看看結果是不是取得 Production 的 URL

以上,相對於使用 Preprocessor Macros + Other Swift Flags,Active Compilation Conditions 來得更為容易,法蘭克更推薦此做法

如果您喜歡我的文章,請多按幾下「拍手」給我鼓勵,或是按「follow」讓我持續提供好文章給您。

--

--