XCode で動作環境に応じて API の URL などの設定を変更する
OSX, iOS アプリでも Rails の RAILS_ENV のように、動作環境に応じて値を変えたいという時があります。 この記事では、アプリから利用する Web API の URL を動作環境に応じて切り替えるのを例に、そのやり方を説明します。執筆時の開発環境は下記のとおりです。
- XCode: Version 7.2
- Swift: version 2.1.1
1. Build Configuration を作成する #
PROJECT -> Info -> Configurations に、動作環境の分だけビルド設定を追加します。例えば、ローカル環境を対象としたビルド設定を追加したいときは、Debug Local と Release Local を追加します。追加するときは、それぞれ、元からある Debug と Release をコピーすると良いでしょう。
2. Scheme を作成、編集する #
Manage Schemes から、動作環境の分だけ Scheme を作成します。また、作成した Scheme それぞれをダブルクリックで編集し、ビルド設定を 1. で作成したものに変更します。例えば、ローカル環境用の Scheme として、AppLocal を作成したら、そのビルド設定は Debug Local および Release Local に設定しておきます。
3. コンパイラの設定を変更する #
Scheme の作成後は、ソース中で環境ごとに条件分岐ができるように、コンパイラの設定を変更します。PROJECT -> Build Settings 内をいじります。
Objective-C を使う場合は Apple LLVM 7.0 - Preprocessing -> Preprocessor Macros の値を変えます。各動作環境が判別できるように、適当な変数を定義すると良いです。今回の例だと、Debug Local と Release Local に LOCAL=1 を設定します。
Swift を使う場合は Swift Compiler - Custom Flags -> Other Swift Flags の値を変えます。 -D <flag>
の形式で <flag>
を true
にできるようなので、そのように書きます。今回の例だと -D LOCAL
を追加すると良いです。また、複数の値を設定する場合は -D DEBUG -D LOCAL
のように書くことができます。
Swift の方にはなぜか DEBUG
の値が設定されていないため、ついでに設定しておくと良いと思います。
4. Conditional compilation statement を書く #
Conditional compilation statement で条件分岐させて、開発環境ごとに異なる値を変数に入れてやります。
Objective-C の場合は以下のように書きます。
#ifdef LOCAL
NSString * const kAPIBase = @"http://localhost.example.com/api/";
#else
NSString * const kAPIBase = @"http://production.example.com/api/";
#endif
Swift の場合は以下のように書きます。
#if LOCAL
let kAPIBase = "http://localhost.example.com/api/"
#else
let kAPIBase = "http://production.example.com/api/"
#endif