Xcode で xcconfig ファイルを生成して環境ごとの値を設定する方法
システム開発をしていると、プログラムを QA 環境や本番環境にデプロイする際に、環境に応じて違う設定を使いたいことがあるかと思います。
ここでは、Xcode で環境ごとの設定をするために xcconfig ファイルを生成して設定する方法をご説明します。
Build Configuration と Scheme は追加済の前提ですすめますので、まだの方は「Xcode で環境ごとの設定を管理する方法」の目次に戻って追加・設定してください。
Xcode で xcconfig ファイルを生成する
次は Configuration Settings 用の xcconfig ファイルを作って、環境ごとの値を設定してみましょう。
開発、QA、本番環境用の xcconfig ファイルを生成します。
メニューバーの File > New > File... で iOS の Configuration Settings File を選択し Next をクリックして、Development.xcconfig ファイルを生成します。
同様に、QA.xcconfig、Production.xcconfig ファイルも生成してください。
xcconfig ファイルを configurations に設定する
次に、生成した xcconfig ファイルと configuration を紐付けます。
PROJECT のプロジェクト名をクリックし、Info タブの Configurations のそれぞれの configuration を開き Target の [Based on Configration File] を以下のように設定します。
これで、build schema を変更して実行をすると、schema で設定した build configuration の config ファイルが使われるようになります。
ただ、ビルド設定の優先順位があるので、xcconfig ファイルに書いたからと言って、単純にその値が使われるわけではありません。
詳しくは「Xcode の ビルド設定の優先順位」をご覧ください。
xcconfig ファイルに値を追加して設定する
「Xcode の Project エディタで環境ごとのビルド設定をする」では、Project エディタの Target の Build Settings で、環境に応じた Bundle ID を設定しました。
ここでは、開発、QA、本番の環境ごとに別のアプリ名を xcconfig ファイルを使って設定してみます。
xcconfig ファイルに書く時は、基本的には次のようなフォーマットで設定します。
BUILD_SETTING_KEY = BUILD_SETTING_VALUE
既に定義されているビルド設定を上書きすることもできますし、新しいビルド設定キーを定義して値を設定することもできます。
ただ、既に定義されているビルド設定を上書きする場合、Target の Build Settings のほうが優先順位が高いので、Target の Build Settings で値が設定されている場合はそちらが優先され、ここに書くだけでは上書きされません。
info.plist や Project エディタで $( ) で囲まれているのがビルド設定のキー名です。
例えば、Bundle dispaly name や Bundle name には $(PRODUCT_NAME) が設定されていて、PRODUCT_NAME がキー名です。
ビルド設定のキー名がわからない時は、Quick Help Inspector で確認できます。
または、アシスタントエディタで、Build Settings から xcconfig ファイルにドラッグ&ドロップすることでも確認できます。
PRODUCT_NAME を xcconfig ファイルで設定するのであれば、次のようにできますが、Target の Build Settings で PRODUCT_NAME に $(TARGET_NAME) が設定されているので、そちらが優先されてしまいます。
PRODUCT_NAME = TestApp Dev
今回は新しい APP_NAME というキーを作って、info.plist の Bundle dispaly name と Bundle name を置き換えてしまうことにします。
Development.xcconfig、QA.xcconfig、Production.xcconfig にそれぞれ次の値を設定します。
APP_NAME = TestApp Dev
APP_NAME = TestApp QA
APP_NAME = TestApp
そして、info.plist の Bundle dispaly name と Bundle name を $(APP_NAME) に変更します。
この状態でスキームを変更してシミュレーターで実行すると、前回 Bundle ID も違うものを設定しているので、環境ごとに違うアプリの名前でインストールされると思います。
xcconfig ファイルの値を Swift のコードで取得する
API の URL など、Swift のコードから、xcconfig ファイルの値を取得したいことがあるかもしれません。
そんな時は xcconfig ファイルで作った ビルド設定のキーを info.plist に追加しておくことで取得可能です。
例えば、次のような API_URL というビルド設定を定義します。
Development.xcconfig、QA.xcconfig、Production.xcconfig にそれぞれ次の値を追加します。
API_URL = www.softmoco.com/api-dev
API_URL = www.softmoco.com/api-qa
API_URL = www.softmoco.com/api
https:// も含めたい時は、// 以降はコメントとみなされてしまうので、$() を入れて https:/$()/www.softmoco.com とするなどしてください。
info.plist に API URL という行を追加して、$(API_URL) を設定します。
後は、他の info.plist の値を取得したい時と同じで、次のような感じで取得できます。
let apiURL = Bundle.main.object(forInfoDictionaryKey: "API URL") as? String
テストのために、Label をおいて、apiURL の値を表示してみました。
class ViewController: UIViewController {
@IBOutlet weak var apiURLLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
if let apiURL = Bundle.main.object(forInfoDictionaryKey: "API URL") as? String {
apiURLLabel.text = "https://\(apiURL)"
}
}
}
この状態でスキームを変更してシミュレーターで実行すると、環境に応じた URL が取得できていることがわかります。
以上、Xcode で環境ごとの設定をするために xcconfig ファイルを生成して設定する方法をご説明しました。