本番・ステージング・開発などの環境設定を美しく切り替える方法
Objective-C時代のプロプロセッサマクロを踏襲した方法
はじめに
プロジェクトでは、往々にして開発環境とステージング環境、本番環境のように、動作環境を変える必要があります。特に通信など外部連携が関わる場合には、接続先を変えたりします。
そこでプログラムでif文(ifdef文)を書くことなく、開発者がビルド時に意識することなく、環境に応じたプロダクトができて欲しいものです。
ここでは従来Objective-Cでのスマートな設定方法を振り返りつつ、Swiftで踏襲する方法を説明します。
Objective-C時代の方法
Xcode6より前にプロジェクトを新規作成するときには、pchファイルが自動生成され、そこにプリプロセッサマクロの定義などを記述する習慣がありました。(Xcode6以降は手動で設定する必要がありました)
それを応用し、環境ごとに変わるdefine変数もここで定義するようになりました。
ターゲットを環境ごとに分けた具体例で説明します。
TARGETS:sample, sample-adhoc, sample-stg, sample-dev
とあるターゲットに対応して、configディレクトリ以下に環境ごとのディレクトリを作り、それぞれのpchファイルを配置します。
それぞれに、環境変数をdefine値として記述します。(※図ではAPIの取得先URL)
そして、ターゲット毎の「Build Setting」の「Prefix Header」に対応するpchファイルパスを設定します。
これで本番では本番のURL、ステージングではステージングのURLに自動的に切り替わります。
開発者は切り替えを意識せずにターゲットを変えてビルドすることができるようになりました。
Swiftでの対応方法
Swiftベースのプロジェクトで、上と同じようにしたいと思います。
ターゲットも同じ構成で、pchファイルもそのまま使用できるようSwift用に対応します。
まず、Swiftベースのプロジェクトにおいて、configディレクトリ以下をObjective-Cのときと同じにします。
ターゲット毎の「Build Setting」の「Prefix Header」に対応するpchファイルパスの記述は不要です。
そして、ブリッジファイルを作成します。
ブリッジファイルは、Swiftベースのプロジェクトで、Objective-Cのファイルを追加しようとすると、ダイアログが出て、自動で作成することができます。
ここでは、新規ファイル作成で、クラス作成(Cocoa Touch Class)で、「Language」をObjective-Cに変更して作成しようとしたときに上記のようなダイアログが出ました。
「Create Bridging Header」を選択すると、自動的にブリッジファイルができます。
そして、そのブリッジファイルはターゲットが理解できるように、ターゲットごとの「Build Settings」の「Swift Compiler - General」の「Objective-C Bridging Header」に、今作成されたブリッジファイルのパスが入っています。
確認してみるとよいでしょう。
これを、ターゲットの分だけ用意し、それぞれの「Build Settings」の方にもパスを設定します。
そしてブリッジファイルの中には、該当ターゲットのpchファイルのインポートを宣言します。
#import "PrefixHeader.pch"
developターゲットでは以下のようになります。
さいごに
簡単にObjective-Cの方法を踏襲することができます。
しかしながら、Swiftベースのプロジェクトにおいて、Objective-Cのマクロはもちろん、コードや文化を使うことはAppleの方針的に推奨されません。
一時的な対策と念頭に置いた上での対応とするのがよいかもしれません。
Objective-Cを意識しないでよい場合は、以下が参考になるかと思います。